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ページが 1 つしかない場合です。

したがって、コードを次のように変更すると:

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

ボタンはその状態を保持します。Initイベントでそれを行っているため、各投稿で状態が再作成される場合でも、状態について心配する必要はありませんViewStateInitイベント前とイベント前Load

クイック リファレンスとして、ページのライフサイクルを見てみましょう。

ここに画像の説明を入力

于 2012-06-16T08:13:46.167 に答える
2

ViewState正しくロードされ、イベントがトリガーされるようにするには、Page_Load の最新のすべてのポストバックで、以前と同じ ID を使用して動的に作成されたコントロールを再作成する必要があります。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);
    }
}
于 2012-06-16T08:01:39.213 に答える