C# 选中\u GridView行中程序生成复选框的更改事件

C# 选中\u GridView行中程序生成复选框的更改事件,c#,asp.net,gridview,checkbox,oncheckedchanged,C#,Asp.net,Gridview,Checkbox,Oncheckedchanged,我有一个GridView,它保存用户数据。调用Page\u Load方法时,我使用DataTable获取数据,然后将其绑定到GridView。在每行的末尾,我添加了一个复选框。此CB用作用户要编辑的实体的指针 我的问题是复选框的Check\u Changed事件。如果控件是以编程方式生成的,我不知道如何添加处理程序。我还需要行的索引(也可以使用字段值,但列标题和列本身是隐藏的) 我已经尝试从这里实现该处理程序,但它没有给我任何索引参数,因此程序无法确定选中复选框的行 TableCell c

我有一个
GridView
,它保存用户数据。调用
Page\u Load
方法时,我使用
DataTable
获取数据,然后将其绑定到
GridView
。在每行的末尾,我添加了一个
复选框
。此CB用作用户要编辑的实体的指针

我的问题是复选框的
Check\u Changed
事件。如果控件是以编程方式生成的,我不知道如何添加处理程序。我还需要行的索引(也可以使用字段值,但列标题和列本身是隐藏的)

我已经尝试从这里实现该处理程序,但它没有给我任何索引参数,因此程序无法确定选中复选框的行

   TableCell cell = new TableCell();
   CheckBox box = new CheckBox();
   box.Check += new EventHandler(Checked_Changed);
   cell.Controls.Add(box);
   gvr.Cells.Add(cell);
对不起,我马上就要开车回家了,所以这只是一个快速的回答。 也许你必须在方框后更正事件。“事件”

对不起,我马上就要开车回家了,所以这只是一个快速的回答。 可能您必须更正框后的事件。“事件”…

受保护的无效页面加载(对象发送方,事件参数e)
{
列表名称=新列表();
名称。添加(“Jhonatas”);
this.GridView1.DataSource=名称;
this.GridView1.DataBind();
foreach(GridView1.Rows中的GridViewRow gvr)
{
//为每行添加复选框
TableCell=新的TableCell();
复选框=新复选框();
box.AutoPostBack=true;
box.ID=gvr.Cells[0]。文本;
box.CheckedChanged+=新事件处理程序(box\u CheckedChanged);
单元格.控件.添加(框);
gvr.Cells.Add(单元格);
}
}
无效框\u CheckedChanged(对象发送方,事件参数e)
{
字符串测试=“确定”;
}
受保护的无效页面\u加载(对象发送方,事件参数e)
{
列表名称=新列表();
名称。添加(“Jhonatas”);
this.GridView1.DataSource=名称;
this.GridView1.DataBind();
foreach(GridView1.Rows中的GridViewRow gvr)
{
//为每行添加复选框
TableCell=新的TableCell();
复选框=新复选框();
box.AutoPostBack=true;
box.ID=gvr.Cells[0]。文本;
box.CheckedChanged+=新事件处理程序(box\u CheckedChanged);
单元格.控件.添加(框);
gvr.Cells.Add(单元格);
}
}
无效框\u CheckedChanged(对象发送方,事件参数e)
{
字符串测试=“确定”;
}

您应该这样做:

首先,在生成复选框时

       CheckBox box = new CheckBox();
       box.AutoPostBack=true;
根据需要为复选框提供id

       box.ID=Convert.toString(Session["Count"]);
在会话中加载页面时,请初始化“计数”。 每次添加新复选框时,也要增加“计数”

其次,为动态复选框定义事件处理程序,如下所示:

       box.CheckedChange += MyHandler;
并定义MyHandler

       protected void MyHandler(object sender, EventArgs e)
        {
             //Do some stuff
        }
现在,您可以获得在MyHandler中触发事件的复选框的id,它实际上是行号

          CheckBox cb = (CheckBox)sender;
          string id = cb.ID;

你应该走这条路:

首先,在生成复选框时

       CheckBox box = new CheckBox();
       box.AutoPostBack=true;
根据需要为复选框提供id

       box.ID=Convert.toString(Session["Count"]);
在会话中加载页面时,请初始化“计数”。 每次添加新复选框时,也要增加“计数”

其次,为动态复选框定义事件处理程序,如下所示:

       box.CheckedChange += MyHandler;
并定义MyHandler

       protected void MyHandler(object sender, EventArgs e)
        {
             //Do some stuff
        }
现在,您可以获得在MyHandler中触发事件的复选框的id,它实际上是行号

          CheckBox cb = (CheckBox)sender;
          string id = cb.ID;

我已经试过了,但是我没有得到复选框所在行的索引。我有多行,每一行都有一个复选框。如果一个复选框被选中,其他复选框应该被取消选中。我已经尝试过了,但是我没有得到复选框所在行的索引。我有多行,每一行都有一个复选框。如果一个被选中,其他的应该被选中。我如何在这里检查该行的索引?我需要得到这个,以便能够确定哪个复选框被选中,哪个不被选中…您的事件正在被激发?我如何在这里检查该行的索引?我需要得到这个,以便能够确定哪个复选框被选中,哪个不被选中…您的事件正在被激发?好的,当我这样做时,事件正在被激发,但我总是得到相同的ID“ctl00”…感谢稍加修改,我成功地使它工作。我刚刚添加了一个隐藏字段,其中包含数据集的ID。然后我只是用它来指代复选框。好的,当我这样做时,事件被触发,但我总是得到相同的ID“ctl00”…谢谢,经过一点修改,我成功地使它工作了。我刚刚添加了一个隐藏字段,其中包含数据集的ID。然后我用它来指代复选框。