我必须创建一些表单,用户可以在其中为某些数据创建多个测试。如果用户想要验证数据,他必须选中相应行和列中的复选框进行测试,然后单击标题为“验证测试”的按钮。如果用户想添加新的测试(即Test2),他必须按“添加测试”按钮。
所有数据都存储在 DataTable (dtTests) 中,并由 GridView (dgvTests) 在 aspx 页面上显示。
我的问题是,我怎样才能获得每个复选框的检查值?
示例网站: 在示例中,用户添加两个测试(查看图片:http: //i.stack.imgur.com/cR8l5.jpg)。
- 在 Test1 中,他想验证年份:1990、1993、1999
- 在 Test2 中,他想验证年份:1990、1993、1998、1999
dtTests 中的新测试列:
DataColumn dc = new DataColumn("Test" + i.ToString())
{
DataType = typeof(Boolean),
ReadOnly = false
};
dtTests.Column.Add(dc);
我以这种方式将新的 TestX 列添加到 gridView:
TemplateField cbxTest = new TemplateField();
cbxTest.HeaderTemplate = new CheckBoxTemplate(DataControlRowType.Header, "Test" + i.ToString(), "Test" + i.ToString());
cbxTest.ItemTemplate = new CheckBoxTemplate(DataControlRowType.DataRow, "Test" + i.ToString(), "Test" + i.ToString());
dgvTests.Columns.Add(cbxTest);
这是 CheckBoxTemplate 的类:
public class CheckBoxTemplate : ITemplate
{
private DataControlRowType templateType;
private string columnName;
private string bindName;
public CheckBoxTemplate(DataControlRowType _type, string _colName, string _bindName)
{
templateType = _type;
columnName = _colName;
bindName = _bindName;
}
public void InstantiateIn(Control container)
{
switch (templateType)
{
case DataControlRowType.Header:
Literal lc = new Literal() { Text = String.Format("<b>{0}</b>", columnName) };
container.Controls.Add(lc);
break;
case DataControlRowType.DataRow:
CheckBox cbx = new CheckBox();
cbx.DataBinding += new EventHandler(this.cbx_DataBinding);
container.Controls.Add(cbx);
break;
default:
break;
}
}
private void cbx_DataBinding(Object sender, EventArgs e)
{
CheckBox cbx = (CheckBox)sender;
GridViewRow row = (GridViewRow)cbx.NamingContainer;
cbx.Checked = Convert.ToBoolean(DataBinder.Eval(row.DataItem, bindName).ToString());
}
}