Ich hoffe, meine Überschrift passt. Mir viel nix besseres ein.
Zu meinem Problem:
Ich habe mehrere Forms erstellt, die aber im Grunde alle mit ein und der selben Instanz einer Klasse arbeiten.
Im Grunde sind diese weiteren Fenster nur Fenster, die zur Bearbeitung der Instanz dienen, die in dem Hauptfenster zur Verwendung steht.
Soe öffnet sich z.B. ein neues Fenster, in dem ein neues Passwort fest gelegt werden kann.
Ich habe nun nach einer einfachen Lösung gesucht, wie ich diese instanz komplett dem Passwort-Fenster übergeben kann.
Außerdem soll diese Instanz danach, wenn die Bearbeitung fertig ist, wieder zurück gegeben und gespeichert werden.
Dazu habe ich ShowDialog überladen und zwa wie folgt:
public partial class Form2 : Form
{
private Account acc;
public DialogResult ShowDialog(ref Account acc)
{
// Die Variable acc wird durch den neuen Wert, der mit der Methode
// übergeben wurde, ersetzt
return this.ShowDialog();
// Hier wird dann die eigentliche ShowDialog-Methode aufgerufen,
// damit sie auch ausgeführt wird und der Rückgabewert gegeben wird
}
public Form2()
{
InitializeComponent();
acc = new Account();
// acc wird auf einen Anfangswert gesetzt, damit keine NullReferenceException auftritt
}
}
In der Klasse, die das dann aufruft, sieht es ungefähr so aus:
public partial class Form1 : Form
{
private Account acc;
public Form1()
{
InitializeComponent();
acc = new Account();
// Dem Passwort wird in dem Konstruktor ein Standart-Wert zugewiesen
}
public void ChangePassword()
{
DialogResult dr = new Form2().ShowDialog(ref acc);
// dr kann nun weiter verarbeitet werden
// acc wird wieder zurück gegeben und soll den ursprünglichen Wert von acc aus der Klasse Form1 ersetzen
}
}
Damit habe ich gehofft, dass das Ändern des Passwortes, oder was auch immer noch alles geändert werden kann, nur durch diese eine Zeile geschehen kann.
Auf diese Weise bleibt die Variable private (wo ich sie sonst public gemacht hätte).
Das Problem ist allerdings, dass die ursprügliche Instanz in der Klasse Form1 nicht geändert wird.
Ich habe es überprüfen lassen. In der Form2 wird die Änderung korrekt durch geführt, allerdings wird diese neue Instanz nicht in Form1 übernommen.
Woran liegt das?
Da ich die Variable acc für die ganze Klasse erstellt habe, müsste sie doch auch für jede Methode und somit für die Rückgabe mit ref gelten, oder?
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
Hallo Palladin007,
ref kannst du in solchen Fällen nicht benutzen. Überhaupt hat ref ein andere Wirkung und einen anderen Sinn, siehe [Artikel] Parameter-Übergabemechanismen: call by value vs. call by reference (ref/out).
Du kommst ganz ohne ref aus, weil Klassen in C# von alleine Referenzentypen sind (das sollte man allerdings wirklich wissen). Du musst nur in beiden Klassen dasselbe, übergebene Objekt verwenden und nicht in der zweiten Klasse ein neues erstellen.
Ansonsten geht es hier um ein Standard-Problem, dass nicht nur in der FAQ (siehe [FAQ] Kommunikation von 2 Forms) und im Forum ausführlich besprochen wurde, sondern auch noch unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1 fällt.
BTW: Modale Dialoge sind übrigens out, siehe Warten auf Schließen einer anderen Form [und warum man Dialoge nicht modal machen sollte].
herbivore