动态创建Button OK但其事件处理程序未执行?

时间:2011-04-01 21:19:29

标签: asp.net

我在页面上有以下简单控件

WebForm1.aspx

<asp:Panel ID="Panel1" runat="server">
</asp:Panel>
<br />
<asp:Label ID="lblContent" runat="server" ></asp:Label>

WebForm1.aspx.cs中的一些代码:

protected void Page_Load(object sender, EventArgs e)
{
    Button btn = new Button();
    btn.ID = "btnTest";
    btn.Text = "I was dynamically created";
    btn.Click += new EventHandler(btnTest_Click);
    Panel1.Controls.Add(btn);
}

void btnTest_Click(object sender, EventArgs e)
{
    lblContent.Text = "btnTest_Click: " + DateTime.Now.ToString();
}

简而言之,当我在btnTest事件中动态创建一个Button(Page_Load)并为该按钮分配事件处理程序btnTest_Click时。点击事件然后,在加载页面时,我看到btnTest出现,当点击它时,调用事件处理程序btnTest_Click。好的,没问题。

我遇到问题但是当我尝试以下方案时......首先,我在设计师模式下向页面添加了一个按钮。

<asp:Panel ID="Panel1" runat="server">
</asp:Panel>
<asp:Button     ID="btnCreateDynamically" runat="server" 
            Text="Create Button Dynamically" 
                onclick="btnCreateDynamically_Click" />
<br />
<asp:Label ID="lblContent" runat="server" ></asp:Label>

我将代码从Page_Load移动到btnCreateDynamically的按钮事件处理程序,如下所示

protected void btnCreateDynamically_Click(object sender, EventArgs e)
{
    Button btn = new Button();
    btn.ID = "btnTest";
    btn.Text = "I was dynamically created";
    btn.Click += new EventHandler(btnTest_Click);
    Panel1.Controls.Add(btn);
}

现在运行WebApp并单击btnCreateDynamically时,会创建btnTest但是当我单击btnTest时,它的事件处理程序未被调用???

为什么不呢? 我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

您应该在Page的Init事件处理程序中添加动态控件,以便适当地触发ViewState和Events。

尝试这样做:

protected void Page_Init(object sender, EventArgs e)     
{         
    Button btn = new Button();         
    btn.ID = "btnTest";         
    btn.Text = "I was dynamically created";         
    btn.Click += new EventHandler(btnTest_Click);         
    Panel1.Controls.Add(btn);     
} 

答案 1 :(得分:1)

您需要re-create dynamic control on each postback,查看我之前对类似问题的回答here