C# 如何将MDI子级设置为另一个窗体';谁的主人?

C# 如何将MDI子级设置为另一个窗体';谁的主人?,c#,mdi,C#,Mdi,我有一个子窗体,其中有一个find窗体。我将find表单的所有者设置为子表单,如下所示: private void ShowFindForm() { FindForm.Show(this); } 这样我就可以访问它的属性,如下所示: private void FindNext() { TreeNode matchingNode = ... ... etc ... etc OwnerForm form = this.Owner as OwnerForm; form.Tr

我有一个子窗体,其中有一个find窗体。我将find表单的所有者设置为子表单,如下所示:

private void ShowFindForm()
{
  FindForm.Show(this);
}
这样我就可以访问它的属性,如下所示:

private void FindNext()
{
  TreeNode matchingNode = ...
  ... etc
  ... etc

  OwnerForm form = this.Owner as OwnerForm;
  form.TreeView.SelectedNode = matchingNode;
}
public OwnerForm myOwner;
在我将所有者表单推到MDI表单中之前,这种方法工作得非常好,MDI表单会立即获得find表单的所有权,并将其弄得一团糟。我该怎么做

更新:


我可以通过迭代MDI表单的MdiChildren属性来解决这个问题,直到找到我想要的表单,但这似乎有点像牛仔一样。

解决这个问题的简单方法是在子表单上创建一个公共
ownePerform
属性,如下所示:

private void FindNext()
{
  TreeNode matchingNode = ...
  ... etc
  ... etc

  OwnerForm form = this.Owner as OwnerForm;
  form.TreeView.SelectedNode = matchingNode;
}
public OwnerForm myOwner;
然后将
ShowFindForm()
方法编辑为:

private void ShowFindForm()
{
    FindForm.myOwner = this;
    FindForm.Show(this);
}
OwnerForm form = this.myOwner;
然后将子窗体的
FindNext()
方法中倒数第二行更改为:

private void ShowFindForm()
{
    FindForm.myOwner = this;
    FindForm.Show(this);
}
OwnerForm form = this.myOwner;
myOwner
实际上应该是具有公共get和set方法的私有属性,但这只是为了说明原理。基本上,您不是假设您的子表单的所有者是您想要访问其属性的表单(正如您所发现的,这种假设在MDI世界中是不成立的),而是显式地创建对您想要的表单的引用


作为一个旁注,许多人会认为您的代码示例违反了封装的OOP原理,因为您正在从另一种形式操纵一个窗体的控件。我自己也见过更严重的反人类罪。

他。这是有道理的。我要说的是,时间已经晚了,我已经连续6个小时在编程,我还没有喝过红牛。要不就是我没那么聪明!干杯,伙计。