gpt4 book ai didi

c# - 我如何创建按钮并从回发中连接事件

转载 作者:太空狗 更新时间:2023-10-29 21:31:48 25 4
gpt4 key购买 nike

我需要根据处理器和磁盘密集型搜索来生成按钮。每个按钮将代表一个选择并触发回发。我的问题是回发不会触发命令 b_Command。我猜是因为没有重新创建原始按钮。我无法在回发中执行原始搜索来重新创建按钮,因此我想从回发信息中生成所需的按钮。

我应该如何以及在哪里做这件事?例如,我应该在 Page_Load 之前这样做吗?我怎样才能从回发中重建 CommandEventHandler - 如果有的话?

   namespace CloudNavigation
{
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
// how can I re-generate the button and hook up the event here
// without executing heavy search 1
}
else
{
// Execute heavy search 1 to generate buttons
Button b = new Button();
b.Text = "Selection 1";
b.Command += new CommandEventHandler(b_Command);
Panel1.Controls.Add(b);
}
}

void b_Command(object sender, CommandEventArgs e)
{
// Execute heavy search 2 to generate new buttons
Button b2 = new Button();
b2.Text = "Selection 2";
b2.Command += new CommandEventHandler(b_Command);
Panel1.Controls.Add(b2);
}
}
}

最佳答案

b_Command 事件处理程序方法没有被执行,因为回发按钮没有被重新创建(因为它们是动态生成的)。每次重新创建页面时都需要重新创建它们,但为了做到这一点,您需要在状态中的某个地方显式缓存信息。

如果这是一个页面范围内的操作,最简单的方法是将它存储在 ViewState 中(作为字符串——如果你开始用对象加载 ViewState,你会看到性能下降),这样你就可以在下一次加载时检查它(或者任何其他以前的事件)并在重新加载页面时重新创建按钮。如果操作是 session 范围的,您可以轻松地将一个对象(数组或其他)存储在 session 中并在下一次加载(或初始化)时检索它以重新创建您的控件。

这种情况意味着您只需要在 b_Command EventHandler 中存储一些关于您的按钮的信息,而不是创建和添加按钮,因为如果您这样做,您将在下一次回传中丢失相关信息(就像现在正在发生的那样)。

所以你的代码会变成这样:

namespace CloudNavigation
{
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
this.recreateButtons();
}
else
{
// Execute heavy search 1 to generate buttons
Button b = new Button();
b.Text = "Selection 1";
b.Command += new CommandEventHandler(b_Command);
Panel1.Controls.Add(b);
//store this stuff in ViewState for the very first time
}
}

void b_Command(object sender, CommandEventArgs e)
{
//Execute heavy search 2 to generate new buttons
//TODO: store data into ViewState or Session
//and maybe create some new buttons
}

void recreateButtons()
{
//retrieve data from ViewState or Session and create all the buttons
//wiring them up to eventHandler
}
}
}

如果您不想在页面加载时调用 recreateButtons,您可以在 PreLoad 或 Init 事件上调用,我看不出有什么不同,因为您可以在任何地方访问 ViewState/Session 变量(在 Init viewstate 上)未应用,但您可以访问它以重新创建动态按钮)。

有人会讨厌这个解决方案,但据我所知,在服务器端保留状态数据的唯一方法是 ViewState - Session - Page.Transfer 或客户端 cookies 。

关于c# - 我如何创建按钮并从回发中连接事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/272928/

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