我的页面中有许多面板,我正在收集用户信息并保存页面详细信息。页面面板包含文本框,下拉列表,列表框。
当我需要来到这个页面时。如果这些控件有任何值,我需要显示Page。怎么做?
答案 0 :(得分:28)
归结为枚举控件层次结构中的所有控件:
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
}
}
答案 1 :(得分:4)
您可以通过面板控件循环
foreach (Control c in MyPanel.Controls)
{
if (c is Textbox) {
// do something with textbox
} else if (c is Checkbox) {
/// do something with checkbox
}
}
如果你将它们嵌套在里面,那么你需要一个递归执行此操作的函数。
答案 2 :(得分:1)
我知道这是一篇旧帖子,我真的很喜欢christian libardo's解决方案。但是,我不喜欢这样的事实:为了向外部范围产生一整套元素,我将不得不再次迭代这些元素,只是为了从内部范围到当前范围产生这些元素。我更喜欢:
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;
}
答案 3 :(得分:0)
取决于您使用的UI库或语言,容器控件(如面板)会保留子控件列表。要测试表单/页面是否有任何数据,您需要递归搜索每个面板以获取数据输入控件(如文本框)。然后测试任何数据输入控件是否包含默认值以外的值。
更简单的解决方案是实现一个附加到数据控件的已更改事件的观察者类。如果触发观察者,那么您的页面会发生变化。您需要考虑更改然后还原数据等操作。
答案 4 :(得分:0)
非常类似于Cristian的解决方案,它使用递归和泛型来查找页面中的任何控件(您可以指定开始搜索的控件)。