我有问题。当我从代码后面添加一个事件处理程序到一个按钮时,事件永远不会被触发。但是当我在创建按钮标签时添加它时,它完美地工作,我从后面的代码创建按钮,然后将其添加到表中。
<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);
}
答案 0 :(得分:8)
请不要接受这个作为答案,chappoo回答了你的问题。
由于某个事件被触发一次,您的控件只会存在一次,并会在下一个PostBack
时消失。您不应在PostBack
事件中创建/删除控件。 Dynamic server controls must be created during the Init
of the page
以下是了解ASP.NET和ASP.NET MVC“生命周期”的一些链接。
<强> ASP.NET 强>
您可以看到在页面的Load
期间必须存在任何控件才能引发控制事件(RaiseChangedEvents
)和回发事件(RaisePostBackEvent
)。例如,页面子控件 - 和控件子控件 - 在页面{{1}之后创建(CreateChildControls
),数据绑定(在OnPreRender
之后)和呈现(RenderControl
)之后}。有时,某些开发人员会调用页面Load
中的EnsureChildControls
来预加载子控件。
http://msdn.microsoft.com/en-us/library/ms178472.aspx
ASP.NET MVC
'生命周期'纯粹用于请求处理。动作(Controller)呈现(视图)独立。
答案 1 :(得分:4)
这个问题的答案在于理解ASP.NET页面生命周期。 ASP.NET在回发时重建页面的服务器实例。一旦服务器完成处理并且响应被发送回客户端,服务器实例将永久销毁,并且只能使用浏览器中包含的数据(查看数据/ cookie等)和剩余服务器数据的组合来重新创建(会话/缓存)。
您正在连接Button1_OnClick事件处理程序中动态按钮的click事件。当ASP.NET尝试在下一个回发时重建页面时,它不会运行此事件处理程序(因为没有单击Button1),因此事件处理程序将永远不会被连线,这解释了它从未运行的原因。您需要在Page_Load处理程序之前或之前连接任何事件处理程序,以捕获控件事件处理程序。