0

C# で Windows フォーム アプリケーションを作成しています。

私のフォームの 1 つには 5 つのグループ ボックスがあり、それぞれに 6 つのチェックボックスが含まれています。チェックされたすべてのチェックボックスを数える必要があります。

現時点では、次のようにコーディングしました。

int NumOfRacks1 = groupBoxPace.Controls.OfType<CheckBox>() .Count(cb => cb.Checked);

ただし、上記を 5 回繰り返してから、すべての変数を合計して答えを得る必要があります。これを行うには、コードを削減するよりスマートな方法があると確信しています。

以下の3つを組み合わせてみました。

var allRacks = groupBoxSamsung.Controls.OfType<CheckBox>().Concat(groupBoxPace.Controls.OfType<CheckBox>().Concat(groupBox780.Controls.OfType<CheckBox>()));

しかし、これは期待どおりに機能しませんでした。

これを達成する方法を知っている人はいますか?

4

2 に答える 2

0

チェックされたすべてのチェックボックスを数える必要があります。

あなたが数えていないので、機能していません。これを試して。

var items = (groupBox1.Controls.OfType<CheckBox>()
    .Concat(groupBox2.Controls.OfType<CheckBox>()))
    .Where(ch => ch.Checked == true).Count();

そこにあなたのカウントがあります。

于 2012-09-22T19:50:59.970 に答える
0

StackOverflow How to get all childControls of a type on a formに関する質問を見つけ、それを拡張して、チェックされた要素をカウントしました

private void button1_Click(object sender, EventArgs e)
{
    label1.Text = (from c in GetAll(this, typeof(CheckBox))
                    where (c as CheckBox).Checked
                    select c).Count().ToString();                    
}
// credits go to @PsychoCoder for this part
public IEnumerable<Control> GetAll(Control control, Type type)
{
    var controls = control.Controls.Cast<Control>();
    return controls.SelectMany(ctrl => GetAll(ctrl, type))
                                .Concat(controls)
                                .Where(c => c.GetType() == type);
}

一般的に、このスニペットでうまくいくと思います。すべての groupBoxes を連結する必要はありません

編集

チェックボックスが childControls であるかどうかに関係なく、フォームでチェックされているすべての checkBoxesをカウントするように調整されています。

Type type = typeof(CheckBox);
var controls = this.Controls.Cast<Control>();
label1.Text = controls.SelectMany(ctrl => GetAll(ctrl))
                            .Concat(controls)
                            .Where(c => c.GetType() == type && (c as CheckBox).Checked)
                            .Count().ToString();
于 2012-09-22T19:59:18.967 に答える