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);
}
4

2 回答 2

8

请不要接受这个作为答案,chappoo回答了你的问题

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

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

ASP.NET

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

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

ASP.NET MVC

“生命周期”纯粹用于请求处理。动作(控制器)独立于渲染(视图)。

ASP.Net MVC - 请求生命周期

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

于 2013-08-13T19:07:25.793 回答
4

这个问题的答案在于了解 ASP.NET 页面生命周期。ASP.NET 在回发时重建页面的服务器实例。一旦服务器完成处理并将响应发送回客户端,服务器实例将被永久销毁,并且只能使用浏览器中包含的数据(查看数据/cookies等)和剩余的服务器数据(会话/缓存)。

您正在 Button1_OnClick 事件处理程序中连接动态按钮的单击事件。当 ASP.NET 尝试在下一次回发时重建页面时,它不会运行此事件处理程序(因为未单击 Button1),因此事件处理程序将永远不会被连接,这解释了为什么它永远不会运行。您需要在 Page_Load 处理程序中或之前连接任何事件处理程序,以便捕获控制事件处理程序。

于 2013-08-08T08:05:59.347 回答