0

我有一个 MDI 应用程序。其中一种形式需要能够同时打开它的多个实例。在这个应用程序中,我有一个程序类。对于表单的每个实例,我需要在每个表单中放置一个 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

我强烈怀疑问题在于你有一个 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 中,对象通过引用传递(即对象的引用被传递,而单个对象位于一个位置,由引用它的所有变量使用)。这意味着当你这样做时:

tfrmWeeklyIndividualBudgets.Program = this.Program;

您有两个使用完全相同的对象的“程序”变量。

为了避免这种情况,您需要构造一个新版本的程序对象来分配。有时,人们会创建一个 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 回答