点击其中任何一个后,为什么我的按钮(按钮数组)会消失?这是代码结构。非常感谢。
public partial class Seatalloc2 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
PopulateControls();
}
}
protected void PopulateControls()
{
Button[,] buttonArray = new Button[10, 14];
for (int a = 0; a < 10; a++)
for (int b = 0; b < 14; b++)
{
buttonArray[a, b] = new Button();
Panel2.Controls.Add(buttonArray[a, b]);
}
}
public void buttonHandler(object sender, EventArgs e)
{
Button btn = sender as Button;
btn.BackColor = Color.Red;
}
}
答案 0 :(得分:5)
如果你查看我对上一个问题的答案,你会找到一个解决这个问题的例子:
https://stackoverflow.com/a/11061782/1268570
根本问题是理解ASP.Net页面生命周期(我讨厌它)但是理解它背后的基础知识是有用和关键的
Microsoft的此文档详细说明了页面生命周期
http://msdn.microsoft.com/en-us/library/ms178472.aspx
基本上控件正在消失,因为您需要在每次回发的页面中重新创建它们,并且在您的代码中,您只是在第一次加载页面时创建它们
如果您没有母版页,那么创建动态控件的推荐事件是PreInit
;如果您有一个母版页,则Init
因此,如果您将代码更改为:
void Page_Init(object sender, EventArgs e)
{
PopulateControls();
}
您的按钮将保存其状态。不要担心状态,即使在每个帖子中重新创建状态,因为您在Init
事件中执行此操作,ASP.Net会自动将ViewState
加载到您的控件(这是可能因为ASP.Net在Init
事件之后和Load
事件之前加载视图状态
作为快速参考,请查看页面生命周期:
答案 1 :(得分:2)
您必须在最新的Page_Load中使用与以前相同的ID在每个回发上重新创建动态创建的控件,以确保正确加载ViewState
并触发事件。在您使用静态控件数的情况下,即使在回发中调用PopulateControls
也足够了:
protected void Page_Load(object sender, EventArgs e)
{
PopulateControls();
}
但您还需要将Buttons
添加到Page
的控件集合中,例如添加到Panel
。你的按钮数组没有用处:
protected void PopulateControls()
{
for (int a = 0; a < 10; a++)
for (int b = 0; b < 14; b++)
{
var btn = new Button();
btn.ID = "Btn_" + a + "_" + b;
// add an event handler for the click-event
btn.Click += buttonHandler;
MyButtonPanel.Controls.Add(btn);
}
}