Как я могу проверить / снять все флажки внутри группы? - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть форма с несколькими ящиками групп. Каждый GroupBox содержит несколько CheckBox внутри. Каждый GroupBox также имеет (вне его) две связанные кнопки, которые снимают / проверяют все флажки внутри связанного GroupBox.

Мой план состоял в том, чтобы использовать расширенный цикл for для перебора всех CheckBox-ов внутри каждого GroupBox-а. Однако в GroupBoxes отсутствует обязательное свойство для работы цикла (getEnumerator?).

Кроме того, мне нужно сделать так, чтобы каждый раз, когда я вручную проверял или снимал флажок CheckBox, TextBox получал обновление с суммой значений, сохраненных в свойстве tag проверенных CheckBoxes.

Я нашел несколько похожих вопросов о людях, желающих поставить / снять галочку в каждом чекбоксе в форме. Вот код, адаптированный для моего приложения.

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 ]

2 голосов
/ 20 апреля 2019
double total = 0;
try
{
    foreach (GroupBox ctrl in this.Controls.OfType<GroupBox>()) //We get all of groupboxes that is in our form (We want the checkboxes which are only in a groupbox.Not all of the checkboxes in the form.)
    {
        foreach (CheckBox c in ctrl.Controls.OfType<CheckBox>()) //We get all of checkboxes which are in a groupbox.One by one.
        {
            if (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);
}
0 голосов
/ 20 апреля 2019

Я думаю, что это будет работать

foreach(CheckBox c in groupBox1.Controls.OfType<CheckBox>())
            {
                c.Checked = true;
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...