如何检查/取消选中GroupBox中的所有CheckBox?

时间:2019-04-20 10:25:15

标签: c# winforms

我有一个包含多个GroupBox的表单。每个GroupBox内部都包含多个CheckBox。每个GroupBox(在其外部)还具有两个关联的按钮,用于取消选中/选中链接的GroupBox中的所有CheckBox。

我的计划是使用增强的for循环遍历每个GroupBox内部的所有CheckBox。但是,GroupBoxes缺少使循环正常工作的必需属性(getEnumerator?)。

此外,我需要这样做,以便每次我手动选中或取消选中CheckBox时,TextBox都会使用存储在选中CheckBoxes的tag属性中的值的总和来更新。

我发现了一些类似的问题,希望人们检查/取消选中表单中的每个CheckBox。这是适合我的应用的代码。

private void CalculateComplementPrice()
{
    try
    {
        double total = 0;
        foreach (Control c in Controls) //I don't want to iterate through all the form
        {
            if (c is CheckBox)
            {
                CheckBox cb = (CheckBox)c;
                if(cb.Checked == true)
                {
                    total += Convert.ToDouble(cb.Tag);
                }
            }
        }
        tbComplementsPrice.Text = Convert.ToString(total);
    }
    catch
    {
        MessageBox.Show("Error on the complement GroupBox", "Error", MessageBoxButtons.OK);
    }
}

是否有任何方法可以遍历GroupBox的所有组件而不必遍历所有表单?

==更新==

我更改了以前找到的一些代码:

private void CalculateComplementPrice()
{
    double total = 0;
    try
    {
        foreach (Control ctrl in this.Controls)
        {
            if (ctrl.ToString().StartsWith("System.Windows.Forms.GroupBox"))
            {
                foreach (Control c in ctrl.Controls)
                {
                    if (c is CheckBox)
                    {
                        if (((CheckBox)c).Checked == true)
                        {
                            total += Convert.ToDouble(c.Tag);
                        }
                    }
                }
            }
        }
    tbComplementPrice.Text = string.Format("{0:F2}", total);
}
catch
{
    MessageBox.Show("Error calculating the complement price", "Error", MessageBoxButtons.OK);
}

现在它可以执行我想要的操作,但是我仍然必须遍历所有组件才能找到CheckBoxes。有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

     n
   <dbl>
 1     2
 2     3
 3     4
 4     5
 5     6
 6     7
 7     8
 8     9
 9    10
10    11

答案 1 :(得分:0)

我认为这会起作用

foreach(CheckBox c in groupBox1.Controls.OfType<CheckBox>())
            {
                c.Checked = true;
            }