Как получить значение элемента управления, динамически добавляемого в 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;