如何将MDI子项设置为另一个表单的所有者?

时间:2009-10-13 22:12:55

标签: c# mdi

我有一个包含查找表单的子表单。我将查找表单的所有者设置为子表单,如下所示:

private void ShowFindForm()
{
  FindForm.Show(this);
}

然后允许我访问它的属性,如下:

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

  OwnerForm form = this.Owner as OwnerForm;
  form.TreeView.SelectedNode = matchingNode;
}

这很好用,直到我将所有者表格推送到MDI表格中,MDI表格迅速取得查找表格的所有权并将其全部搞砸。我该如何解决这个问题?

更新:

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

1 个答案:

答案 0 :(得分:0)

此问题的一个简单解决方案是在您的子表单上创建一个公共OwnerForm属性,如下所示:

public OwnerForm myOwner;

然后将ShowFindForm()方法修改为:

private void ShowFindForm()
{
    FindForm.myOwner = this;
    FindForm.Show(this);
}

然后将子表单的FindNext()方法中倒数第二行更改为:

OwnerForm form = this.myOwner;

myOwner实际上可能应该是具有公共get和set方法的私有属性,但这只是为了说明原理。基本上,不是假设您的子表单的所有者是您要访问其属性的表单(如您所见,MDI世界中断的假设),您明确地创建了对所需表单的引用。 / p>

作为旁注,许多人会认为您的代码示例违反了OOP封装原则,因为您正在从另一种形式操作一个表单的控件。我自己也看到了更严重的危害人类罪。