0

彼ら!アプリケーションには、作業フォーム (frmMain) と設定フォーム (frmSettings) の 2 つのフォームがあります。frmSettings には、保存とキャンセルの 2 つのボタンがあります。frmMain では、次のアプローチを使用して frmSettings を表示します。

 private void btnSettings_Click(object sender, EventArgs e)
        {
            frmSettings = new SettingsForm();
            frmSettings.ShowDialog();
            // ...
        }

問題は、frmMainでどのボタンが押されたかを検出する方法がわからないことです-保存またはキャンセル。プログラムのさらなるロジックは、この事実に依存します。私はこのようなものが必要です:

private void btnSettings_Click(object sender, EventArgs e)
        {
            frmSettings = new SettingsForm();
            frmSettings.ShowDialog();

            if(/* frmSettings.SaveButton.WasClicked == true */)
            {
                InitializeServices();
            }
            // ...
        }

フォーム間のこのような種類の相互作用を実装する方法について、アドバイスをお願いします。ボタンの状態を保存するためにグローバル変数を使用しないほうがよいでしょう。事前に感謝します。

4

4 に答える 4

3

ShowDialog は、それを知ることができる DialogResult オブジェクトを返します。必ず:

保存ボタンのクリックイベントで、にthis.DialogResult設定DialogResult.OK

キャンセル ボタンのクリック イベントで、に設定this.DialogResultします。DialogResult.Cancel

private void btnSettings_Click(object sender, EventArgs e)
{
   frmSettings = new SettingsForm();
   if(frmSettings.ShowDialog() == DialogResult.OK)
   {
       InitializeServices();
   }
   //.......    
}

DialogResult を @tsiorn の回答として管理するように編集しました。各ボタンにそのプロパティを設定する代わりに、フォームの DialgoResult を設定します。

于 2012-10-12T16:40:43.397 に答える
1

これを処理するには、DialogResult を使用する必要があります。フォーム設定ウィンドウで、結果を次のように設定できます。

protected void btnSave_Click(object sender, EventArgs e) {
    DialogResult = System.Windows.Forms.DialogResult.OK
    this.close;
}
protected void btnCancel_Click(object sender, EventArgs e) {
    DialogResult = System.Windows.Forms.DialogResult.Cancel;
    this.close;
}

それで ...

private void btnSettings_Click(object sender, EventArgs e) 
        { 
            frmSettings = new SettingsForm(); 
            frmSettings.ShowDialog(); 

            if(frmSettings.DialogResult == DialogResult.OK) 
            { 
                // save
                InitializeServices(); 
            } 
            //  ... 
        } 
于 2012-10-12T16:41:30.230 に答える
0

可能な値の列挙から始めます。

public enum ExitMethod
{
    Other, //this should be first, as a default value
    Save,
    Cancel,
    Error
}

次にSettingsForm、そのタイプのプロパティを作成します。

public ExitMethod ExitMethod { get; private set; }

SettingsForm の保存/終了メソッドで、そのプロパティを適切な列挙値に設定し、メイン フォームでそのプロパティ値を読み取ることができます。

于 2012-10-12T16:40:24.567 に答える
0

frmSettings ウィンドウで、ボタンの Click イベントを処理します。次に、ダイアログの結果を設定します。

void frmSettings_Save_Click(object sender, EventArgs e)
{
  this.DialogResult = DialogResult.OK;
}

void frmSettings_Cancel_Click(object sender, EventArgs e)
{
  this.DialogResult = DialogResult.Cancel;
}

メイン フォームでは、結果を取得して評価するために次のようなことを行います。

DialogResult answer = frmSettings.ShowDialog();
if (answer == DialogResult.OK)
{
  ...
}

追加情報と使用方法については、http: //msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult.aspxを参照してください。

于 2012-10-12T16:43:45.050 に答える