C# 如何遍历表单上的所有复选框?
我有一个表单,它有许多动态生成的复选框。在运行时,我如何遍历它们中的每一个,以便获取它们的值和ID?当它们被创建时,获取一个值引用列表,然后您可以遍历该列表。类似于这样,可能(如果在中):C# 如何遍历表单上的所有复选框?,c#,winforms,checkbox,C#,Winforms,Checkbox,我有一个表单,它有许多动态生成的复选框。在运行时,我如何遍历它们中的每一个,以便获取它们的值和ID?当它们被创建时,获取一个值引用列表,然后您可以遍历该列表。类似于这样,可能(如果在中): foreach(Control c in this.Controls) { if(c is CheckBox) { // Do stuff here ;] } } foreach(myForm.Controls.OfType()中的var复选框) { //做点什么。 } 如果是
foreach(Control c in this.Controls)
{
if(c is CheckBox)
{
// Do stuff here ;]
}
}
foreach(myForm.Controls.OfType()中的var复选框)
{
//做点什么。
}
如果是,您可以尝试以下方法:
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);
}
}
private void按钮1\u单击(对象发送者,事件参数e)
{
字典复选框=新建字典();
LoopControls(复选框,this.Controls);
}
专用void循环控件(字典复选框、Control.ControlCollection控件)
{
foreach(控件中的控件)
{
如果(控件为复选框)
复选框.Add(control.Name,((CheckBox)control).Checked);
如果(control.Controls.Count>0)
LoopControls(复选框,control.Controls);
}
}
请记住,容器控件可以包含子控件,因此您可能也希望检查这些子控件。我使用一种简单的扩展方法,该方法适用于任何控件类型:
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;
}
}
}
公共静态IEnumerable AllControls(此控件起始点),其中T:Control
{
布尔命中=起始点为T;
如果(命中)
{
收益率返回起始点为T;
}
foreach(startingPoint.Controls.Cast()中的var child)
{
foreach(所有控件中的var项(子项))
{
收益回报项目;
}
}
}
然后,您可以这样使用它:
var checkboxes = control.AllControls<CheckBox>();
var复选框=control.AllControls();
使用IEnumerable可以选择如何存储结果,还可以使用linq:
var checkedBoxes = control.AllControls<CheckBox>().Where(c => c.Checked);
var checkedboxs=control.AllControls()。其中(c=>c.Checked);
我知道这很古老,但正如我所能想象的那样,这很容易
只需将所有复选框添加到列表中
,所有复选框的状态都在列表中,即使它们在列表中的UI中更改,也会更改
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
}
列表复选框=新建列表();
复选框。添加(chk1);
复选框。添加(chk2);
//因此,添加所有要迭代的复选框
foreach(复选框中的复选框){
//使用复选框对象执行某些操作
}
希望这有帮助:)你是说Windows窗体还是ASP.NET?+1它们可以嵌套,很好,使用lambdas总是一个优点)这可能比控件更有用。控件这绝对是最好、最优雅的Answer!干得好。我已经做了一段时间了——只要我知道容器中没有嵌套。您可能会提到,您的解决方案还允许将.Where(c=>c.Checked)(或其他Linq表达式)附加到ununknowledge。如果控件嵌入到其他控件中,则不起作用。“这”不是全部。是的@Fernando68您必须创建一个贯穿所有“子对象”的循环函数。这是近8年前的答案:D@AllanRamirez这个答案已经有9年历史了:)@MichalFranc嗨,我知道,但我找到了解决办法。@AllanRamirez真棒!
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
}