0

私はwinformsに次のプログラムを持っています: ここに画像の説明を入力

パネルに表示されている 2 つのボタンをクリアしたい。

私が持っているコードは、最後のパネルの最後のボタンのみをクリアするようです。すべてのパネルをクリアする必要があります。ここで何が欠けていますか:

 public Form1()
        {
            InitializeComponent();
        }

        Panel pnl1;
        Panel pnl2;
        Button btn;
        private void createPanels(int spacing)
        {
            pnl1 = new Panel();
            pnl1.Location = new Point(5, spacing);
            pnl1.BorderStyle = BorderStyle.FixedSingle;
            pnl1.Size = new Size(85, 93);
            this.Controls.Add(pnl1);

            pnl2 = new Panel();
            pnl2.Location = new Point(91, spacing);
            pnl2.BorderStyle = BorderStyle.FixedSingle;
            pnl2.Size = new Size(85, 93);
            this.Controls.Add(pnl2);

        }

        void addCons()
        {
            btn = new Button();
            btn.Size = new Size(40, 20);
            btn.Location = new Point(5, 5);

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            addCons();
            createPanels(5);
            pnl1.Controls.Add(btn);

            addCons();
            createPanels(99);
            pnl1.Controls.Add(btn);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            pnl1.Controls.Clear();
        }
4

1 に答える 1

3

1 つのパネルだけがクリアされる理由は、pnl1を呼び出すたびに変数の値を再割り当てしているためですcreatePanels。ここではグローバルPanel変数の使用を避け、パネルをリストに格納することを検討してください。

//class level variable
List<Panel> allPanels = new List<Panel>();

//...   

Panel pnl1 = new Panel();
//...panel code
this.Controls.Add(pnl1);
allPanels.add(pnl1);

Panel pnl2 = new Panel();
//...panel code
this.Controls.Add(pnl2);
allPanels.add(pnl2);

//..
private void button1_Click(object sender, EventArgs e)
{
    foreach(Panel p in allPanels) {
        while (p.Controls.Count > 0) p.Controls[0].Dispose();
    }
}

別の方法として、フォーム上のすべてのコントロールを反復処理してそのPanelsようなものを取得することもできますが、リストを使用すると、より詳細な制御が可能になり、多くのコントロールを反復処理する必要がなくなる可能性があります。

于 2013-03-18T21:25:32.170 に答える