动态占位符控件和附加事件

时间:2011-11-07 15:54:30

标签: c# asp.net event-handling

我在一个非常动态的应用上遇到了一些巨大的头痛。

我使用的是动态占位符控件:

http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx

在回发后尝试重新创建动态创建的控件时,这为我省去了很多麻烦。

是否有其他人将事件处理程序附加到复选框控件有任何问题?

这是我动态创建的复选框的代码。

// Now I create my checkbox
chkDynamic = new CheckBox();
string chk = "chk";

// Add it to our dynamic control
chkDynamic.CheckedChanged += new EventHandler(chkDynamic_CheckedChanged);
chkDynamic.ID = chk;
DynamicControlsPlaceholder1.Controls.Add(chkDynamic);
chkDynamic.Text = "hey";

这样可行,但它就像事件没有附加一样! 这是我的事件处理程序!

protected void chkDynamic_CheckedChanged(object sender, EventArgs e)
    {

    if (((CheckBox)sender).Checked)
        Response.Write("you checked the checkbox :" + this.chkDynamic.ID);
    else
        Response.Write("checkbox is not checked");
}

现在,如果我要使用常规占位符或面板,那么效果很好。

实施例。改变这一行:

DynamicControlsPlaceholder1.Controls.Add(chkDynamic);

Panel1.Controls.Add(chkDynamic);

它完美无缺。

有人可以告诉我,这个控件或我的编码是一个问题吗?

没有错误,唯一出现意外的事情是当我使用DynamicControlsPlaceholder时我的事件没有触发。

3 个答案:

答案 0 :(得分:1)

创建委托(匿名方法)为我完成了这项工作。

// Now I create my checkbox
chkDynamic = new CheckBox();
string chk = "chk";

// Add it to our dynamic control
chkDynamic.CheckedChanged += delegate (System.Object o, System.EventArgs e)
        {
           if (((CheckBox)sender).Checked)
           Response.Write("you checked the checkbox :" + this.chkDynamic.ID);
           else
           Response.Write("checkbox is not checked");
        };
chkDynamic.ID = chk;
DynamicControlsPlaceholder1.Controls.Add(chkDynamic);
chkDynamic.Text = "hey";

这将导致代理中写入的代码在动态控制命中动作时执行" CheckedChanged"

答案 1 :(得分:0)

好的,这适用于一个动态创建的控件。但不是多个......

答案 2 :(得分:0)

如果要添加动态控件,必须在OnInit()之前创建/重新创建控件。这是.NET页面生命周期中恢复视图状态和事件的要点。如果它仅用于添加动态控件,您正在使用动态占位符控件,那么只需将控件创建/重新创建在OnInit()中即可解决您的问题。试一试,让我知道你的结果。