2011-05-31 12 views
2

私はフォームを持っています。その中で、テキストとキャンセルボタンでダイアログを表示する必要があります(状況によっては)。私は自分のフォームでそのボタンのイベントをキャッチしたい、またはそのキャンセルボタンがクリックされたかどうかを知る。C#ダイアログのボタンを別のフォームでクリックする

どうすればいいですか?私はこれが可能であるべきだと考えていますが、どうやって作り出すことができないのですか

私のmainFormから、私はBackgroundWorkerを持っています。 backgroundWorkerが起動すると、(Labelとボタンで)childFormを開き、バックグラウンドタスクが終了したらchildFormを閉じます。私がもっと欲しいのは、childFormのボタンをクリックすると、backgroundWorkerの進行中のタスクをキャンセルする必要があるということです。 解決方法

私のchildFormでは、フォームのcancelBtnとしてCancelButtonプロパティを設定しました。パーソナルプラグインコードは:のMainFormで

private bool cancel; 
    public bool Cancel 
    { 
     get { return cancel; } 
     set { cancel = value; } 
    } 
    // Set the flag as true to indicate that Cancel button was actually pressed 
    private void cancelBtn_Click(object sender, EventArgs e) 
    { 
     Cancel = true; 
    } 

childDlg = new ChildDialog(); 

    // wHILE cALLING 
      backgroundWorker1.RunWorkerAsync(); 
      msg = "Connecting..."; 
      childDlg .set(msg, ""); 
      if (!childDlg .IsAccessible) 
      { 
       // This is caught even when the dialog is closed 
       if (childDlg .ShowDialog() == DialogResult.Cancel) { 
        if (childDlg.Cancel == true) { // Was really cancelBtn pressed 
         // NOW ONLY do my stuff 
        } 
       } 
      } 

Iは、親クラスに@DeveloperX技術、すなわちイベントハンドラを使用しようとしたが、親クラスのメソッドがnverと呼ばれていました。たくさん試しましたが、成功できませんでした。その後、@ RobinJのテクニックを試してみました。私は本当にキャンセルボタンが押されたか、jjst windwが正常に閉じられたかを特定するフラグを追加しなければなりませんでした。

私を助けるtryigのおかげで皆さんに感謝します。私は本当にあなたの助けに感謝します。あなたがダイアログとして表示し、ダイアログ操作の結果を形成する親に通信するDialogResultプロパティを使用する必要があるフォーム上のShowDialog方法を使用する必要があります

おかげ

+0

実際には「Cance」ボタンをクリックする必要はありません。このダイアログは、メインフォームがアクティビティを実行するまで表示されます。アクティビティが終了している場合、ダイアログはメインで閉じる必要があります。ユーザーがキャンセルをクリックすると、メインフォームで他のコードを実行する必要があります。これは厳密なシナリオです。 – Tvd

答えて

1

キャッチする必要がある形でこれを入れてイベント:ダイアログのbtnCancel_Clickイベントで

frmDialog.ShowDialog(); 

そして、この:

return DialogResult.Cancel(); 

申し訳ありませんが、私はここVBやC#を混乱していますが、それはほとんど同じだ場合。

+0

bnクリックイベントは返されません。したがって、Dialog.Cancel();として返すことはできません。 – Tvd

+0

..?
'if(frmDialog.ShowDialog()== DialogResult.Cancel){}'は動作するはずですか...あなたの質問を誤解していますか? – RobinJ

+0

ありがとうRobinJ、それは働いた。しかし、ウィンドウが正常に閉じられたとしても、Dialog.Cancelとして起動します。これを処理するために、ブール値フラグを追加し、キャンセルボタンが押されたかどうかを知るために値をテストしました。どうもありがとう。 – Tvd

0

この方法では、ボタンを所有するフォームのボタンクリックを処理しますが、DialogResultDialogResult.Cancelに設定して、ユーザーがキャンセルボタンを押したことを指定します。

0

ダイアログは、通常、親フォームによるイベント処理が意味を持たないブロッキングイベントです。

モーダルダイアログでない場合は、ポップアップフォームでボタンをクリックしたときにトリガされる1つまたは複数のパブリックイベントをいつでも作成できます。これらのイベントは親フォームによって捕捉されます。

ボタンを親フォームに公開しないでください。恐ろしいプログラミングです。親フォームで次にDialogResult.OkまたはDialogResult.Cancel

のいずれかに

+0

更新された質問を少し説明できますか? – Tvd

2

設定DialogResultプロパティ:

Form form = new Form(); 
DialogResult results = form.DialogResult; 

if(results == DialogResult.Ok) 
{ 

... make magic 

} 
else 
{ 
... 
} 
+0

バックグラウンドタスクが終了するまでフォームを表示したい。 thsのスタイルでは、フォームでbutonを押すと、それだけが先に進められます。これは私が探しているものではありません。 – Tvd

1

単にあなたが親フォームでダイアログ を示し、フォームのイベントを作成し、このイベントを処理することができます ユーザがspeceficパラメータでok fireイベントをクリックし、別のパラメータをキャンセルする場合(dialogresult.cancelなど)

のように擬似的に実装することができます。

public class FormChild : System.Windows.Forms.Form 
{ 
    public event EventHandler DialogCanceled; 
    public event EventHandler DialogConfirmed; 
    public void ShowDialog() 
    { 
     using (var dialogForm = new FormDialog()) 
     { 
      if (dialogForm.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
      { 
       if (DialogConfirmed != null) 
        DialogConfirmed(this,new EventArgs()); 
      } 
      else 
      { 
       if (DialogCanceled != null) 
        DialogCanceled(this,new EventArgs()); 
      } 
     } 
    } 
} 
public class ParentForm : System.Windows.Forms.Form 
{ 
    public void callChild() 
    { 
     using (var f = new FormChild()) 
     { 
      f.DialogCanceled += new EventHandler(f_DialogCanceled); 
      f.DialogConfirmed += new EventHandler(f_DialogConfirmed); 
      f.ShowDialog(); 
     } 
    } 

    void f_DialogConfirmed(object sender, EventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 

    void f_DialogCanceled(object sender, EventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

@DeveloperX、f_DialogCanceledがキャッチされていません。問題のコードを追加しました。 – Tvd

+0

Console.WriteLineにブレークポイントを設定してください( "HEY CANCEL BUTTON IS CAUGHT HER ....")。クリック後に何が起きているかを確認してください。 – DeveloperX

+0

また、childDlgを入れなかったかどうかを確認してください。DialogCanceled + =新しいイベントハンドラ(childDlg_DialogCanceled);ダイアログフォームを表示した後 – DeveloperX