2

私はモーダル ダイアログを使用したい MDI アプリケーションを持っています...はい、MDI の場合、これは原則に少し反することを知っています...とにかく、私のメイン ウィンドウは「ワークスペース」のようなものです。それから他のもの。

トピックに戻りますが、MDI-Child が閉じるのを待つにはどうすればよいですか? いくつかのコード例:

  public void DoSomething() {
    String searchterm = this.TextBox1.Text;
    MyItem result = MySearchForm.GetItem(searchterm);

    if(MyItem != MyItem.Empty) {
        // do something
    }
  }

MySearchForm はメイン ウィンドウの MDI 子であるため、ShowDialog() は使用できませんが、ブロック メソッドを使用して、ウィンドウが閉じて結果が返されるのを待ちたいと考えています。別のスレッドで呼び出して、そのスレッドが終了するのを待つことを考えましたが、それも MDI では機能しません。

誰かがアイデアを持っていますか?

4

4 に答える 4

2

MDIアプリケーションでダイアログを使用することはごく普通のことであり、MDI規則に違反していません。MDIの子ウィンドウにしないでください。モーダルにすることはできないので、それは悪いことです。そして、それを非モーダルにすると、ユーザーがウィンドウを最小化したときに混乱することが起こります。

ShowDialog(owner)またはShow(owner)メソッド(それぞれモーダルおよび非モーダル)を使用して、MDI親を所有者として渡すだけです。ダイアログは常に子ウィンドウの上に表示されます。通常、StartPosition = Manualが必要で、Locationを設定して、親フレーム内の適切な位置で確実に起動できるようにします。

于 2010-06-28T13:31:37.347 に答える
2

メイン フォームを無効にしてから、子フォームが閉じたら再び有効にしてみてください。次のようになります。

  public void DoSomething() 
  {
    searchForm.Show();
    searchForm.SearchTerm = this.TextBox1.Text;
    searchForm.FormClosing += new FormClosingEventHandler(searchForm_FormClosing);

    this.Enabled = false
  }

  void searchForm_FormClosing(object sender, FormClosingEventArgs e)
  {
    this.Enabled = true;

    // Get result from search form here
    MyItem result = searchForm.GetItem();
    if(MyItem != MyItem.Empty) // do something
  }
于 2010-06-28T12:06:33.003 に答える
0

メイン ウィンドウの FormClosing イベントをオーバーロードします。

void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        // User clicked the close button.
        // Cancel if dialogs are open.
        if (dialogsOpen)
        {
            e.Cancel = true;
        }
    }
}
于 2010-06-28T11:49:21.673 に答える
0

フォーカスを失った場合は、MDI の子にフォーカスを戻すだけです。MDI 子ウィンドウで LostFocus イベントをフックし、this.SetFocus();を使用します。

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.enter.aspx

于 2010-06-28T10:34:50.087 に答える