1

子フォームの中にはMDI form、閉じる前に表示するメッセージボックスが必要なものと、質問せずに閉じることができるものがあります。子フォームのapplication.Exit()から呼び出すときの問題のため、私は親のに処理し、それがどこで発生したかを確認します。メッセージボックスが必要な形式で起動された場合は、それ以外の場合はアプリケーションを閉じます。これはすべて、次のコードに実装されています。close eventclose event

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            SEdit se       = this.ActiveMdiChild as SEdit;
            SoEdit soleEdit = this.ActiveControl as SoEdit;
            UppEdit ue      = this.ActiveControl as UpEdit;
            MEdit mat  = this.ActiveControl as MEdit;
            LEdit lse      = this.ActiveControl as LEdit;
            CEdit cle    = this.ActiveControl as CEdit;

            if (se != null || soleEdit != null || ue != null || mat != null || lse != null || cle != null)
            {
                if (MessageBox.Show("Do you want to save before exit?", "Closing",
                      MessageBoxButtons.YesNo,
                      MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    MessageBox.Show("To Do saved.", "Status",
                              MessageBoxButtons.OK,
                              MessageBoxIcon.Information);
                }
            }
         }

私はまだ学んでいますが、そのような長いifステートメントが悪いコードの兆候であることは知っていますが、それを改善する方法がわかりません。この状況を処理する適切な方法は何ですか?

4

5 に答える 5

6

条件を抽出してメソッドを分離します。

private bool AnyChildAlive()
{
   return (this.ActiveMdiChild is SEdit) ||
          (this.ActiveControl is SoEdit) ||
          ...
          (this.ActiveControl is CEdit);
}

次に、このメソッドを呼び出します(ネストされたifステートメントを回避するためにガード条件も使用します)。

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{          
    if (!AnyChildAlive())
       return;

    if (MessageBox.Show("Do you want to save before exit?", "Closing",
           MessageBoxButtons.YesNo, 
           MessageBoxIcon.Information) != DialogResult.Yes)
       return;

   MessageBox.Show("To Do saved.", "Status",
        MessageBoxButtons.OK, MessageBoxIcon.Information);     

}
于 2013-02-01T15:10:06.873 に答える
2

おそらく最良の方法は、次のようなインターフェイスを作成することです。

public interface IFormActions {
  bool AskBeforeClosing();
  void SaveData();
}

次に、フォームごとにそのインターフェイスを実装し、MainForm_FormClosingメソッドで次のようにします。

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
  IFormActions se = this.ActiveControl as IFormActions;
  if ((se != null) && se.AskBeforeClosing()) {
    if (MessageBox.Show("Do you want to save before exit?", "Closing", MessageBoxButtons.YesNo,  MessageBoxIcon.Information) == DialogResult.Yes) {
      se.SaveData();
      MessageBox.Show("Saved", "Status", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
  }
}

これがどのように記述されているかにより、すべてのフォームのインターフェイスを実装する必要はなく、実際に最後の質問をしたいフォームだけを実装する必要があります。

于 2013-02-01T15:10:24.863 に答える
1

目に魅力的なものにしたり、再利用したりするために、検証を別の方法に移行することを検討することをお勧めします。

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (FormIsValid())
    {
        if (MessageBox.Show("Do you want to save before exit?", "Closing",
              MessageBoxButtons.YesNo,
              MessageBoxIcon.Information) == DialogResult.Yes)
        {
            MessageBox.Show("To Do saved.", "Status",
                      MessageBoxButtons.OK,
                      MessageBoxIcon.Information);
        }
    }
}

private bool FormIsValid()
{
    return 
    (this.ActiveMdiChild as SEdit) != null ||
    (this.ActiveControl as SoEdit) != null ||
    (this.ActiveControl as UpEdit) != null ||
    (this.ActiveControl as MEdit)  != null ||
    (this.ActiveControl as LEdit)  != null ||
    (this.ActiveControl as CEdit)  != null;
}
于 2013-02-01T15:09:57.057 に答える
0
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
  var objects = new List<object>
                {
                    this.ActiveMdiChild as SEdit,
                    this.ActiveControl as SoEdit,
                    this.ActiveControl as UpEdit,
                    this.ActiveControl as LEdit,
                    this.ActiveControl as CEdit
                };

        if (objects.Any(x => x != null))
        {
            if (MessageBox.Show("Do you want to save before exit?", "Closing",
                  MessageBoxButtons.YesNo,
                  MessageBoxIcon.Information) == DialogResult.Yes)
            {
                MessageBox.Show("To Do saved.", "Status",
                          MessageBoxButtons.OK,
                          MessageBoxIcon.Information);
            }
        }
     }
于 2013-02-01T15:11:05.143 に答える
0

最善の方法ではありませんがTag、フォームのプロパティを1または0に設定して、次のことを確認できます。

          if (this.ActiveControl.Tag == 1)
            {
                if (MessageBox.Show("Do you want to save before exit?", "Closing",
                      MessageBoxButtons.YesNo,
                      MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    MessageBox.Show("To Do saved.", "Status",
                              MessageBoxButtons.OK,
                              MessageBoxIcon.Information);
                }
            }
于 2013-02-01T15:16:41.460 に答える