Как получить значение элемента управления, динамически добавляемого в Windows Form C#?

Я прочитал несколько статей, но мне не удалось решить мою проблему. Моя проблема в том моменте, когда я пытаюсь получить значение элементов управления (CheckBox и ComboBox), динамически добавляемых в форму Windows, мне нужно знать, когда CheckBox отмечен (или не отмечен)) и если ComboBox пуст (или нет), когда я нажимаю кнопку, эта кнопка вызывает метод, в котором я проверяю, все ли компоненты пусты, я добавляю элементы управления следующим образом:

 CheckBox box;
 ComboBox cmBox;
 for (int i = 1; i <= sumOfRegisters; i++)
 {
    box = new CheckBox();
    box.Name = "CheckBox" + i;
    box.Text = "Some text";
    box.AutoSize = true;
    box.Location = new Point(10, i * 25); //vertical

    cmBox = new ComboBox();
    cmBox.Name = "ComboBox" + i;
    cmBox.Size = new System.Drawing.Size(302, 21);
    cmBox.TabIndex = i;
    cmBox.Text = "Some Text";
    cmBox.Location = new Point(270, i * 25);

    this.groupBox.Controls.Add(cmBox);
    this.groupBox.Controls.Add(box);
}

"Я добавляю значения из базы данных в случае ComboBox, я пропустил эту часть".

Я пытаюсь получить значение с помощью foreach:

foreach (Control ctrl in groupBox.Controls)

Проблема в том, что я понятия не имею, как узнать, установлен ли элемент управления (CheckBox и ComboBox) или он пуст (в зависимости от обстоятельств).

Действительно спасибо за любую помощь, я ценю ваше время.

5 ответов

Решение

Вы могли бы использовать as оператор, вот так:

foreach (Control ctrl in groupBox.Controls)
{
    CheckBox checkBox = ctrl as CheckBox;
    ComboBox comboBox = ctrl as ComboBox;

    if (checkBox != null)   // Control is a CheckBox
    {
        if (checkBox.Checked)
        {
            // CheckBox is checked
        }
        else
        {
            // CheckBox is not checked
        }
    } 
    else if (comboBox != null)  // Control is a ComboBox
    {
        if (comboBox.Items.Count == 0)
        {
            // ComboBox is empty
        } 
        else
        {
            // ComboBox isn't empty
        }
    }
}

Вы отбрасываете свою ссылку на каждый динамически выделенный элемент управления после добавления его в grbMateias.

Одним из вариантов, безусловно, является сохранение этих ссылок, например, в List<Control>,

List<ComboBox> comboBoxes = new List<ComboBox>();

for (int i = 1; i <= sumOfRegisters; i++)
{
    box = new CheckBox();
    comboBoxes.Add(box);
    // etc.
}

Однако вы можете просто перебрать элементы управления в grbMateias

 foreach(Control ctl in grbMateias.Controls)
 {
     if (ctl is CheckBox)
     {
         // Use the checkbox
     }    
     else if (ctl is ComboBox)
     {
         // Use the ComboBox
     }    
 }

или используя Linq

var comboBoxes = grbMateias.Controls.OfType<ComboBox>();
var checkBoxes = grbMateias.Controls.OfType<CheckBox>();

Мне нужно знать, когда CheckBox проверен (или не отмечен) и если ComboBox пуст (или нет).

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

var checkBoxStates = groupBox.Controls
    .OfType<CheckBox>
    .Where(x => x.Name.StartsWith("CheckBox"))
    .Select(x => new {
        Index = Int.Parse(x.Name.Substring("CheckBox".Length)), 
        IsChecked = x.Checked
    })
    .ToList();

var comboBoxStates = groupBox.Controls
    .OfType<ComboBox>
    .Where(x => x.Name.StartsWith("ComboBox"))
    .Select(x => new {
        Index = Int.Parse(x.Name.Substring("ComboBox".Length)), 
        IsEmpty = x.Items.Count == 0
    })
    .ToList();

Сначала вам нужно знать, с каким элементом управления вы в данный момент работаете при итерации, затем вы можете привести его и использовать методы этого конкретного элемента управления.

foreach(Control c in groupBox.Controls)
{
    if(c is ComboBox)
    {
         if((ComboBox) c).SelectedItem == null)
            //handle nothing entered
    }
    else if(c is CheckBox)
    {
        if((CheckBox) c).Checked)
            //handle checked
    }
}

В приведенном фрагменте мы проверяем, используя is Ключевое слово, какой тип контроля это. Затем, если это элемент управления, который мы знаем, как обрабатывать, мы разыгрываем его и проверяем, пустой или проверенный.

Поскольку вы даете каждому элементу управления имя в цикле, его легко использовать для распознавания каждого отдельного элемента управления, если имена уникальны. Например, чтобы получить третий флажок, вы можете использовать что-то вроде этого:

Control control = groupBox.Controls.Single(x => x.Name == "CheckBox3");
Checkbox thirdCheckBox = (CheckBox)control;
bool checkBoxCheched = thirdCheckBox.Checked;
Другие вопросы по тегам