动态复选框的CheckedChanged事件未被触发。

3

我似乎遇到了一个问题,无法获取动态复选框组的事件处理程序。 代码已发布在此处。 我认为这应该很简单,复选框不会出现在重复器、数据网格等中。 它们出现在位于屏幕中央的div中的表格中。 希望能得到帮助。

            foreach (SelectAssignedRolesByUserResult role in assignedRoles)
            {
                CheckBox cb = new CheckBox();
                cb.ID = string.Format("CheckBox_{0}_{1}", role.role_nm, role.role_id);
                cb.Text = role.role_nm;
                cb.Attributes.Add("role_id", role.role_id.ToString());
                cb.Attributes.Add("assigned_role_id", role.assigned_role_id.ToString());
                cb.Checked = (role.assigned_role_id > 0);
                cb.CheckedChanged += new EventHandler(cb_CheckedChanged);

                TableCell cell = new TableCell();
                TableRow row = new TableRow();

                cell.Controls.Add(cb);
                row.Cells.Add(cell);
                TableAssignedRoles.Rows.Add(row);
            }

1
这些是使用哪种方法创建的?page_init?page_load? - Russ Bradberry
2个回答

1

您没有提及动态添加复选框的代码在哪里调用。我猜测您将其放在了Page_Load事件处理程序中,或者在Page_Load内部调用的子程序中。

如果是这样,请将其从Page_Load移动到Page_Init。

以下是一个非常非技术性的解释:

这是因为控件是否被选中是在页面解析Viewstate时发生的。在页面生命周期中,Page_Init加载初始控件,然后应用Viewstate,最后触发Page_Load。

补充

别忘了添加

cb.AutoPostBack = true;

我应该像你一样直接给出答案而不是提问,哈哈。那么+1给你了。 - Russ Bradberry
是的,可能吧。在看到你的评论之前,我已经开始输入答案了,所以并不是抄袭你的想法,但如果你回答的话,我会给你点赞的。 - David

0

我们能看到更多的代码吗?你在生命周期的哪个阶段调用上述代码?

如果您在每次回发时没有以完全相同的方式重新创建复选框,使得每个复选框都被分配了相同的ID并可以正确加载ViewState,则会丢失事件处理程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接