0

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

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 属性来解决这个问题,直到找到我想要的表单,但这似乎有点牛仔风格。

4

1 回答 1

0

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

public OwnerForm myOwner;

然后将您的ShowFindForm()方法编辑为此:

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

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

OwnerForm form = this.myOwner;

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

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

于 2009-10-13T22:23:49.333 回答