如何获取动态添加到 Windows Form c# 中的控件的值?
How to obtain the value of a control added dynamically into Windows Form c#?
我阅读了一些文章,但没有设法解决我的问题,我的问题是在我尝试获取动态添加到 Windows 表单的控件(CheckBox 和 ComboBox)的值时,我需要知道 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);
}
"I add the values from database in the case of the ComboBox, I omitted this part."
我尝试使用 foreach 获取值:
foreach (Control ctrl in groupBox.Controls)
问题是我不知道如何知道控件(CheckBox 和 ComboBox)是选中的还是空的(视情况而定)。
非常感谢您的帮助,感谢您的宝贵时间。
将每个动态分配的控件添加到 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>();
由于您在循环中为每个控件指定了一个名称,因此只要名称是唯一的,就可以很容易地使用它来识别每个单独的控件。例如,要获得第三个复选框,您可以使用如下内容:
Control control = groupBox.Controls.Single(x => x.Name == "CheckBox3");
Checkbox thirdCheckBox = (CheckBox)control;
bool checkBoxCheched = thirdCheckBox.Checked;
您可以使用 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
}
}
}
首先您需要知道迭代时当前使用的是什么控件,然后您可以转换它并使用该特定控件的方法。
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
关键字检查它是什么类型的控件。然后,如果它是我们知道如何处理的控件,我们将其转换并检查是否为空或已选中。
I need know when the CheckBox is checked (or unchecked) and if the ComboBox is empty (or not).
要获取复选框和组合框的状态,包括您用来创建它们的索引,您可以执行以下操作:
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();
我阅读了一些文章,但没有设法解决我的问题,我的问题是在我尝试获取动态添加到 Windows 表单的控件(CheckBox 和 ComboBox)的值时,我需要知道 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);
}
"I add the values from database in the case of the ComboBox, I omitted this part."
我尝试使用 foreach 获取值:
foreach (Control ctrl in groupBox.Controls)
问题是我不知道如何知道控件(CheckBox 和 ComboBox)是选中的还是空的(视情况而定)。
非常感谢您的帮助,感谢您的宝贵时间。
将每个动态分配的控件添加到 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>();
由于您在循环中为每个控件指定了一个名称,因此只要名称是唯一的,就可以很容易地使用它来识别每个单独的控件。例如,要获得第三个复选框,您可以使用如下内容:
Control control = groupBox.Controls.Single(x => x.Name == "CheckBox3");
Checkbox thirdCheckBox = (CheckBox)control;
bool checkBoxCheched = thirdCheckBox.Checked;
您可以使用 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
}
}
}
首先您需要知道迭代时当前使用的是什么控件,然后您可以转换它并使用该特定控件的方法。
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
关键字检查它是什么类型的控件。然后,如果它是我们知道如何处理的控件,我们将其转换并检查是否为空或已选中。
I need know when the CheckBox is checked (or unchecked) and if the ComboBox is empty (or not).
要获取复选框和组合框的状态,包括您用来创建它们的索引,您可以执行以下操作:
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();