2

私はVisual Studio 2010を使用し frmMainていますが、別のフォームを呼び出す「登録」ボタンがありますnewReg

frmMainこれは、2 番目のフォームを呼び出すボタンのコードです。問題は、MessageBox("So Far So Good")が呼び出されないことです。dialogResult認識されていないようです。

private void btnRegisterNew_Click(object sender, EventArgs e)
{
   // newReg Constructor Call
   newReg = new frmRegisterNew();

   // show form
   newReg.Show();

   if (newReg.DialogResult.Equals(DialogResult.OK)) 
   {
      MessageBox.Show ("So Far So Good");
   }
}

2 番目のフォームには、入力するフィールドと「登録」ボタンがあります。dialogResultプロパティウィンドウとコードで、このボタンを「OK」に設定しました。2 番目のフォームの「登録」ボタンをクリックすると、入力がチェックされ、データベースの更新が試行され、成功した場合は閉じられます。そのコードは次のとおりです。

dbConnection db = new dbConnection();
db.dbConnect();
if (db.dbRegisterVehicle(txtNewReg.Text, txtNewMake.Text, txtNewModel.Text, txtNewColour.Text, OwnerID))
{
   // if insert worked close
   this.DialogResult = DialogResult.OK;
   this.Close();
}
db.dbDisconnect();

何を試すべきか、または見落としている可能性があることは確かです。

4

4 に答える 4

11

使用するShowDialog

newReg = new frmRegisterNew();
var dialogResult = newReg.ShowDialog();

if(dialogResult==DialogResult.OK)
{
    ....
}
于 2013-04-23T21:18:53.080 に答える
2

このShowDialog方法は良い方法ですが、 と の違いに注意してShowくださいShowDialog。後者はmodal、新しいフォームが閉じられるまで元のフォームにアクセスできないことを意味します。これがチェックをブロックする理由であり、必要なものである場合とそうでない場合があります。

を呼び出しShowてもブロックされないため、コードはDialogResultが と等しいかどうかをすぐにチェックしていました (チェックが行われるまでに新しいフォームがほとんど開いていなかったため、OKと等しくはありませんでした)。OK

ShowDialogを使用する場合、 を使用する代わりにShow、新しいフォームのclosedイベントを処理します。

frmRegisterNew newReg = new frmRegisterNew();    
newReg.FormClosed += (s, o) =>
    {
        if (newReg.DialogResult == DialogResult.OK)
        {
            MessageBox.Show ("So Far So Good");
        }
    };
newReg.Show();

これは、コードは引き続き機能し、新しいフォームはモーダルではなくなりますが、新しいフォームが閉じられると、FormClosedイベント ハンドラーが起動されることを意味します。上記のイベント ハンドラーの表記 (これらは匿名メソッドと呼ばれます) に慣れていなくても心配する必要はありませんが、イベント ハンドラーは通常どおり使用できます。

newReg.FormClosed += new FormClosedEventHandler(newReg_FormClosed);

void newReg_FormClosed(object sender, FormClosedEventArgs e)
{
    MessageBox.Show ("So Far So Good");
}
于 2013-04-23T21:29:13.140 に答える
1

DialogResultクラスをインスタンス化し、次のように使用してみてください。

DialogResult dr = new DialogResult();

newReg = new frmRegisterNew();
dr = frmResgisterNew.ShowDialog();
if ( dr == DialogResult.OK )
   //Take an action here.
于 2013-04-23T21:21:07.437 に答える
0

Form.Show()非ブロッキングであり、非常に迅速に戻ります。newReg.DialogResult.Equals(DialogResult.OK))したがって、ユーザーがボタンを押す前にチェックが行われます。さらに、ウィンドウを閉じることに関する次の警告に注意してください。

フォームがモードレス ウィンドウとして表示される場合、フォームが閉じられるとフォームのリソースが自動的に解放されるため、DialogResult プロパティによって返される値は、フォームに割り当てられた値を返さない場合があります。

( Form.DialogResult プロパティ msdn ライブラリ ページ経由)

呼び出すFrom.ShowDialog()か、メイン フォームで対話を維持する必要がある場合は、他のフォームが完了したときに呼び出すデリゲートを渡します。


編集:留意すべき点がいくつかあります:

  • newRegフォームを閉じることに関する上記の警告に加えて、破棄された後にのメッセージ ループ ( を呼び出した関数を含む)からディスパッチされたメソッドからコンテンツにアクセスしようとする場合は注意が必要Close()です。

  • ただし、ShowDialog()代わりに を使用することになった場合、フォームは破棄されません。実際、それ以外に設定するとフォームが自動的に非表示になるため、基本的には何もしません。決定論的なクリーンアップが必要な場合 (おそらく最初に呼び出す理由) 、. そうしないと、フォームは将来の予測できない時点で破棄されます (その間にアプリケーションが異常終了しない場合)。Show()this.Close()DialogResultNoneClose()newReg.Dispose()btnRegisterNew_Click

  • keyboardP で言及されているように匿名関数を使用する場合は、何か問題が発生したときにデバッグが困難になる可能性があることに注意してください (特に、言語とフレームワークに比較的慣れていない場合)。

于 2013-04-23T21:20:10.757 に答える