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()メソッドの最後から 2 番目の行を次のように変更します。

OwnerForm form = this.myOwner;

myOwnerおそらく実際には、パブリックな get および set メソッドを持つプライベート プロパティである必要がありますが、これは原理を説明するためのものです。基本的に、子フォームの所有者が、アクセスしたいプロパティを持つフォームであると仮定する代わりに (MDI の世界ではこの仮定は破られています)、必要なフォームへの参照を明示的に作成しています。

補足として、多くの人は、あるフォームのコントロールを別のフォームから操作しているため、コード サンプルをカプセル化の OOP 原則に違反していると見なします。私自身、人道に対するより悪い犯罪を見てきました。

于 2009-10-13T22:23:49.333 に答える