【问题标题】:Recursively getting IDs of all Checkboxes checked递归获取所有复选框的 ID
【发布时间】:2011-08-21 04:04:07
【问题描述】:

我有一个名为 pnlCategories 的 ASP.NET 面板。我要做的是创建一个函数,该函数返回在此面板中选中的所有复选框的 List 通用列表。此函数必须遍历其他子控件(包括其他面板和表格)才能找到所有复选框。任何人有任何想法如何做到这一点?顺便说一下,这是 C#。

【问题讨论】:

  • 您可以使用 javascript 构建一个 id 字符串,然后在 C# 中解析该字符串以创建列表。

标签: c# asp.net recursion traversal


【解决方案1】:

简单,也未经测试。这可以调整为仅收集控件 ID,但这更易于重用,并且在公共库中非常有用。

    public static void FindControlsRecursive(Control root, Type type, ref List<Control> list)
    {
        if(root.Controls.Count != 0)
        {
            foreach(Control c in root.Controls)
            {
                if(c.GetType() == type)
                    list.Add(c);
                else if (c.HasControls())
                    FindControlsRecursive(c, type, ref list);
            }
        }
    }

及用法:

var checkboxes = new List<Control>();
FindControlRecursive(pnlCategories, typeof(CheckBox), ref checkboxes);

var ids = checkboxes.Select(c => c.UniqueID).ToList(); // or however you'd like to get them.

【讨论】:

  • 试过这个,但由于某种原因它根本没有找到任何控件。现在想弄清楚为什么。
  • 您在页面生命周期的哪个阶段寻找控件?您是在回发后还是第一次加载页面时寻找它们?
  • 好的,这对我有用。以前没有用的原因是我自己的错。这段代码很好用,谢谢!
【解决方案2】:

我想说这样的事情(改编)可能会奏效。我还没有测试过这个,但它应该能让你靠近某个地方。

public List<CheckBox> FindAllCheckBoxControls(WebControl webControl)
{
     if(webControl.Controls.Count == 0)
         return new List<CheckBox>();

     var checkBoxes = webControl.Controls
          .Where(x => x.GetType() == typeof(CheckBox));
          .Select(x => x as CheckBox)
          .ToList();

     webControl.Controls.ToList().ForEach(control =>
        {
             checkBoxes.AddRange(FindAllCheckBoxControls(control));
        });

     return checkBoxes.Distinct();
}

【讨论】:

  • 试过这个,但得到一堆错误。 Linq 代码似乎不正确。
猜你喜欢
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 2018-08-02
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
相关资源
最近更新 更多