猿问

在ASP.NET中找到控件的更好方法

在ASP.NET中找到控件的更好方法

我有一个复杂的ASP.NET窗体,在一个窗体中甚至有50-60个字段,比如Multiview,在MultiView中,我有一个GridView,在GridView内部,我有几个CheckBoxes.

当前,我正在使用FindControl()方法并检索子ID。

现在,我的问题是,是否有其他方法/解决方案可以在ASP.NET中找到嵌套控件。


牛魔王的故事
浏览 540回答 3
3回答

BIG阳

像往常一样迟到。如果还有人对此感兴趣,那么就有一些相关的问题和答案..我的递归扩展方法用于解决这个问题:public&nbsp;static&nbsp;IEnumerable<T>&nbsp;FindControlsOfType<T>(this&nbsp;Control&nbsp;parent) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;T&nbsp;:&nbsp;Control{ &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(Control&nbsp;child&nbsp;in&nbsp;parent.Controls) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(child&nbsp;is&nbsp;T) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;return&nbsp;(T)child; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(child.Controls.Count&nbsp;>&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(T&nbsp;grandChild&nbsp;in&nbsp;child.FindControlsOfType<T>()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;return&nbsp;grandChild; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}

慕哥6287543

所有突出显示的解决方案都使用递归(这在性能上非常昂贵)。这里是没有递归的更干净的方法:public&nbsp;T&nbsp;GetControlByType<T>(Control&nbsp;root,&nbsp;Func<T,&nbsp;bool>&nbsp;predicate&nbsp;=&nbsp;null)&nbsp;where&nbsp;T&nbsp;:&nbsp;Control&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(root&nbsp;==&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ArgumentNullException("root"); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;stack&nbsp;=&nbsp;new&nbsp;Stack<Control>(new&nbsp;Control[]&nbsp;{&nbsp;root&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(stack.Count&nbsp;>&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;control&nbsp;=&nbsp;stack.Pop(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;match&nbsp;=&nbsp;control&nbsp;as&nbsp;T; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(match&nbsp;!=&nbsp;null&nbsp;&&&nbsp;(predicate&nbsp;==&nbsp;null&nbsp;||&nbsp;predicate(match)))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;match; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(Control&nbsp;childControl&nbsp;in&nbsp;control.Controls)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.Push(childControl); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;default(T);}
随时随地看视频慕课网APP
我要回答