如何在Windows窗体的层次结构中找到一页

本文关键字:一页 层次结构 Windows 窗体 | 更新日期: 2023-09-27 18:00:15

.Net 3.5 C#问题:

如果我有一个同时显示多个表单的Windows窗体应用程序,并且说表单"a"是表单"B"的父级,我如何判断表单"B"是否是层次结构中的一个叶(即没有显示的表单将"B"作为父级)?

层次结构通常比这更复杂,我需要按相反的顺序关闭打开的表单(先离开),所以我需要确定哪些没有子表单。

我试过这个

foreach (Form f in topLevelForm.OwnedForms)
{
    bool isLeaf = f.Controls.OfType<Form>().FirstOrDefault() == null;
    if (isLeaf)
    {
        f.Close();
    }
}

但这表明它们都是"叶子",即使它们显然不是,因此我无法控制关闭的顺序。Form类似乎没有一个直接的方法来做到这一点。

有人能提出前进的道路吗?

如何在Windows窗体的层次结构中找到一页

假设这不是MDI应用程序,请尝试按相反的顺序进行:

for (int i = topLevelForm.OwnedForms.Length - 1; i >= 0; --i) {
  topLevelForm.OwnedForms[i].Dispose();
}

首先,除非您明确将表单添加到Controls集合,否则表单永远不会成为另一个表单的子控件。所属窗体是所属窗体,而不是子控件。

假设您正在使此层次结构中的每个for都成为一个拥有的窗体,则只能使用所有者的OwnedForms集合和拥有的窗体的owner属性来遍历关系。如果您打开的表单不是所有的,那么就没有可遍历的关系。