Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
asp.net按钮事件未触发_Asp.net_Events_Code Behind_Buttonclick - Fatal编程技术网

asp.net按钮事件未触发

asp.net按钮事件未触发,asp.net,events,code-behind,buttonclick,Asp.net,Events,Code Behind,Buttonclick,我有个问题。当我将事件处理程序从代码隐藏添加到按钮时,事件永远不会被触发。但当我从创建按钮标签开始添加它时,它工作得非常好,我从代码后面创建按钮,并将其添加到表中 <form id="form1" runat="server"> <div> <asp:Button ID="Button1" runat="server" Text="show table" OnClick="Button1_OnCl

我有个问题。当我将事件处理程序从代码隐藏添加到按钮时,事件永远不会被触发。但当我从创建按钮标签开始添加它时,它工作得非常好,我从代码后面创建按钮,并将其添加到表中

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

受保护的无效按钮1\u OnClick(对象发送方,事件参数e)
{
var row=新表行();
var btnDownload=new按钮{ID=“ID”,Text=“单击此处”};
btnDownload.Click+=ClickEvent;
var cell=new TableCell();
cell.Controls.Add(btnDownload);
行.控件.添加(单元格);
tbody.Controls.Add(行);
}
受保护的void ClickEvent(对象发送者、事件参数e)
{
Debug.WriteLine(((按钮)sender.Text);
}

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

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

请不要将此作为答案,chappoo回答了您的问题

由于一个事件只触发一次,因此您的控件只存在一次,并在下一次
回发时消失。您不应该在
PostBack
事件中创建/删除控件

这里有一些链接可以理解ASP.NET和ASP.NET MVC的“生命周期”

ASP.NET

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

ASP.NET MVC

“生命周期”仅用于请求处理。动作(控制器)与渲染(视图)无关


我将使用Jquery ajax,它更容易实现客户端事件。这可能是一个更好的选择。如果您有选择的话,我还建议您使用ASP.NETMVC框架(或类似框架)进行任何有利于Web表单的新开发。现在它已经过时了(这是我个人的看法)。我肯定会学习和使用ASP.NET MVC,因为它更新了,而且是web表单。感谢您提供了这个很好的解释和共享信息链接。