如何将GridBox中的CheckBoxes绑定到源DataTable?

时间:2013-08-28 13:47:07

标签: c# asp.net gridview

我必须创建一些表单,用户可以在其中为某些数据创建多个测试。如果用户想要验证数据,他必须在适当的行和列中检查Checkbox以进行测试,然后单击标题为“验证测试”的按钮。如果用户想要添加新测试(即Test2),他必须按“添加测试”按钮。

所有数据都存储在DataTable(dtTests)中,并由aspView页面上的GridView(dgvTests)显示。

我的问题是,如何为每个复选框获取检查值?

示例网站: 在示例中,用户添加两个测试(查看图像: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);

我以这种方式向gridView添加新的TestX列:

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());
        }
    }

1 个答案:

答案 0 :(得分:0)

以下是如何进行操作,首先为您的复选框cbx.ID = "cbxDoTest分配一个ID。

然后添加RowCommand事件处理程序,该处理程序将在您单击验证测试按钮时触发。在这里,您需要遍历e.Row.Cells属性,如果单元格属于测试列,则对复选框控件(Checkbox cbx = e.Row.Cell[i].FindControl("cbxDoTest");)进行搜索,然后检查cbx.Checked是真还是假。 / p>

我编写了流程以及如何从头开始编写,因此请仔细检查方法/属性名称。