C # Klassenobjekt in mehreren Formularen ändert alle Variablen innerhalb der Klasse

StackOverflow https://stackoverflow.com/questions/3198687

  •  02-10-2019
  •  | 
  •  

Frage

ich eine MDI-Anwendung haben. Eine der Formen muss in der Lage sein, mehrere Instanzen zu haben, es zur gleichen Zeit öffnen. Innerhalb dieser App habe ich eine Klasse-Programm. Für jede Instanz des Formulars muß ich in jedes Formular ein Programmobjekt platzieren. Dies funktioniert jedoch wird jedes Mal Daten verändert es alle Programmänderungen Objekte innerhalb all die mehrere Instanzen des Formulars.

Hier ist die Programmklasse (sehr einfache Klasse bis jetzt):

public class Program
{
string strProgramCode;

public Program()
{ }

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

}

Hier ist der Code für das Formular:

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

Hier ist die CheckMdiChildren Methode:

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();
}
War es hilfreich?

Lösung

Ich vermute stark, das Problem ist, dass du hast ein Program Objekt, das alle Formen zu beziehen. (Das ist sicher, was der Code aussieht.) Geben Sie jedem Formular ein neue Program statt, wenn Sie das Formular erstellen.

Zum Beispiel:

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);

Wenn Sie die neue Form wollen eine Program bekommen basierend auf die bestehenden, sollten Sie eine Clone Methode in Program implementieren und tun:

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

Andere Tipps

Sie sollten ein ProgramFactory Objekt erstellen und irgendeine Art von Methode für das Objekt aufrufen Objekt eines neuen Programms jedes Mal, wenn Sie eine benötigen zu erstellen. Sie erscheinen werden, um die gleiche Instanz erneut verwenden.

In .NET-Objekte als Referenz übergeben werden (das heißt Verweis auf das Objekt werden herumgereicht, während das einzelne Objekt an einem Ort befindet, von allen Variablen verwendet, um es mit Bezug). Dies bedeutet, dass, wenn Sie dies tun:

tfrmWeeklyIndividualBudgets.Program = this.Program;

Sie haben zwei „Programm“ Variablen genau das gleiche Objekt.

Um dies zu vermeiden, müssen Sie eine neue Version des Programms Objekt zuordnen konstruieren. Manchmal schaffen Menschen ein Klon () Methode, dies zu umgehen.

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

// Or

tfrmWeeklyIndividualBudgets.Program = this.Program.Clone();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top