我有一个包含许多动态生成的复选框的表单。在运行时,我如何迭代它们中的每一个以便获得它们的值和ID?
答案 0 :(得分:37)
foreach(Control c in this.Controls)
{
if(c is CheckBox)
{
// Do stuff here ;]
}
}
答案 1 :(得分:18)
我使用一种适用于任何控件类型的简单扩展方法:
public static IEnumerable<T> AllControls<T>(this Control startingPoint) where T : Control
{
bool hit = startingPoint is T;
if (hit)
{
yield return startingPoint as T;
}
foreach (var child in startingPoint.Controls.Cast<Control>())
{
foreach (var item in AllControls<T>(child))
{
yield return item;
}
}
}
然后,您可以这样使用它:
var checkboxes = control.AllControls<CheckBox>();
使用IEnumerable可以选择存储结果的方式,还可以使用linq:
var checkedBoxes = control.AllControls<CheckBox>().Where(c => c.Checked);
答案 2 :(得分:11)
如果是Windows Forms,您可以尝试这样的事情:
private void button1_Click(object sender, EventArgs e)
{
Dictionary<string, bool> checkBoxes = new Dictionary<string, bool>();
LoopControls(checkBoxes, this.Controls);
}
private void LoopControls(Dictionary<string, bool> checkBoxes, Control.ControlCollection controls)
{
foreach (Control control in controls)
{
if (control is CheckBox)
checkBoxes.Add(control.Name, ((CheckBox) control).Checked);
if (control.Controls.Count > 0)
LoopControls(checkBoxes, control.Controls);
}
}
请记住容器控件可以包含子项,因此您可能也想检查它们。
答案 3 :(得分:8)
像这样,也许(如果它在Windows Forms中):
foreach(var checkBox in myForm.Controls.OfType<CheckBox>())
{
//Do something.
}
答案 4 :(得分:1)
创建它们后,获取值的引用列表,然后您可以遍历列表。
答案 5 :(得分:0)
我知道这已经过时了,但我想象的很容易。
只需将所有复选框添加到List<Checkbox>
,所有复选框状态都在列表中,即使它们在列表中的更改也会更改。
List<Checkbox> checkboxes = new List<Checkboxes>();
checkboxes.Add(chk1);
checkboxes.Add(chk2);
//So add all checkboxes you wanna iterate
foreach(Checkbox checkbox in checkboxes){
//Do something using checkbox object
}
希望这会有所帮助:)
答案 6 :(得分:0)
myForm.Controls.OfType<CheckBox>().ToList().ForEach(c => c...);
如果复选框位于GroupBox或Panel中,则使用其名称代替“ myForm”