I am trying to get a two-way binding that works with simple GridView columns with dynamic templates. The template code is as follows:
public class GridViewCheckboxTemplate : ITemplate
{
private DataControlRowType dcrType;
private string strColumnName;
private string strDataType;
public GridViewCheckboxTemplate(DataControlRowType dcrType, string strColumnName, string strDataType)
{
this.dcrType = dcrType;
this.strColumnName = strColumnName;
this.strDataType = strDataType;
}
public void InstantiateIn(System.Web.UI.Control cContainer)
{
DataControlFieldCell dcfCell = null;
switch(dcrType)
{
case DataControlRowType.Header:
cContainer.Controls.Add(new Literal()
{
Text ="<b>" + strColumnName + "</b>"
});
break;
case DataControlRowType.DataRow:
switch(strDataType)
{
case "String":
Label lData = new Label();
lData.DataBinding += new EventHandler(lData_DataBinding);
cContainer.Controls.Add(lData);
break;
case "Boolean":
CheckBox cbData = new CheckBox();
cbData.DataBinding += new EventHandler(cbData_DataBinding);
cContainer.Controls.Add(cbData);
break;
}
break;
default:
break;
}
}
private void lData_DataBinding(object sender, EventArgs e)
{
Label lData = (Label)sender;
GridViewRow gvRow = (GridViewRow)lData.NamingContainer;
lData.Text = DataBinder.Eval(gvRow.DataItem, strColumnName).ToString();
}
private void cbData_DataBinding(object sender, EventArgs e)
{
CheckBox cbData = (CheckBox)sender;
GridViewRow gvRow = (GridViewRow)cbData.NamingContainer;
cbData.Checked = Boolean.TrueString.Equals(DataBinder.Eval(gvRow.DataItem, strColumnName).ToString(), StringComparison.CurrentCultureIgnoreCase);
}
}
The code for creating the DataTable is as follows:
DataTable dtData = new DataTable();
dtData.Columns.Add(new DataColumn("id", typeof(Int32)) { AutoIncrement = true });
dtData.Columns.Add("name", typeof(string));
for(int i = 0; i < 5; i++)
{
dtData.Columns.Add(new DataColumn("day-" + i, typeof(Boolean)));
}
foreach(Person pPerson in PersonManager.Instance.GetList())
{
DataRow drRow = dtData.NewRow();
drRow["name"] = pPerson.Name;
drRow["day-0"] = true;
drRow["day-1"] = true;
drRow["day-2"] = false;
drRow["day-3"] = false;
drRow["day-4"] = false;
dtData.Rows.Add(drRow);
}
for(int i = 0; i < dtData.Columns.Count; i++)
{
if(dtData.Columns[i].ColumnName != "id")
{
TemplateField tfField = new TemplateField();
tfField.ItemTemplate = new GridViewCheckboxTemplate(DataControlRowType.DataRow, dtData.Columns[i].ColumnName, dtData.Columns[i].DataType.Name);
tfField.HeaderTemplate = new GridViewCheckboxTemplate(DataControlRowType.Header, dtData.Columns[i].ColumnName, dtData.Columns[i].DataType.Name);
this.gvSessions.Columns.Add(tfField);
}
}
this.gvSessions.DataSource = dtData;
this.gvSessions.DataBind();
A gridview is defined on an asp page as follows:
<asp:GridView ID="gvSessions" AutoGenerateColumns="false" BorderWidth="0" BorderStyle="None" Width="100%" runat="server">
</asp:GridView>
This works great and presents a GridView with a row per person with 5 checkboxes in the desired state. The problem is that I need to know about any changes that occur when the user clicks the submit button. Anyway, can I revert the changes to the DataTable?
source
share