Autor Beitrag
Firehunter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 13.11.12 21:00 
Hallo zusammen!

Ich habe da ein Problem was ich irgendwie nicht ganz verstehe ...

Das hat man davon wenn man mal ein ein Programm mit grafischer Oberfläche ausnahmsweise in C# schreiben will...

Folgendes liegt an:

Ich habe 2 Forms, meinen sm_mainframe als Hauptform mit menustrip und ganz vielen Steuerelementen auf Tabseiten verteilt und ich habe meinen Druckdialog (printframe) zur Auswahl von einigen Druckoptionen und dem Starten des Drucks.

Der printframe behandelt den ganzen Druckauftrag und somit muss er auf diverse Steuerelemente aus dem sm_mainframe zugreifen... klappt auch soweit ganz gut...

Habe die entsprechenden Steuerelemente auf Public gesetzt und lade mir die Instanz im printframe.cs mit Hilfe von

ausblenden C#-Quelltext
1:
sm_mainframe sm_main = new sm_mainframe();					


Der compile klappt und die Runtime startet... ich kann meinen Druckdialog öffnen und greift auch auch die Steuerelemente zu vom sm_mainframe und holt dort die Werte.

Nun aber zu meinem Problem... die Werte die er mir holt sind IMMER nur die Werte, welche zu beginn der Runtime in den Steuerelementen existierten, d.h. wenn ich nachträglich einem Steuerelement einen anderen Wert gebe, übernimmt er dies nicht bei der Abfrage im Printframe, sondern behält weiterhin den ursprünglichen Wert bei..

Meine Frage ist nun ... wie erzähle ich ihm dass er die aktuellen vorhandenen Informationen nehmen soll.. und nicht die, welche bei beginn der Runtime existierten.

Poste auch gerne diverse Codeabschnitte...

Bedanke mich im Vorfeld für die Antworten und die Hilfe :)

MfG
Firehunter
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 13.11.12 21:27 
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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
public string PrintTitle {
  get {
    return tbTitle.Text;
  }
}


Und in der Printform auslesen:
ausblenden 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:
ausblenden 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:
ausblenden 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".

Für diesen Beitrag haben gedankt: Firehunter
Firehunter Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 13.11.12 22:36 
Hi!

Danke erstmal für die schnelle Antwort :) Hab es btw nun auch hinbekommen dank deiner Hilfe.
Komm mir gerade etwas blöd vor xD das ich das mit der neuen Instanz so derbe verpeilt habe... Naja nun läuft es ja endlich ... nach unzähligen Stunden rumwühlen...

Ganz zu Anfang hatte ich es auch übrigends mit den Eigenschaften für meine einzelnen Steuerelemente versucht bzw gemacht... allerdings wurde mir das nachher zu viel weswegen ich dann den direkten Zugriff gewählt habe. Waren mir irgendwann einfach zu viele und bevor es nicht sauber funktionierte wollte ich mir nicht zu viel Zeit mit den ganzen Eigenschaften verschwenden.

Normalerweise halte ich aber auch sehr viel von Trennung der einzelnen Abschnitte und Funktionen... allderings find ich das bei PHP und den anderen Sprachen die ich bislang hauptsächlich geschrieben habe einfacher ;)

Ich danke nochmals :)

MfG
Firehunter
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 14.11.12 13:48 
Hallo Firehunter,

wenn du weitere Projekte mit C# realisieren möchtest, kann ich dir meinen Artikel Kommunikation von 2 Forms anbieten, indem die Anfängerfallen erklärt werden sowie die gängigen Lösungen (Eigenschaften, Ereignisse).