我在一个非常动态的应用上遇到了一些巨大的头痛。
我使用的是动态占位符控件:
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时我的事件没有触发。
答案 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()
中即可解决您的问题。试一试,让我知道你的结果。