[DevExpress Support Team: CLONED FROM Q252956: ITemplate - different templates]
Hi,
I have similar issue, but using the GridViewDataItemTemplateContainer. How do you iterate every rows and get the value? The new control returns null for me. I really appreciate your help on this.
Thanks,
Phong
public class CustomTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
AddControls(container);
}
protected void AddControls(Control container)
{
GridViewDataItemTemplateContainer editingContainer = (GridViewDataItemTemplateContainer)container;
ASPxGridView gv = (ASPxGridView)editingContainer.Grid;
int key = Convert.ToInt16(editingContainer.KeyValue);
string dataType = Convert.ToString(gv.GetRowValuesByKeyValue(key, "DataType"));
switch (dataType.ToLower())
{
case "text":
AddTextBox(container);
break;
case "date":
AddDateEdit(container);
break;
case "boolean":
AddCheckBox(container);
break;
case "integer":
AddSpinEdit(container);
break;
case "decimal":
AddTextBox(container);
break;
}
}
protected void AddTextBox(Control container)
{
ASPxTextBox tb = new ASPxTextBox();
tb.ID = "edValue";
tb.ValidationSettings.ValidateOnLeave = true;
container.Controls.Add(tb);
}
protected void AddDateEdit(Control container)
{
ASPxDateEdit de = new ASPxDateEdit();
de.ID = "edValue";
container.Controls.Add(de);
}
protected void AddCheckBox(Control container)
{
ASPxCheckBox cb = new ASPxCheckBox();
cb.ID = "edValue";
cb.ValueUnchecked = false;
cb.ValueChecked = true;
container.Controls.Add(cb);
}
protected void AddSpinEdit(Control container)
{
ASPxSpinEdit tb = new ASPxSpinEdit();
tb.ID = "edValue";
tb.ValidationSettings.ValidateOnLeave = true;
container.Controls.Add(tb);
}
}
protected void gvItemAttribute_CellEditorInitialize(object sender, EventArgs e)
{
ASPxGridView gvItemAttribute = (ASPxGridView)sender;
((GridViewDataColumn)gvItemAttribute.Columns["AttributeValue"]).DataItemTemplate = new CustomTemplate();
}
protected void btnSaveChanges_Click(object sender, EventArgs e)
{
try
{
for (int i = 0; i <= (gvItemAttribute.VisibleRowCount - 1); i++)
{
var edDatatype = gvItemAttribute.GetRowValues(i, "DataType").ToString();
var edValue = gvItemAttribute.GetRowValues(i, "edValue"); //always return null
}
}
catch (Exception ex)
{
}
}
Hello Phong,
If you need to access the control inside the Data Item template, it's necessary to use the FindRowCellTemplateControl method. However, your task is not completely clear to me. Would you please describe your task in greater detail? If you need to edit several rows in ASPxGridView, it's better to use Batch Editing and Updating mode.
Regards,
Vova
<%@ Register Assembly="DevExpress.Web.v18.1, Version=18.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web" TagPrefix="dx" %>
<asp:Content ID="Content2" ContentPlaceHolderID="cphMain" runat="server">
<dx:ASPxGridView ID="gvItemAttribute" runat="server" OnInit="gvItemAttribute_CellEditorInitialize" KeyFieldName="AttributeNameId" Width="700">
<SettingsEditing Mode="EditForm" />
<Columns>
<dx:GridViewDataTextColumn FieldName="DataType" VisibleIndex="1" />
<dx:GridViewDataTextColumn FieldName="AttributeValue" VisibleIndex="3" />
</Columns>
</dx:ASPxGridView>
<div style="padding-bottom: 20px;">
<dx:ASPxButton ID="btnSaveChanges" runat="server" Text="Save Changes" OnClick="btnSaveChanges_Click"></dx:ASPxButton>
</div>
<asp:SqlDataSource ID="dsAttributeDataType" runat="server" ConnectionString="<%$ ConnectionStrings:Product4dbConnectionString %>" SelectCommand="SELECT Id, Name FROM [tblPDItemAttributeDataType]"></asp:SqlDataSource>
</asp:Content>
public partial class DynamicControls : AjaxAppPage
{
private DynamicAttribute _Entity = null;
protected void Page_Load(object sender, EventArgs e)
{
if (_Entity == null) _Entity = new DynamicAttribute(connection_string);
gvItemAttribute.DataSource = _Entity.getDynamicAttributes(0);
gvItemAttribute.DataBind();
}
protected void btnSaveChanges_Click(object sender, EventArgs e)
{
try
{
for (int i = 0; i <= (gvItemAttribute.VisibleRowCount - 1); i++)
{
var datatype = gvItemAttribute.GetRowValues(i, "DataType").ToString();
var attribute_value = gvItemAttribute.GetRowValuesByKeyValue(i, "AttributeValue");
}
}
catch (Exception ex)
{
}
}
protected void gvItemAttribute_CellEditorInitialize(object sender, EventArgs e)
{
ASPxGridView gvItemAttribute = (ASPxGridView)sender;
((GridViewDataColumn)gvItemAttribute.Columns["AttributeValue"]).DataItemTemplate = new CustomTemplate();
}
}
public class CustomTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
AddControls(container);
}
protected void AddControls(Control container)
{
GridViewDataItemTemplateContainer editingContainer = (GridViewDataItemTemplateContainer)container;
ASPxGridView gv = (ASPxGridView)editingContainer.Grid;
int key = Convert.ToInt16(editingContainer.KeyValue);
string dataType = Convert.ToString(gv.GetRowValuesByKeyValue(key, "DataType"));
switch (dataType.ToLower())
{
case "text":
AddTextBox(container);
break;
case "date":
AddDateEdit(container);
break;
case "boolean":
AddCheckBox(container);
break;
case "integer":
AddSpinEdit(container);
break;
case "decimal":
AddTextBox(container);
break;
}
}
protected void AddTextBox(Control container)
{
ASPxTextBox tb = new ASPxTextBox();
tb.ID = "edTextBoxValue";
container.Controls.Add(tb);
}
protected void AddDateEdit(Control container)
{
ASPxDateEdit de = new ASPxDateEdit();
de.ID = "edDateEditValue";
container.Controls.Add(de);
}
protected void AddCheckBox(Control container)
{
ASPxCheckBox cb = new ASPxCheckBox();
cb.ID = "edCheckBoxValue";
cb.ValueUnchecked = false;
cb.ValueChecked = true;
container.Controls.Add(cb);
}
protected void AddSpinEdit(Control container)
{
ASPxSpinEdit tb = new ASPxSpinEdit();
tb.ID = "edSpinEditValue";
container.Controls.Add(tb);
}
}
Thanks for your quick reply. I am trying to iterate thru the gridview and get the values of each fields.
for (int i = 0; i <= (gvItemAttribute.VisibleRowCount - 1); i++)
{
var datatype = gvItemAttribute.GetRowValues(i, "DataType").ToString(); //works: return value
var attribute_value = gvItemAttribute.GetRowValuesByKeyValue(i, "AttributeValue"); //error: return null
}
I have tried BatchEditing, but dynamic controls could not load on init