我有一个生成布局的XML文件的任务,但是我似乎在识别窗体上的Panel控件时遇到了问题。要识别对象,我使用这样的东西:
foreach (Control c in this.Controls) {
if (c is Button) {
//generate XML...
} else if (c is Panel) {
//generate XML...
}
}
它找到所有控件都很好,但不是Panel对象。 谁能告诉我这里我做错了什么?面板不是控件吗?
答案 0 :(得分:1)
您可以使用此递归功能。
var panels = FindControls<Panel>(aForm).ToList();
IEnumerable<T> FindControls<T>(Control ctrl) where T: Control
{
foreach (Control c in ctrl.Controls)
{
if (c.GetType() == typeof(T)) yield return (T)c;
foreach (var subC in FindControls<T>(c))
yield return subC;
}
}
答案 1 :(得分:1)
面板是一个控件,但您只能获得直接位于表单中的控件,而不是其他控件中的控件。
那么这样的事情怎么样:
void DoRecursive(Control ctrl)
{
foreach (Control subCtrl in ctrl.Controls) DoRecursive(subCtrl);
if (ctrl is Button) etc.
}
或者您的//generate XML...
作为按钮退出foreach
。也许它有一个break
。
答案 2 :(得分:0)
我尝试使用一个简单的表单,在表单上有一个按钮和一个面板,面板内有一个按钮。它找到了第一个按钮和面板。 也许问题是你想访问其父级是面板的控件吗?
答案 3 :(得分:-1)
您的代码应该有效。尝试修改代码以不执行else if
并查看是否可以找到Panel:
foreach (Control c in this.Controls) {
if (c is Panel) {
MessageBox.Show("Hey, I found the " + c.Name + " panel!");
}
}
我们也可以尝试按名称查找它,看看它是什么类型的控件:
foreach (Control c in this.Controls) {
// Looks for a control called 'panel1' - put in your panel's name
if (c.Name == "panel1") {
MessageBox.Show("Hey, I found a " + c.GetType().ToString());
}
}