1

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

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

2 回答 2

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

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

在此处输入图像描述

于 2012-06-16T08:13:46.167 回答
2

您必须最迟在 Page_Load 中使用与以前相同的 ID 在每次回发时重新创建动态创建的控件,以确保ViewState正确加载并触发事件。PopulateControls在您使用静态数量的控件的情况下,即使在回发时也足以调用:

protected void Page_Load(object sender, EventArgs e)
{
   PopulateControls();
}

但是您还需要将 添加ButtonsPage的控件集合中,例如添加到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);
    }
}
于 2012-06-16T08:01:39.213 回答