【发布时间】:2009-04-23 10:29:25
【问题描述】:
我正在尝试将页面控件的集合与 LINQ 一起使用。 而这有效:
dim l = Me.Controls.OfType(Of TextBox).AsQueryable()
以下返回 ArgumentExceptionError:
dim l = Me.Controls.AsQueryable()
我需要所有控件。有什么帮助吗? 谢谢
【问题讨论】:
我正在尝试将页面控件的集合与 LINQ 一起使用。 而这有效:
dim l = Me.Controls.OfType(Of TextBox).AsQueryable()
以下返回 ArgumentExceptionError:
dim l = Me.Controls.AsQueryable()
我需要所有控件。有什么帮助吗? 谢谢
【问题讨论】:
你试过了吗:
Me.Controls.Cast(Of Control)
出于兴趣,您为什么需要它作为IQueryable? IEnumerable<T> 还不够吗? (这是Cast的结果。)
只调用 AsQueryable 的问题是控件集合没有实现IEnumerable<T>,只是实现了IEnumerable。
【讨论】:
另外,不要忘记控件是可以嵌套的,仅仅向页面询问它的控件只会告诉您直接子级的信息,但不会告诉您这些控件中的控件:
Locate the web forms controls on a page by walking the Controls Collection
此示例仅查找包含在 Page 对象中的控件以及作为页面的直接子级的控件。它不会找到作为控件子级的文本框,而该控件又是页面的子级。例如,如果您将 Panel 控件添加到页面,则 Panel 控件将是 Page 包含的 HtmlForm 控件的子控件,并且可以在此示例中找到。但是,如果您随后将 TextBox 控件添加到 Panel 控件中,则该示例将不会显示 TextBox 控件文本,因为它不是页面的子级或页面子级控件的子级。以这种方式遍历控件的一个更实际的应用是创建一个递归方法,可以调用该方法来遍历遇到的每个控件的 Controls 集合。但是,为清楚起见,下面的示例并未创建为递归函数。
【讨论】: