1

Winform アプリにいくつかのボタンがあり、次のコードを使用すると、背景の色とテキストが変更されました。

List<Button> buttons = new List<Button>();

foreach (Button bt in panel1.Controls)
{
    if (bt is Button)
    {
        buttons.Add(bt);
    }

}

int btext = 1;
foreach (var button in buttons)
{

    button.Text = btext.ToString();
    button.BackColor = Color.White;
    btext++;
}

しかし、実行時にフォームを表示すると、ボタンのグリッドの右下にあるボタンにはテキスト「1」が表示され、グリッドの左上にあるボタンにはテキスト「36」が表示されます。私はそれが逆であるべきだと思っていました。なぜそのままなのか、どうすれば変更できるのか教えてください。どうもありがとう。

4

4 に答える 4

3

panel1.Controlsここでは、コントロールがコレクションに追加される順序が関係していると思います。ボタンのタブ オーダーを設定してから、TabIndexプロパティで並べ替えることができます。

foreach (var bt in panel1.Controls.OrderBy(c => c.TabIndex))
{
    if (bt is Button) 
    {
        buttons.Add(bt);
    }
}
于 2012-05-15T10:17:59.730 に答える
1

コントロールの位置で並べてみてください

List<Button> buttons = new List<Button>();

foreach (var bt in panel1.Controls)
{
    if (bt is Button)
    {
        buttons.Add((Button)bt);
    }

}

var lst = buttons.OrderBy(x => x.PointToScreen(Point.Empty).Y).ThenBy(x => x.PointToScreen(Point.Empty).X);

int btext = 1;
foreach (var button in lst)
{

    button.Text = btext.ToString();
    button.BackColor = Color.White;
    btext++;
}

ここに画像の説明を入力

于 2012-05-15T10:06:33.013 に答える
0

この LINQ アプローチを試すことができます。

var buttons = panel1.Controls.OfType<Button>()
             .Select((b, i) => new { Button = b, Position = i + 1 });
foreach(var btn in buttons)
{
    btn.Button.Text = btn.Position.ToString();
    btn.Button.BackColor = Color.White;
}

または、逆に必要な場合は、次を使用しますReverse

foreach (var btn in buttons.Reverse())
{
    btn.Button.Text = btn.Position.ToString();
    btn.Button.BackColor = Color.White;
}
于 2012-05-15T10:06:52.733 に答える
0

テキスト ラベルの順序を変更する必要がある場合は、次のようにします。

List<Button> buttons = panel1.Controls.OfType<Button>().ToList();
buttons.Reverse();

int btext = 1;
foreach (var button in buttons)
{
    button.Text = btext.ToString();
    button.BackColor = Color.White;
    btext++;
}
于 2012-05-15T10:57:50.593 に答える