gpt4 book ai didi

ASP.NET 动态添加的 LinkBut​​ton - OnClick 处理程序未被调用

转载 作者:行者123 更新时间:2023-12-02 14:32:14 25 4
gpt4 key购买 nike

我正在将 LinkBut​​ton 控件动态添加到 PlaceHolder 中。如果我在每个 OnInit() 上添加 LinkBut​​ton 的新实例,则此 LinkBut​​ton 的 OnClick 处理程序将起作用。

但是,如果我将 LinkBut​​ton 的实例存储在 session 中,然后将其添加到 PlaceHolder 的控件集合中,LinkBut​​ton.OnClick 将无法触发。

有没有办法在给定场景中重用我存储在 session 中的控件?每次都重新创建它们几乎是一种选择。

顺便说一句 - 这是 1.1 中继承的应用程序,我刚刚迁移到 3.5。 “ splinter ”的方法似乎在 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);
}

最佳答案

有几件事:

1) 永远、永远、永远不要将 WebControl 的实例存储到 session 中。每个 WebControl 都有一个对 Page 对象的引用 - 当然,它引用每个其他 WebControl。一旦您将 WebControl 存储到 Session 中,您基本上就存储了整个页面及其包含的所有内容。您正在通往内存泄漏城市的高速公路上。

2) 每个控件都会在每次回发时重新创建。我想您可能会认为每次重新创建 LinkBut​​ton 都很慢,但事实并非如此。

3) 为什么不能在回发时重新创建动态控件?这就是您应该使用动态控件执行的操作。整个想法是,您按照原来的方式设置页面,以便 ViewState 可以根据控件的 ID 自动连接到您的控件。如果您尝试在 Init() 之后的任何位置动态添加控件到页面,您将无法使用 ViewState 来处理您的控件数据,并且必须实现您自己的机制。

我的建议是在 Init() 中重新创建动态控件 - 这是最佳实践。

关于ASP.NET 动态添加的 LinkBut​​ton - OnClick 处理程序未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/855442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com