1

ShowDialog で得られる従来の OK またはキャンセル状態よりも多くの情報、つまりカスタム ダイアログ フォームのテキスト ボックスからの文字列が必要です。

どういう論理なのか気になります。私はそれを次のように呼びたいと思います:

CustomDialog d = new CustomDialog();
DoStuffWith(d.ShowDialog().CustomString);

もちろん、返される結果にはカスタム クラスが必要です。次のように定義しましょう。

class CustomDialogResult
{
    public string CustomString { get; private set; }

    public CustomDialogResult(string customString)
    {
        this.CustomString = customString;
    }
}

次に、CustomDialog : Form の ShowDialog メソッドを newverride する必要があります。フォームの親の表示から始めることができると思います。また、結果を設定するイベント ハンドラーを [OK] ボタンに追加します。

public CustomDialogResult CustomDialogResult { get; private set; }

private void buttonOK_Click(object sender, EventArgs e)
{
    this.Result = new CustomDialogResult(this.TextBoxCustom.Text);
    this.Close();
}

public CustomDialogResult ShowCustomDialog()
{
    this.Show(Form.ActiveForm);
}

ご覧のとおり、問題は [OK] ボタンがクリックされるのを待ってから this.Result を返すことにあります。Thread.Sleep(0) または ManualResetEvent を使用できますが、それではダイアログ フォームへの入力がブロックされます。これについてどうすればいいですか?醜い構文を使用できることはわかっていますが、ShowDialog がそれを適切に行うのであれば、できる方法が必要です。:)

4

2 に答える 2

3

OpenFileDialogを考えてみましょう。

標準の OK 結果を使用し、プロパティとメソッドを通じて追加情報を公開するだけです。

これを自分で行うには、Ok ボタンのDialogResultを DialogResult.OK に設定するだけで、呼び出しフォームはプロパティまたはメソッドを通じて追加情報を問い合わせます。

したがって、呼び出しコードは次のようになります

  CustomDialog d = new CustomDialog();

  if(d.ShowDialog() == DialogResult.OK)
  { 
      CustomDialogResult foo = d.CustomDialogResult;
      DoStuff(foo.CustomString); 
  }
于 2011-04-25T01:37:56.397 に答える
2

メソッドShowDialog()で呼び出しをラップするだけです。ShowCustomDialog()そうすれば、すべての「魔法」を無料で手に入れることができます。

于 2011-04-25T01:25:31.087 に答える