0

Windowsフォームでボタンの2次元配列を作成したいと思います。100個のボタンの配列が必要なため、forループを使用する必要があります。しかし、私はそれを機能させることができません。List>とButtton[、]で試しましたが、機能しません。私がこのようにしようとすると:

private List<List<Button>> LEDarray = new List<List<Button>>();

        for (int y = 0; y < 5; y++)
        {
            this.tempList.Clear();

            for (int x = 0; x < 20; x++)
            {
                this.tempList.Add(new Button());
            }

            this.LEDarray.Add(tempList);
        }
        for (int y = 0; y < 5; y++)
        {
            for (int x = 0; x < 20; x++)
            {
                this.LEDarray[y][x].BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(64)))), ((int)(((byte)(0)))));
                this.LEDarray[y][x].FlatStyle = System.Windows.Forms.FlatStyle.Flat;
                this.LEDarray[y][x].ForeColor = System.Drawing.Color.Black;

                xPos = xOffset + LEDsize * x + 20;
                yPos = yOffset + LEDsize * y + 20;

                this.LEDarray[y][x].Location = new System.Drawing.Point(xPos, yPos);
                this.LEDarray[y][x].Name = "button" + y.ToString() + x.ToString(); 
                this.LEDarray[y][x].Size = new System.Drawing.Size(LEDsize, LEDsize);
                this.LEDarray[y][x].TabIndex = 0;
                this.LEDarray[y][x].UseVisualStyleBackColor = false;
            }
        }

        for (int y = 0; y < 5; y++)
        {
            for (int x = 0; x < 20; x++)
            {
                this.Controls.Add(this.LEDarray[y][x]);
            }
        }

ボタンの最後の行のみが表示されます。つまり、前の行ではなく、5行目だけです。Button配列で同様のことを試してみると、まったく機能しません。しかし、配列の方法は単なるSOS呼び出しです。Listでやりたいので、上記のコードを使って動作させるのを手伝ってもらえますか?

4

2 に答える 2

4

コントロールにボタンを追加するときの条件for (int y = 0; y < 0; y++)をに変更します。for (int y = 0; y < 5; y++)

2番目の問題は、追加したばかりのtempListをクリアしていることですLEDarray。ボタンの行ごとに新しいリストを作成します。

for (int y = 0; y < 5; y++)
{
     // tempList.Clear() - this will remove all buttons from previous row
     tempList = new List<Button>();

     for (int x = 0; x < 20; x++)     
          tempList.Add(new Button());     

     LEDarray.Add(tempList);
}

またTabIndex、ボタンを増やすことをお勧めします。

this.LEDarray[y][x].TabIndex = 10 * y + x;

そして別のアドバイス-カスタムLEDButtonクラスを作成して使用します:

public class LEDButton : Button
{
    public const int LEDWidth = 20;
    public const int LEDHeight = 20;

    public LEDButton()
    {
        BackColor = Color.FromArgb(0, 64, 0);
        ForeColor = Color.Black;
        FlatStyle = FlatStyle.Flat;
        Size = new Size(LEDWidth, LEDHeight);
        UseVisualStyleBackColor = false;
    }
}

使用法:

// initialize array
LEDButton[,] leds = new LEDButton[5, 20];
for (int y = 0; y < leds.GetUpperBound(0); y++)
    for (int x = 0; x < leds.GetUpperBound(1); x++)
        leds[y, x] = new LEDButton()
            {
                Name = String.Format("Button{0}{1}", y, x),
                TabIndex = 10 * y + x,
                Location = new Point(LEDButton.LEDWidth * x + 20,
                                     LEDButton.LEDHeight * y + 20)
            };
// add buttons to controls
for (int y = 0; y < leds.GetUpperBound(0); y++)
    for (int x = 0; x < leds.GetUpperBound(1); x++)
         Controls.Add(leds[y, x]);
于 2012-10-28T16:04:01.413 に答える
0

境界値を混同しているように見えるので、代わりにforeachを使用してみてください:-)

foreach (var row in this.LEDArray)
{
    foreach (var button in row)
    {
        this.Controls.Add(button);
    }
}

間違いなく、これはコードの意図(コレクション内のすべてのボタンを追加する)もより適切に伝達します。

于 2012-10-28T16:08:43.627 に答える