ASP.NET按钮事件未触发

3

我有一个问题。当我从后台代码添加事件处理程序到按钮时,事件从未被触发。但是当我在创建按钮标签时添加它时,它完美地工作了。我是从后台代码中创建按钮并将其添加到表格中的。

<form id="form1" runat="server">
    <div>                       
        <asp:Button ID="Button1" runat="server" Text="show table" OnClick="Button1_OnClick" />
        <table border="1">
            <thead>
                <tr>
                </tr>
            </thead>
            <tbody id="tbody" runat="server">

            </tbody>
        </table>
    </div>
</form>


protected void Button1_OnClick(object sender, EventArgs e)
{
  var row = new TableRow(); 
  var btnDownload = new Button { ID = "ID", Text = "Click Here" };
  btnDownload.Click += ClickEvent;
  var cell = new TableCell();
  cell.Controls.Add(btnDownload);
  row.Controls.Add(cell);
  tbody.Controls.Add(row);
}
protected void ClickEvent(object sender, EventArgs e)
{
  Debug.WriteLine(((Button)sender).Text);
}
2个回答

8

请不要将这个答案视为答案,chappoo已经回答了你的问题

由于一个事件只会触发一次,因此您的控件只存在一次,并且在下一个PostBack上消失。您不应该在PostBack事件中创建/删除控件。必须在页面的Init期间创建动态服务器控件

以下是一些了解ASP.NET和ASP.NET MVC“生命周期”的链接。

ASP.NET

您可以看到任何控件必须在页面的Load期间存在,以引发控件事件(RaiseChangedEvents)和提交事件(RaisePostBackEvent)。例如,页面子控件-和控件子控件-在页面Load之后(CreateChildControls)创建、数据绑定(在OnPreRender之后)和呈现(RenderControl)。有时,某些开发人员在页面Load中调用EnsureChildControls来预加载子控件。

http://msdn.microsoft.com/en-us/library/ms178472.aspx ASP.NET 页面生命周期

ASP.NET MVC

'生命周期'仅用于请求处理。操作(Controller)是独立于渲染(View)的。

ASP.Net MVC - 请求生命周期

http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/entrypage/be-ahead-of-the-game-poster1 ASP.NET MVC '生命周期'


感谢您提供这个好的解释并分享有用的链接。 - Tvd

5
这个问题的答案在于理解ASP.NET页面生命周期。在postback时,ASP.NET会重建页面的服务器实例。一旦服务器处理完毕并将响应发送回客户端,服务器实例就永远被销毁了,只能通过浏览器中包含的数据(视图数据/ cookie等)和剩余的服务器数据(会话/缓存)的组合来重新创建。
你正在Button1_OnClick事件处理程序中连接动态按钮的单击事件。当ASP.NET在下一个postback上尝试重建页面时,它不会运行此事件处理程序(因为Button1没有被点击),因此事件处理程序永远不会被连接,这就解释了为什么它从未运行。您需要在Page_Load处理程序中或之前连接任何事件处理程序,以便捕获控件事件处理程序。

我将使用Jquery ajax,它更容易实现客户端事件。 - danarj
1
那可能是更好的选择。如果可以选择,我也建议使用ASP.NET MVC框架(或类似框架)进行任何新开发,而不是Web Forms。它现在几乎已经过时了(这是个人意见)。 - SteveChapman
我肯定会学习和使用ASP.NET MVC,因为它更新,而且Web表单很糟糕。谢谢。 - danarj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接