0

こんにちは、すぐに何かに発展する小さなwinformsプログラムがあります。プログラムには 2 つのパネルがpanel1あり、panel2これらのパネルにはいくつかのフォーム コントロールが動的に取り込まれます。最初のパネルにはコンボ ボックスが表示され、2 番目のパネルにはボタンのグリッドが表示されます。私が達成したいのは、ユーザーがから選択したものに応じて、右のボタンを無効にできるようにすることcomboboxです。グリッドの各列は曜日を表し、combobox必要に応じてリストから選択して目的の日を無効にするために使用されます。

これを静的に行うのは簡単ですが、私のプログラムはすぐに拡張されて大規模なデータベースを処理できるようになるため、これを動的に行っています。基本的に、これは私が今立ち往生しているところです。右のボタンを単に無効にしたいのです。

以下は私がこれまで持っているインターフェースです: ここに画像の説明を入力

そして、これは私のコードです。

 public Form1()
        {
            InitializeComponent();
        }
        Button[] btn = new Button[2];
        ComboBox[] cmb = new ComboBox[1];

        private void Form1_Load(object sender, EventArgs e)
        {
            placeRows();
        }

        public void createColumns(int s)
        {
            for (int i = 0; i < btn.Length; ++i)
            {
                btn[i] = new Button();
                btn[i].SetBounds(40 * i, s, 35, 35);
                btn[i].Text = Convert.ToString(i);

                panel1.Controls.Add(btn[i]);

            }

            for (int i = 0; i < cmb.Length; ++i)
            {
                cmb[i] = new ComboBox();
                cmb[i].SelectedIndexChanged += new EventHandler(cmb_SelectedIndexChanged);
                cmb[i].Text = "Disable";
                cmb[i].Items.Add("Monday");
                cmb[i].Items.Add("Tuesday");
                cmb[i].SetBounds(40 * i, s, 70, 70);
                panel2.Controls.Add(cmb[i]);
            }

        }

        void cmb_SelectedIndexChanged(object sender, EventArgs e)
        {
            ComboBox senderCmb = (ComboBox)sender;

            if (senderCmb.SelectedIndex == 1)
            {
                //MessageBox.Show("Tuesday");
                btn[1].Enabled = false;
            }
        }

        public void placeRows()
        {
            for (int i = 0; i < 80; i = i + 40)
            {
                createColumns(i);               
            }
        }
    }
4

1 に答える 1

3

代替案 1

すべてのコントロールにはTagプロパティがあります。

ボタンのプロパティを設定してTag、ボタンがある列を表すことができます。

コンボ ボックスで選択が行われると、すべてのTagボタンを検索し、各ボタンのプロパティがコンボ ボックスで選択されたテキストと一致するかどうかに基づいてボタンを有効または無効にします。

代替案 2

作成する

Dictionary<string, List<Button>> buttonMap;

ここで、キーは列 ("Tuesday") を表す値で、値はそのタグを持つボタンのリストです。最初にボタンを作成するときに、その辞書も入力します。

代替案 2 を使用する場合は、以前に選択したチェックボックスの値を記憶して、無効になっていないボタンを再度有効にする必要があります。

ボタンがたくさんある場合は、Alternative 2 の方が著しく高速であることに気付くかもしれません。

アップデート

代替案 1 の完全な動作サンプルを次に示します。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    const int ROWS = 2;
    const int COLS = 2;

    Button[,] btn = new Button[ROWS,COLS];
    ComboBox[] cmb = new ComboBox[ROWS];

    private void Form1_Load(object sender, EventArgs e)
    {
        placeRows();
    }

    private readonly string[] cbTexts = new string[] { "Monday", "Tuesday" };

    public void createColumns(int rowIndex)
    {
        int s = rowIndex * 40;

        // Your original code kept overwriting btn[i] for each column.  You need a 2-D array
        // indexed by the row and column
        for (int colIndex = 0; colIndex < COLS; colIndex++)
        {
            btn[rowIndex, colIndex] = new Button();
            btn[rowIndex, colIndex].SetBounds(40 * colIndex, s, 35, 35);
            btn[rowIndex, colIndex].Text = Convert.ToString(colIndex);
            btn[rowIndex, colIndex].Tag = cbTexts[colIndex];

            panel1.Controls.Add(btn[rowIndex, colIndex]);

        }

        cmb[rowIndex] = new ComboBox();
        cmb[rowIndex].SelectedIndexChanged += new EventHandler(cmb_SelectedIndexChanged);
        cmb[rowIndex].Text = "Disable";
        foreach (string cbText in cbTexts)
        {
            cmb[rowIndex].Items.Add(cbText);
        }
        cmb[rowIndex].SetBounds(40, s, 70, 70);
        cmb[rowIndex].Tag = rowIndex; // Store the row index so we know which buttons to affect
        panel2.Controls.Add(cmb[rowIndex]);

    }

    void cmb_SelectedIndexChanged(object sender, EventArgs e)
    {
        ComboBox senderCmb = (ComboBox)sender;

        int row = (int)senderCmb.Tag;
        for (int col = 0; col < COLS; col++)
        {
            Button b = btn[row, col];
            // These three lines can be combined to one.  I broke it out
            // just to highlight what is happening.
            string text = ((string)b.Tag);
            bool match =  text == senderCmb.SelectedItem.ToString();
            b.Enabled = match;
        }
    }

    public void placeRows()
    {
        for (int rowIndex = 0; rowIndex < 2; rowIndex++)
        {
            createColumns(rowIndex);
        }
    }
}
于 2013-02-05T17:51:37.433 に答える