如何在不使用页面初始化或页面加载的情况下使用动态按钮单击事件处理程序

本文关键字:动态 情况下 按钮 程序 事件处理 单击 初始化 加载 | 更新日期: 2023-09-27 17:57:00

我正在尝试弄清楚如何为我动态生成的 4 个按钮使用 click 事件处理程序,而无需在页面 init 或 oninit 中放置任何代码。我有一个按钮,一旦单击它就会生成另外 4 个按钮。这 4 个按钮的 click 事件处理程序不起作用。这是代码。有没有人想出一种方法来使用 asp.net c# 中的单击事件,而无需先将其放入 page_load 中?如果我能解决这个问题,我就可以在更大的场景中解决我真正的问题。

protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 4; i++)
    {
        Button b = new Button();
        b.ID = i.ToString();
        b.Text = "ClickMe";
        b.Visible = true;
        b.Click += new EventHandler(b_click);
        PlaceHolder1.Controls.Add(b);
    }
}
void b_click(object sender,EventArgs e)
{
    Label1.Text = "ok";
}

如何在不使用页面初始化或页面加载的情况下使用动态按钮单击事件处理程序

确保动态控件的 ID 包含不同的关键字。在下面的示例中,我在他们的 ID 前面加上了"DYNAMIC_"。然后像这样覆盖OnPreRender()

protected override void OnPreRender(EventArgs e)
{
    if (Page.IsPostBack && !IsPostBackEventControlRegistered)
    {
        var controlName = this.Request.Form.AllKeys.SingleOrDefault(key => key.Contains("DYNAMIC_"));
        processEventForDynamicControl(controlName);
    }
    base.OnPreRender(e);
}
private void processEventForDynamicControl(string controlName)
{
    //Do your dynamic button click processing here
}

当然,如果您的动态控件使用 doPost()(遗憾的是 Button 没有),您可以直接从__EVENTTARGET中检索控件,如下所示:

var controlName = Request.Params.Get("__EVENTTARGET")
您希望

Page_Load中加载控件。否则,它们不在控制树中,并且无法触发b_click事件。

public int Counter
{
    get { return (int?) ViewState["Counter"] ?? 0; }
    set { ViewState["Counter"] = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
    var counter = Counter;
    for (int i = 0; i < counter; i++)
    {
        Button b = new Button();
        b.ID = i.ToString();
        b.Text = "ClickMe";
        b.Visible = true;
        b.Click += b_click;
        PlaceHolder1.Controls.Add(b);
    }
}
protected void Button1_Click(object sender, EventArgs e)
{
    Counter = 4;
    for (int i = 0; i < 4; i++)
    {
        Button b = new Button();
        b.ID = i.ToString();
        b.Text = "ClickMe";
        b.Visible = true;
        b.Click += b_click;
        PlaceHolder1.Controls.Add(b);
    }
}
void b_click(object sender, EventArgs e)
{
    Label1.Text = "ok";
}

注: 如果计划在Page_Init内部加载,则需要使用会话而不是视图状态。

基本上我让它工作了。这是没有办法的。您必须使用 Oninit 或 Page_load 并将您的 b.Click += 新的 EventHandler(b_click) 代码放在那里,以及 PlaceHolder1.Controls.Add(b);那里也,以便事件处理程序使用按钮正确注册。这种方法的问题在于它将按钮放在网页的占位符部分的顶部,这不是我想要的。我希望能够将按钮放置在网页中的特定位置。那么,您如何四处走动呢?基本上在 PlaceHolder1.Controls.Add(b) 之后,只需使按钮不可见即可。然后在当您准备好将按钮放置在 html 的特定部分时,再次调用 PlaceHolder1.Controls.Add(b) 并使其可见。这对我有用。如果有人需要帮助,我可以发布一些示例代码,您可以自己测试它。谢谢大家。

相关文章: