在ASP.NET面板中查找所有控件?
我正在收集用户信息和保存页面详细信息的页面中有多个面板。 页面面板有文本框,下拉列表,列表框。
当我需要来到这个页面。 如果这些控件有任何值,我需要显示页面。 如何做到这一点?
它归结为枚举控制层次结构中的所有控件:
IEnumerable<Control> EnumerateControlsRecursive(Control parent) { foreach (Control child in parent.Controls) { yield return child; foreach (Control descendant in EnumerateControlsRecursive(child)) yield return descendant; } }
你可以像这样使用它:
foreach (Control c in EnumerateControlsRecursive(Page)) { if(c is TextBox) { // do something useful } }
您可以通过面板控件循环
foreach (Control c in MyPanel.Controls) { if (c is Textbox) { // do something with textbox } else if (c is Checkbox) { /// do something with checkbox } }
如果你把它们嵌套在里面,那么你需要一个recursion的函数。
我知道这是一个旧的职位,我真的很喜欢基督教libardo的解决scheme。 然而,我不喜欢这样的事实,为了产生一整套元素到外部的范围,我将不得不迭代这些元素,而只是从内部范围到当前范围内自己产生这些元素。 我更喜欢:
IEnumerable<Control> getCtls(Control par) { List<Control> ret = new List<Control>(); foreach (Control c in par.Controls) { ret.Add(c); ret.AddRange(getCtls(c)); } return (IEnumerable<Control>)ret; }
这使我可以像这样使用它:
foreach (Button but in getCtls(Page).OfType<Button>()) { //disable the button but.Enabled = false; }
根据所使用的UI库或语言,容器控件(如面板)会维护一个子控件列表。 要testing一个表单/页面是否有任何数据,您需要recursionsearch每个面板的数据input控件,如文本框。 然后testing任何数据input控件是否包含非默认值的值。
一个更简单的解决scheme将是实现一个观察者类,它附加到您的数据控件的更改事件。 如果观察者被触发,那么你的页面已经改变了。 您需要考虑更改和恢复数据等操作。
这里的Cristian的解决scheme非常类似,它使用recursion和generics来查找页面中的任何控件(可以指定开始search的控件)。