动态添加的控件复选框更改事件不触发

3
我已经在jQuery手风琴控件中动态创建了3个复选框,并且我还为文本框关联了CheckedChanged事件。但是,事件根本没有触发。我不确定这里发生了什么。请帮助我。谢谢并感谢您的反馈。
我使用以下代码生成动态控件并关联事件:
protected void Page_Load(object sender, EventArgs e)
{
    dvAccordion.Controls.Clear();
    foreach (DataRow row in dataSetIP.Tables[0].Rows)
    {
        HtmlGenericControl tt= new HtmlGenericControl("H3");
        HtmlAnchor anc= new HtmlAnchor();
        HtmlGenericControl dvP= new HtmlGenericControl("DIV");
        dvP.InnerHtml = row["LD"].ToString();
        CheckBox chkTest = new CheckBox();
        if (!Page.IsPostBack) chkTest .ID = "chk" + row["SD"].ToString();
        else
        {
            string uniqueID = System.Guid.NewGuid().ToString().Substring(0, 5);
            chkTest .ID = "chk" + uniqueID + row["SD"].ToString();
        }
        chkTest.Text = row["SD"].ToString();
        chkTest.AutoPostBack = true;
        chkTest.CheckedChanged += new EventHandler(chkTest _CheckedChanged);
        chkTest.InputAttributes.Add("Value", row["ID"].ToString());

        anc.Controls.Add(chkTest);
        tt.Controls.Add(anc);
        dvAccordion.Controls.Add(tt);
        dvAccordion.Controls.Add(dvP);           
    }  
}

但是复选框改变事件没有被触发。

2个回答

1

这是一个关于添加控件、ViewState和一些生命周期的问题。动态添加完全参与整个生命周期的控件是一个复杂的主题,如果没有更多的上下文,最好阅读真正理解动态控件系列。

在您的情况下,我认为您正在重新创建控件,在ViewState初始化后的下一个页面加载时,因此它不知道绑定在需要排队调用绑定事件处理程序的时间。


非常感谢您的回复,Mufasa。但是我并没有完全理解,请告诉我您希望我何时重新创建这些控件,以便我可以获取ViewState。我尝试将其放在Page_Init中,但也没有起作用。 - user788312
@user788312 根据您想要做什么,有几种解决方案。要么提供更多上下文信息,要么建议阅读该系列文章,因为它确实是唯一帮助我正确使用动态控件的东西。就其价值而言,我尽量避免在可能的情况下使用它们——通常比它们的价值更费力。例如,尝试使用 Repeater 或 ListView。 - Jon Adams
Mufasa 再次感谢。这是上下文,我有一个基于 DB 返回的行数动态构建的 JQuery 手风琴。我还需要在每个手风琴行中放置复选框,因为我需要根据复选框中的选择填充网格中的数据。但是,由于这些复选框是在手风琴内动态创建的,所以无论我触发什么事件,复选框更改事件都不会被调用。如果该事件被触发,我可以检查已选属性的值并执行我的 DB 操作。我希望你明白了,如果没有,请告诉我。感谢您的反馈。 - user788312
听起来对我来说,使用Repeater或ListView会更容易。从您的描述中,我看不出有什么特别之处需要动态创建它们。让Repeater或ListView RowCommand处理事件要容易得多。请参见以下答案以获取帮助:http://stackoverflow.com/questions/1585574/use-data-in-repeater-when-checkbox-is-check-in-asp-net/1586729#1586729 或 https://dev59.com/P3VC5IYBdhLWcg3wz0h9#180307。 - Jon Adams

0
尝试在Page_Init()事件中添加控件(在Page_Load()事件之前被触发)。

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