0

を使用するWindows FormプロジェクトがありますMDI。開いている編集可能なフォームからデータを保存するメソッドがあり、このメソッドはさまざまなイベントに対して呼び出されます。ただし、親のフォームbefore closeイベントでも使用します。このイベントでは、開いているすべてのMDI子をチェックし、編集可能なフォームがあるかどうかを確認し、ある場合は保存を要求します。それ以外は、ActiveMdiChildが編集可能かどうかだけを気にし、それだけを保存するように依頼します。

この仕事をする方法は次のとおりです。

protected void AskForSaveBeforeClose(object sender)
{
    //Get the active child
    BaseForm activeChild = this.ActiveMdiChild as BaseForm;
    //Casting to MainForm return null if the sender is child form
    Form mainForm =  sender as MainForm;
    //If the before close event comes from the parent loop all forms 
    if (mainForm != null)
           {
        foreach (BaseForm f in MdiChildren)
        {
            if (f.isEditable == true)
            {
                if (MessageBox.Show("To Do Do You Want To Save from MainForm " + f.Text, "Status",
                         MessageBoxButtons.YesNo,
                         MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    f.Save();
                }
            }
        }

           }
    //if the event is not from the parent's before close just ask for the active child 
    else if (mainForm == null && activeChild != null)
    {
        if (activeChild.isEditable == true)
        {
            if (MessageBox.Show("To Do Do You Want To Save from AC ", "Status",
                      MessageBoxButtons.YesNo,
                      MessageBoxIcon.Information) == DialogResult.Yes)
            {
                activeChild.Save();
            }
        }
    }
}

BaseForm親フォームも誰もが継承するフォームです。今のところ、コードを1つのメソッドにまとめることができたので、このメソッドのみを呼び出しますが、2つの部分がほぼ同じであるにもかかわらず、ロジックを最適化する方法がわかりません。

4

3 に答える 3

3

関数を使用する。それらのコードを関数に入れ、必要に応じてパラメーター化します。

図式:

void askToSave (Baseform f) {
    if (f.isEditable == true)
    {
        if (MessageBox.Show("To Do Do You Want To Save from MainForm " + f.Text, "Status",
                 MessageBoxButtons.YesNo,
                 MessageBoxIcon.Information) == DialogResult.Yes)
        {
            f.Save();
        }
    }
}

そして、ifステートメントのネストを取り除くことができます:

    if (f.isEditable == true && 
        MessageBox.Show("To Do Do You Want To Save from MainForm " + f.Text, ....

これは、&&(のような||)が短絡演算子であるために機能します。つまり、条件が改ざんされるとすぐに、左から右に、残りのオペランドは評価されません。

于 2013-02-07T09:45:27.657 に答える
2

ループするコレクションを作成することもできます。

protected void AskForSaveBeforeClose(object sender) {   
    //Get the active child
    BaseForm activeChild = this.ActiveMdiChild as BaseForm;
    //Casting to MainForm return null if the sender is child form
    Form mainForm =  sender as MainForm;

    //Create collection to loop through
    List<BaseForm> formsToCheck = new List<BaseForm>();
    if (mainForm != null && MdiChildren != null && MdiChildren.Any())
        formsToCheck.AddRange(MdiChildren);
    if (mainForm == null && activeChild != null)
        formsToCheck.Add(activeChild);

    // Only check editable forms
    formsToCheck = formsToCheck.Where(f => f.IsEditable).ToList();

    // Loop through forms
    foreach (BaseForm f in formsToCheck) {
        var fromText = "MainForm " + f.Text;
        if (f == activeChild)
            fromText = "AC";
        if (MessageBox.Show("To Do Do You Want To Save from " + fromText, "Status",
                 MessageBoxButtons.YesNo,
                 MessageBoxIcon.Information) == DialogResult.Yes) {
            f.Save();
        }       
    }
}
于 2013-02-07T09:50:45.507 に答える
0

有効なフォームをリストに収集できます。ここで、Tは、ビジネスロジックに必要なすべてのものを実装するインターフェイスにすることができます(リスト自体で十分な場合もあります)。要素(フォーム)をこのリストに追加する必要があります。その後のサイクルで、このリストを繰り返し処理して、メッセージボックスを表示し、必要に応じて保存できます。最悪の場合、私が理解できる限り、リストにはメインフォームのみが含まれます。

于 2013-02-07T09:51:26.507 に答える