Hallo!
Direkter Zugriff auf die GUI einer anderen Form ist eigentlich keine saubere Trennung von Programmlogik und Darstellung. So müsstest Du ja z.B. Deinen Code im Druckdialog ändern, sobald Du in der Hauptform nur eine Combobox durch eine Listbox ersetzt.
Es gibt zwei Möglichkeiten, wie es besser geht: Entweder die Hauptform gibt der Druckform beim Erstellen dieser schon die Werte mit (im Konstruktor oder durch Setzen entsprechender Eigenschaften, die Du in der Druckform dafür anlegst), oder die Hauptform hat entsprechende Eigenschaften, welche die Druckform auslesen kann.
Für den letzten Fall mal ein Beispiel: Du willst dem Druck einen Titel verpassen, der in der Hauptform eingegeben wurde. Eigentlich würdest Du jetzt den Wert auslesen, der in der Textbox
tbTitle steht. Besser ist es, das so zu machen:
In der Hauptform diese Eigenschaft anlegen:
C#-Quelltext
1: 2: 3: 4: 5:
| public string PrintTitle { get { return tbTitle.Text; } } |
Und in der Printform auslesen:
C#-Quelltext
1:
| var printTitle = sm_main.PrintTitle; |
So hast Du die GUI der Printform von der Logik getrennt.
Wie kommst Du jetzt an die "richtigen" Werte? - nun, Du musst auch die richtige MainForm verwenden. Denn in Deinem Code-Schnipsel erstellst Du ja eine neue Instanz der Mainform. Daher hat die dann natürlich die initialen Werte! Daher solltest Du der Druckform beim Erstellen eine Instanz auf die MainForm mitgeben.
Dazu erweiterst Du die Druckform um einen weiteren Konstruktor und ein Feld:
C#-Quelltext
1: 2: 3: 4: 5:
| private sm_mainframe sm_main; public Druckform(sm_mainframe sm_main) : this() { this.sm_main = sm_main; } |
Und beim Erstellen der Druckform in der Mainform:
C#-Quelltext
1:
| var druck = new Druckform(this); |
Schicker wäre es vielleicht noch, nur mit Interfaces zu arbeiten, aber das geht jetzt zu weit. Genau wie Anmerkungen zur Benennung von Typen in C#
Grüße,
Christian
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".