0

MDI アプリケーションがあります。フォームの 1 つは、複数のインスタンスを同時に開くことができる必要があります。このアプリ内に Program クラスがあります。フォームのインスタンスごとに、Program オブジェクトを各フォームに配置する必要があります。これは機能していますが、データが変更されるたびに、フォームの複数のインスタンスすべてに含まれるすべてのプログラム オブジェクトが変更されます。

これが Program クラスです (今のところ非常に単純なクラスです):

public class Program
{
string strProgramCode;

public Program()
{ }

public string ProgramCode
{
    get { return strProgramCode; }
    set { strProgramCode = value; }
}

}

フォームのコードは次のとおりです。

            frmWeeklyIndividualBudgets tfrmWeeklyIndividualBudgets = new frmWeeklyIndividualBudgets();
            tfrmWeeklyIndividualBudgets.Program = this.Program;
            tfrmWeeklyIndividualBudgets.Text = this.Program.ProgramCode.ToString() + " Weekly Budget";
            this.CheckMdiChildren(tfrmWeeklyIndividualBudgets);

CheckMdiChildren メソッドは次のとおりです。

private void CheckMdiChildren(Form form)
{ 

    foreach (Form frm in this.MdiChildren)
    {
        if (frm.GetType() == form.GetType())
        {
            if (frm.GetType().ToString() == "IPAMFinancial_Program_Financial_Breakdown.frmWeeklyIndividualBudgets")
            {
                frmWeeklyIndividualBudgets tfrm = (frmWeeklyIndividualBudgets)frm;
                if (tfrm.Program.ProgramCode == this.Program.ProgramCode)
                {
                    frm.Focus();
                    return;
                }
            }
            else
            {
                frm.Focus();
                return;
            }
        }
    }

    form.MdiParent = this;
    form.Show();
}
4

3 に答える 3

3

問題は、すべてのフォームが参照するオブジェクトが1 つ しかないことにあると強く思います。Program(これは確かにコードがどのように見えるかです。) フォームを作成するときは、代わりに各フォームに新しいものを与えてください。 Program

例えば:

frmWeeklyIndividualBudgets tfrmWeeklyIndividualBudgets = 
    new frmWeeklyIndividualBudgets();

// Give the new form a new Program instance
tfrmWeeklyIndividualBudgets.Program = new Program();
tfrmWeeklyIndividualBudgets.Text = this.Program.ProgramCode.ToString() 
    + " Weekly Budget";
this.CheckMdiChildren(tfrmWeeklyIndividualBudgets);

Program 新しいフォームを既存のフォームに基づいて取得したい場合は、Cloneメソッドを に実装して、次のようにする必要がProgramあります。

tfrmWeeklyIndividualBudgets.Program = this.Program.Clone();
于 2010-07-07T20:54:02.393 に答える
0

.NET では、オブジェクトは参照によって渡されます (つまり、オブジェクトへの参照は渡されますが、単一のオブジェクトは 1 つの場所に置かれ、それを参照するすべての変数によって使用されます)。これは、これを行うと次のことを意味します。

tfrmWeeklyIndividualBudgets.Program = this.Program;

まったく同じオブジェクトを使用する 2 つの「プログラム」変数があります。

これを回避するには、割り当てるプログラム オブジェクトの新しいバージョンを作成する必要があります。これを処理するために Clone() メソッドを作成することがあります。

tfrmWeeklyIndividualBudgets.Program = new Program { set properties here };

// Or

tfrmWeeklyIndividualBudgets.Program = this.Program.Clone();
于 2010-07-07T20:54:45.583 に答える
0

ProgramFactory オブジェクトを作成し、そのオブジェクトに対して何らかのメソッドを呼び出して、必要なたびに新しい Program オブジェクトを作成する必要があります。同じインスタンスを再利用しているようです。

于 2010-07-07T20:55:36.020 に答える