单击事件后按钮阵列消失

时间:2012-06-16 07:57:57

标签: c# asp.net visual-studio-2008

点击其中任何一个后,为什么我的按钮(按钮数组)会消失?这是代码结构。非常感谢。

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

2 个答案:

答案 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事件之前加载视图状态

作为快速参考,请查看页面生命周期:

enter image description here

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