C # использование объекта класса в нескольких формах изменяет все переменные в классе - PullRequest
0 голосов
/ 08 июля 2010

У меня есть приложение MDI. Одна из форм должна иметь возможность открывать несколько ее экземпляров одновременно. В этом приложении у меня есть класс программы. Для каждого экземпляра формы мне нужно поместить объект 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();
}

Ответы [ 3 ]

3 голосов
/ 08 июля 2010

Я сильно подозреваю, что проблема в том, что у вас есть один Program объект, на который ссылаются все формы. (Это, безусловно, то, на что похож код.) Вместо этого присвойте каждой форме new 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();
0 голосов
/ 08 июля 2010

Вы должны создать объект ProgramFactory и вызывать некоторый тип метода для этого объекта, чтобы каждый раз создавать новый объект Program. Вы, кажется, повторно используете тот же экземпляр.

0 голосов
/ 08 июля 2010

В .NET объекты передаются по ссылке (т.е. ссылки на объект передаются, в то время как один объект находится в одном месте, используемом всеми переменными, ссылающимися на него).Это означает, что когда вы делаете это:

tfrmWeeklyIndividualBudgets.Program = this.Program;

У вас есть две переменные «Программы», использующие один и тот же объект.

Чтобы избежать этого, вам нужно создать новую версиюобъект программы для назначения.Иногда люди создают метод Clone (), чтобы справиться с этим.

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

// Or

tfrmWeeklyIndividualBudgets.Program = this.Program.Clone();
...