0

我正在用 C# 制作一个 Windows 窗体应用程序。

我的一个表单包含 5 个组框,每个组框内包含 6 个复选框。我需要计算所有选中的复选框。

目前我已将其编码如下:

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

但是,我必须重复上述 5 次,然后将所有变量加在一起以获得答案。我确信有一种更聪明的方法可以减少代码。

我尝试将其中三个组合如下:

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

编辑

适合计算表单上所有选中的复选框,无论复选框是否为子控件。

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 回答