【问题标题】:Checked_Change Event of programatically generated Checkbox inside GridView RowGridView Row 中以编程方式生成的复选框的选中更改事件
【发布时间】:2013-05-29 17:21:24
【问题描述】:

我有一个GridView 保存用户数据。当调用Page_Load 方法时,我使用DataTable 获取数据,然后将其绑定到GridView。在每一行的末尾,我添加了一个CheckBox。此 CB 用作用户想要编辑的实体的指针。

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

 foreach (GridViewRow gvr in grdMitgliedsliste.Rows)
 {
       //add checkbox for every row
       TableCell cell = new TableCell();
       CheckBox box = new CheckBox();
       cell.Controls.Add(box);
       gvr.Cells.Add(cell);

       //Hide columns for userid, status, etc. 
       gvr.Cells[0].Visible = false;
       gvr.Cells[3].Visible = false;
       gvr.Cells[4].Visible = false;
       gvr.Cells[5].Visible = false;
       gvr.Cells[8].Visible = false;
       gvr.Cells[9].Visible = false;  
 } 

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

【问题讨论】:

    标签: c# asp.net gridview checkbox oncheckedchanged


    【解决方案1】:
       protected void Page_Load(object sender, EventArgs e)
            {
                List<string> names = new List<string>();
                names.Add("Jhonatas");
    
                this.GridView1.DataSource = names;
                this.GridView1.DataBind();
    
                foreach (GridViewRow gvr in GridView1.Rows)
                {
                    //add checkbox for every row
                    TableCell cell = new TableCell();
                    CheckBox box = new CheckBox();
                    box.AutoPostBack = true;
                    box.ID = gvr.Cells[0].Text;
    
                    box.CheckedChanged += new EventHandler(box_CheckedChanged);
                    cell.Controls.Add(box);
                    gvr.Cells.Add(cell);
                }
            }
    
            void box_CheckedChanged(object sender, EventArgs e)
            {
                string test = "ok";
            }
    

    【讨论】:

    • 如何在这里检查行的索引?我需要得到它才能确定哪个复选框被选中,哪个不被选中......
    • 你的事件被触发了?
    【解决方案2】:

    你应该走这条路:

    首先当你生成复选框时

           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。然后我只是用它来引用复选框。
    【解决方案3】:
       TableCell cell = new TableCell();
       CheckBox box = new CheckBox();
       box.Check += new EventHandler(Checked_Changed);
       cell.Controls.Add(box);
       gvr.Cells.Add(cell);
    

    对不起,我已经准备开车回家了,所以这只是一个快速的答案。 也许你必须在框后更正事件。“事件”...

    【讨论】:

    • 我已经尝试过了,但我未能获得 CheckBox 所在行的索引。我有多行,每行都有一个复选框。如果一个被选中,其他的应该被取消选中。
    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2012-06-17
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多