У меня есть форма с несколькими ящиками групп. Каждый 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. Есть ли лучшее решение?