如何使用动态按钮单击事件处理程序而不使用页面init或页面加载

时间:2016-07-13 17:32:23

标签: c# asp.net webforms

我试图找出如何为我动态生成的4个按钮使用单击事件处理程序,而不在页面init或oninit中放置任何代码。我有一个按钮,一旦点击它会生成4个按钮。这4个按钮的单击事件处理程序不起作用。这是代码。有没有人想出一种方法来使用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";
}

3 个答案:

答案 0 :(得分:0)

确保动态控件的ID包含不同的关键字。在我下面的例子中,我将“DYNAMIC_”添加到他们的ID中。然后像这样覆盖std::equals

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 } (可悲的是Button没有),您可以直接从doPost()检索控件,如下所示:

__EVENTTARGET

答案 1 :(得分:0)

您想在 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中加载,则需要使用Session而不是ViewState。

答案 2 :(得分:0)

基本上我让它运转起来。没有办法绕过它。除了PlaceHolder1.Controls.Add(b)之外,您还必须使用Oninit或Page_load并将b.Click + = new EventHandler(b_click)代码放在那里。还有,事件处理程序可以使用按钮正确注册。这种方法的问题是它将按钮放在网页的PlaceHolder部分的顶部,这不是我想要的。我希望能够将按钮放在网页的特定位置。那你怎么去做呢?基本上在PlaceHolder1.Controls.Add(b)之后只需使按钮不可见。然后,当您准备将按钮放在html的特定部分中时,再次调用PlaceHolder1.Controls.Add(b)并使其可见。这对我行得通。如果有人需要帮助,我可以发布一些示例代码,您可以自己测试。谢谢大家。