【问题标题】:How can I iterate through all checkboxes on a form?如何遍历表单上的所有复选框?
【发布时间】:2010-12-19 19:08:27
【问题描述】:

我有一个包含许多动态生成的复选框的表单。在运行时,如何遍历它们中的每一个,以便获取它们的值和 ID?

【问题讨论】:

  • 您说的是 Windows 窗体还是 ASP.NET?

标签: c# winforms checkbox


【解决方案1】:
foreach(Control c in this.Controls)
{
   if(c is CheckBox)
   {
   // Do stuff here ;]
   }
}

【讨论】:

  • 如果控件嵌入在其他控件中,则不起作用。 “这个”不是一切。
  • 是的@Fernando68,您必须创建一个遍历所有“孩子”的循环函数。这是大约 8 年前的答案:D
  • @AllanRamirez 这个答案已经快 9 岁了 :)
  • @MichalFranc 嗨,我知道,但我找到了解决方案。
  • @AllanRamirez 太棒了!
【解决方案2】:

我使用一种适用于任何控件类型的简单扩展方法:

  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);

【讨论】:

  • +1 它们可以嵌套,很好,使用 lambdas 总是一个优点)
  • 这可能比 Control.Controls 更有用
  • 这绝对是最好和最优雅的答案!干得好。
【解决方案3】:

如果是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);
    }
}

请记住,容器控件可以包含子控件,因此您可能也需要检查这些控件。

【讨论】:

    【解决方案4】:

    像这样,也许(如果它在Windows Forms):

    foreach(var checkBox in myForm.Controls.OfType<CheckBox>())
    {   
       //Do something.
    }
    

    【讨论】:

    • 我已经这样做了一段时间 - 只要我知道容器中没有嵌套。您可能会提到您的解决方案还允许在不知情的情况下附加 .Where(c=>c.Checked) (或其他 Linq 表达式)。
    【解决方案5】:

    创建它们后,获取对值的引用列表,然后您可以遍历该列表。

    【讨论】:

      【解决方案6】:

      我知道这是旧的,但它很容易,我可以想象。

      只需将所有复选框添加到List&lt;Checkbox&gt; 中,所有复选框状态都在列表中,即使它们在列表中的 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
      }
      

      希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多