0

私のプログラムは、WinFormsを使用して作成された3つの静的ボタン(button1、button2、button3)で構成されています。ボタン2と3はに設定されていenabled=Falseます。私がやりたいのは、これら2つのボタンを順番に有効にして、ボタン1をクリックして配列に配置することです。これはこれまでの私のコードですが、機能しません。誰かが私が間違っていることを見ることができますか?

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Button[] btns = new Button[2];
        //Button[] btns = { button2}
        public Form1()
        {
            InitializeComponent();
            Button[] btns = { button2, button3};
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            button2.Enabled = false;
            button3.Enabled = false;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 1; i < 2; i++)
            {
               // btns[i] = new Button();
               //btns[i].Enabled = true;

            }

        }
    }
}
4

2 に答える 2

4

問題のコードの主な問題は次のとおりです。

public Form1()
{
    InitializeComponent();
    Button[] btns = { button2, button3};
}

問題は、Form1コンストラクター内btnsがローカル変数であることです。コードは、同じ名前のメンバー変数を参照していることを明確に想定しています。

したがって、ローカル変数を初期化すると、すぐにスコープから消えます。コードの残りの部分では、btns初期化されていないメンバー変数を参照しています。

そのメンバー変数を初期化して問題を解決します。次のようにできます。

public partial class Form1 : Form
{
    private Button[] btns;

    public Form1()
    {
        InitializeComponent();
        btns = new Button[] { button2, button3 };
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        foreach (var btn in btns)
        {
            btn.Enabled = false;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        foreach (var btn in btns)
        {
            if (!btn.Enabled)
            {
                btn.Enabled = true;
                return;
            }
        }
    }
}
于 2012-10-25T18:37:53.910 に答える
3

インデックスはデフォルトで 0 ベースであり、1 ベースではありません。これはうまくいくはずです:

private void button1_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 2; i++)
    {
       btns[i].Enabled = true;
    } 
}

または使用foreach

private void button1_Click(object sender, EventArgs e)
{
    foreach(Button btn in btns)
    {
       btn.Enabled = true;
    } 
}

また、配列の初期化は次のようにする必要があります。

Button[] btns = new [] { button2, button3};
于 2012-10-25T18:36:17.487 に答える