2017-11-13 5 views
-1

私はC#でWinFormアプリケーションを作成しています。 がButtonをクリックするとForm Aが表示されます。今、Form Cを開く前に、パスワード入力画面Form Bを追加したいと思います。入力したパスワードが正しい場合にのみForm Cが開き、それ以外の場合はエラーメッセージが表示されます。 Form Bは、TextBoxコントロールとベリファイButtonコントロールを持っています。DialogShow()を使用してパスワード入力を受け取っていません

/*Form A*/ 
FormB fb; 
private void BtnClick(object sender, EventArgs e) { 
    DialogResult result; 
    //fb can open once at a time 
    if(fb == null){ 
     fb = new FormB(); 
     fb.FormClosed += new FormClosedEventHandler(FormB_FormClosed); 

     //This seems to be not working 
     result = fb.ShowDialog(); 
    } 
    else //FormB already open. Do nothing 
     return; 

    //Only if password entered is correct, proceed 
    if(result == DialogResult.Yes){ //result == cancel 
     //Code to open Form C   //Program never reaches here 
    } 
} 

//Upon closing FormB, reset it to null 
private void FormB_FormClosed(object sender, FormClosedEventArgs e){ 
    if(fb != null) 
     fb = null; 
} 

/* Form B */ 
private const string password = "xxxyyyzzz"; 
private void BtnPW_Click(object sender, EventArgs e){ 
    bool result = Verify(); 
    if(result){ 
     BtnPW.DialogResult = DialogResult.Yes; 
    } 
    else{ 
     MessageBox.Show("Error: Incorrect password"); 
     BtnPW.DialogResult = DialogResult.No; 
    } 
    this.Close();    //Added 
} 

private bool Verify(){ 
    if(TxtBox.Text == password) 
     return true; 
    else 
     return false; 
} 

このコードで何が問題なのか教えていただけますか? Form Aの2番目のifステートメントには到達しません。

編集:私は、正しいパスワードを入力し、Form B上のボタンを押した場合でも、Form Aresultは」DialogResult.Cancel`を取得

+1

*「これは機能していないようです」* - それは非常に有益な発言ではありません。その行に当たったときに何が見えますか?代わりに何が見えますか? 'BtnClick'の最上部にブレークポイントを置いて、実際に呼び出されていることを確認しました。そして、あなたが実際にコードを通るパスに従っていることを確認しましたか? –

+0

申し訳ありません。私はいくつかの文章をスキップしたので、私はちょうど私の質問を修正した。フォームBに正しいパスワードが入力されていても、私のコードは 'フォームC 'を開くことはありません。 –

+0

FormCを開くコードはありません。いくつか追加してください。 –

答えて

1

あなたがForm.Closeメソッドを呼び出した場合は、そのフォームの後、DialogResultプロパティDialogResult.Cancelに設定されていても、フォームのDialogResultプロパティをDialogResult.None以外に設定する必要があります。

あなたのコードはそうではないようですモーダルダイアログを処理するために通常使用されるもの。
ShowDialogがあなたのcをブロックしていますodeでは、呼び出されたフォームが閉じられるか隠されるまでこの呼び出しを終了しないので、FormBのグローバル変数を保持してFormAのFormBのFormClosedイベントハンドラーを処理する必要はありません。

private void BtnClick(object sender, EventArgs e) 
{ 
    using(FormB fb = new FormB()) 
    { 
     // Here the code returns only when the fb instance is hidden 
     result = fb.ShowDialog(); 
     if(result == DialogResult.Yes) 
     { 
      //open Form C   
     }  
    }  
} 

今、あなたはFormBコードでForm.Closeへの呼び出しを削除し、直接FormBのDialogResultプロパティを設定する必要があり、この時点で、ボタンのDialogResultプロパティを変更しようとしていない、これは動作しません。フォームの非表示に2回目のクリックが必要な場合は、フォームのDialogResultプロパティを直接設定する必要があります。

このように、フォームは非表示(閉じていない)で、コードはFormAのShowDialog呼び出しを終了します。 usingブロックの内部では、引き続きFormBインスタンスを使用してプロパティを読み取り、適切なパスを取ることができます。コードがusingブロックを終了すると、fbインスタンスは自動的に閉じられ、存在しなくなります。

+0

ありがとうございますが、これはBtnPWをクリックしても 'Form B'を閉じることはありません。また、Close()を追加してもフォームは閉じません。これは、BtnPWを2回クリックした後にフォームを閉じます。 –

+0

OOps、私は 'BtnPW.DialogResult = DialogResult.No/Yes'を持っていましたが、これは問題を引き起こしていました。ありがとうございました!これを 'thisDialogResult = DialogResult.No/Yes'に変更すると、すぐに動作し始めました。< –

+0

上記で説明したように、button clickイベント内のButtonのDialogResultプロパティは変更しないでください。コードがイベントハンドラから終了した後、フォームエンジンがDialogResultプロパティを読み取るという保証はありません。実際にはイベントハンドラを呼び出す前にそのプロパティを読み取り、経験したように、そのフォームを閉じるために2回目のクリックが必要でした。フォームのDialogResultプロパティを直接設定することは、このコンテキストに入る正しい方法です。 – Steve

関連する問題