2012-09-22 216 views
0

我正在用C#制作Windows窗体应用程序。将多个组合框合并为一个可搜索变量

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

在我如下已编码的那一刻:

​​

但是我不得不重复5次以上,然后添加所有的变量一起得到答案。我确信有一个更明智的方法可以减少代码。

我想他们三个的组合如下:

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

但如预期并没有工作。

有没有人知道一种方法来实现这一目标?

+0

*但这并没有按预期那样工作。*发生了什么? – McGarnagle

+2

我真的很抱歉,我只是试了一遍,它的工作。 我不确定我第一次做了什么。 – user1681394

回答

0

我需要计算所有选中的复选框。

不工作,因为你不算数。尝试这个。

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

在那里你有你的计数。

+0

感谢Randolf。无论如何,我的代码似乎现在可以正常工作,但我可能会改用你的代码,因为它似乎更清晰。 – user1681394

0

我发现在计算器上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); 
} 

总的来说,我认为这个片段应该做的伎俩,你不必Concat的所有groupBoxes

编辑

适应于计数所有的表格上选中的复选框,无论复选框都childControls与否。

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();