Art*_*Art 2 asp.net dynamic linkbutton
我将一个LinkButton控件动态添加到PlaceHolder中.如果我在每个OnInit()上添加一个新的LinkButton实例,那么此LinkButton的OnClick处理程序可以正常工作.
但是,如果我在会话中存储LinkButton的实例,然后将其添加到PlaceHolder的控件集合中,则LinkButton.OnClick将无法触发.
有没有办法在给定的场景中重用我在会话中存储的控件?每次重新创建它们都不是一种选择.
正如旁注 - 它是1.1中的继承应用程序,我刚刚迁移到3.5."破碎"的方法似乎在1.1中起作用.
感谢所有的答案.
public static void Clicked(object sender, EventArgs e) {
Debugger.Break();
}
protected override void OnPreInit(EventArgs e) {
base.OnPreInit(e);
InitLinkButton();
}
private void InitLinkButton() {
var lb = new LinkButton();
plOne.Controls.Add(lb);
lb.ID = "lb";
lb.Text = "I will work.";
lb.Click += Clicked;
plOne.Controls.Add(lb);
LinkButton lb2 = null;
if (Session["lb2"] == null) {
lb2 = new LinkButton();
lb2.ID = "lb2";
lb2.Text = "I won't work.";
lb2.Click += Clicked;
Session["lb2"] = lb2;
} else {
lb2 = (LinkButton)Session["lb2"];
}
plOne.Controls.Add(lb2);
}
Run Code Online (Sandbox Code Playgroud)
wom*_*omp 10
几件事:
1)永远不要将WebControl的实例存储到Session.每个WebControl都有一个对象的引用 - 当然它引用了每一个其他的WebControl.只要将WebControl存储到Session中,就基本上存储整个页面及其包含的所有内容.你正在通往内存泄漏城市的高速公路上.
2)每次回发都会重新创建每个控件.我想你可能会认为每次重新创建你的LinkButtons都很慢,但事实并非如此.
3)为什么不在回发选项上重新创建动态控件?这就是你应该用动态控件做的事情.整个想法是您将页面设置为与原来相同,以便ViewState可以根据其ID自动连接到您的控件.如果您尝试在Init()之后的任何位置动态地向页面添加控件,您将无法使用ViewState来处理控件数据,并且必须实现自己的机制.
我的建议是在Init()中重新创建动态控件 - 这是最佳实践.
| 归档时间: |
|
| 查看次数: |
25863 次 |
| 最近记录: |