Hello,
I am trying to create a Template for User to do batch editing in ListView.
And I handled DateTime Field / number / ENUM / string fields successfully,
but now I want to create ASPxLookupPropertyEditor for Reference fields, but I don't know how to do this.
Could you help giving me some hint? My template code are as follow:
/// <summary>
/// Defines the behavior for populating a templated ASP.NET control in Detail (Data Item) of ListView
/// </summary>
public class fcxDataRowTemplate : ITemplate
{
#region Constant Variables
const string CONTROL_ID_FOR_OID = "lblOid";
const string CONTROL_ID_FOR_VALUE = "txbDisplayValue";
#endregion
#region Local Variables
private ObjectSpace objectSpace;
private Type objectType;
private int rowCount;
public ASPxTextBoxBase ctlDisplayValue;
#endregion
#region Constructors
public fcxDataRowTemplate(ObjectSpace objectSpace, Type objectType)
{
this.objectSpace = objectSpace;
this.objectType = objectType;
}
#endregion
#region ITemplate Methods
void ITemplate.InstantiateIn(Control container)
{
GridViewDataItemTemplateContainer gridViewContainer = container as GridViewDataItemTemplateContainer;
WebDataSource dataSource = gridViewContainer.Grid.DataSource as WebDataSource;
ProxyCollection collection = dataSource.Collection as ProxyCollection;
//Create Table for container of templated controls
Table table = CreateControlsinTable(gridViewContainer);
//Add Table to controls
container.Controls.Add(table);
if (collection != null)
{
//Count the number of object in current page of list view
rowCount = collection.Count;
}
}
#endregion
#region fcxDetailsTemplate Methods
private Table CreateControlsinTable(GridViewDataItemTemplateContainer gridViewContainer)
{
//object o = gridViewContainer.DataItem;
//Create ASPxLabel control to store the Oid of object
ASPxLabel lblOid = RenderHelper.CreateASPxLabel();
lblOid.ID = CONTROL_ID_FOR_OID;
lblOid.Text = gridViewContainer.KeyValue.ToString();
lblOid.Visible = false;
//Create control by corresponding type to store the member value of object
CreateControlForObjectMember(gridViewContainer.Column.FieldName);
ctlDisplayValue.ID = CONTROL_ID_FOR_VALUE;
ctlDisplayValue.Text = gridViewContainer.Text;
//Create Table for container of templated controls
Table table = new Table();
table.Rows.Add(new TableRow());
table.Rows[0].Cells.Add(new TableCell());
table.Rows[0].Cells.Add(new TableCell());
table.Rows[0].Cells[0].Controls.Add(lblOid);
table.Rows[0].Cells[1].Controls.Add(ctlDisplayValue);
//To prevent CallBack from being sent
table.Attributes["onclick"] = RenderHelper.EventCancelBubbleCommand;
return table;
}
private void CreateControlForObjectMember(string memberType)
{
//IMemberInfo memberInfo = XafTypesInfo.Instance.FindTypeInfo(objectType).FindMember(gridViewContainer.Column.FieldName);
IMemberInfo memberInfo = XafTypesInfo.Instance.FindTypeInfo(objectType).FindMember(memberType);
if (memberType.Contains("."))
{
memberInfo = XafTypesInfo.Instance.FindTypeInfo(objectType).FindMember(memberType.Split('.')[0]);
}
if (memberInfo.MemberType == typeof(DateTime))
{
ctlDisplayValue = RenderHelper.CreateASPxDateEdit();
}
else if ((memberInfo.MemberType == typeof(decimal)) || (memberInfo.MemberType == typeof(int)) || (memberInfo.MemberType == typeof(double)))
{
ctlDisplayValue = RenderHelper.CreateASPxSpinEdit();
}
else if (memberInfo.MemberType.BaseType.Name == "Enum")
{
ctlDisplayValue = RenderHelper.CreateASPxComboBox();
((ASPxComboBox)ctlDisplayValue).DataSource = Enum.GetNames(memberInfo.MemberType);
((ASPxComboBox)ctlDisplayValue).DataBind();
}
else if (memberInfo.MemberType.BaseType == typeof(BaseObject))
{
//I would like to create a ASPxLookupPropertyEditor here
}
else
{
ctlDisplayValue = RenderHelper.CreateASPxTextBox();
}
}
#endregion
}
Thank you very much for your help!