Как я могу обратиться к автоматически созданному CheckBox C#

154
18 июня 2019, 12:30

Столкнулся с такой проблемой...

Я автоматически создаю чекбоксы (до этого в начале программы я объявляю CheckBox box; для того, чтобы мог их использовать во всей программе):

int startLocation = 142;
for (i = 0; i < ingridients.Length; i++)
{ 
    box = new CheckBox(); //Create new checkBox
    box.Tag = i;//CheckBox (Tag 0-..)
    box.TabIndex = 8 + i;//Последовательность "выбора" через TAB
    box.Text = ingridients[i];
    box.AutoSize = true;
    box.Location = new Point(2, startLocation);
        startLocation += 25;
    this.Controls.Add(box);
}

и при закрытии окна мне надо пробежаться по выделенным из CheckBox'ов.

Но тут я сталкиваюсь с проблемой: я не могу обратиться ни к одному из чекбоксов, так как имена у них всех одинаковые.

Я пытался сделать так, но box.Tag[i] подчеркивается красным и не работает(что, в принципе, логично).

)

for (int n = 0; n<i; n++)
{
    if (box.Tag[n].Checked = true )
    {
    }
}

Может быть можно использовать что-то кроме tag'a...

Прошу мне помочь!

Буду очень признателен!

P.S. Я только недавно начал пользоваться StackOverflow, так что прошу не быть слишком критичными по отношению ко мнe.

Answer 1

Ссылки на все контролы хранятся в коллекции Controls, у которой есть метод OfType (расширение из System.Linq), позволяющий отфильтровать их по заданному типу:

foreach (CheckBox chbox in this.Controls.OfType<CheckBox>())
{
    if (chbox.Checked) { /*...*/ }
}
Answer 2

Пути 2:

1.Создать List и добавлять туда инициализированные чекбоксы

List<Checkbox> _chBoxLst = new List<Checkbox>();
int startLocation = 142;
for (i = 0; i < ingridients.Length; i++)
{ 
    _chBoxLst (new CheckBox()); //Create new checkBox
    //дальше идентично твоему коду
}

2.Пройтись по всем контролам на форме и выделить из них чекбоксы а потом уже делать с этим списком что нужно. (описан в ответе t3f )

Лично я пошел бы по первому пути. Чисто потому, что если в будущем появятся на форме новые чекбоксы которые логически отвечают за другие вещи, это может создать проблемы.

READ ALSO
Изменение круговой диаграммы в OxyPlot

Изменение круговой диаграммы в OxyPlot

Свойство Value у PieSlice доступно только для чтенияПолучается, что для обновления диаграммы нужно каждый раз удалять сегмент из PieSeries

126
Ожидание нажатия кнопки в цикле

Ожидание нажатия кнопки в цикле

Подскажите пожалуйста! Пишу мини програму тестирования, прописал создание интерфейса метод вызывается из main

149
C# Как сохранить изменения в DataGridView?

C# Как сохранить изменения в DataGridView?

Сейчас у меня есть DataGridView, в котором отображается 1 из связанных таблицmdb Есть фрагмент кода:

213
Unity помощь в скрипте

Unity помощь в скрипте

Что я пишу не так? По идее, этот скрипт должен двигать прицел по кругу, вокруг персонажа и следовать за указателем мыши, но прицел крутится...

128