Autor Beitrag
ralph71
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Di 17.01.17 15:30 
Hallo,

die Frage wurde schon häufig gestellt, aber immer gleich und meist auch richtig beantwortet (sofern ich das einschätzen kann).
--> Lsg: Im Form1 eine Instanz von Form2 erstellen und dann die Methode aufrufen.

Situation:
Ziel: Ein Button auf Form1 soll die Inhalte in Form2 speichern. Meine Form2 ist im Panel des Form1 bereits geöffnet, zeigt die Werte an und enthält die entsprechende Methode "Save".
Eine neue Instanz von Form2 (Lösung siehe oben) erwartet drei Parameter, die ich in Form1 aber definitiv nicht habe und damit nicht übergeben kann. Zudem frage ich mich, ob der Ansatz über eine neue Instanz da überhaupt richtig wäre...

Da aber Form2 bereits geöffnet ist, muss es doch irgendwie die Möglichkeit geben, diese Methode "Save" sagen wir mal "direkt" aufzurufen?

Danke!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 17.01.17 15:40 
Du mußt dir doch nur die Instanz von Form2 in einer (Member-)Variablen merken und kannst darüber dann dessen Save-Methode aufrufen.

PS: Beachte dann aber auch den Fall, daß der Anwender die Form2 schon geschlossen hat, wenn auf den Save-Button in Form1 geklickt wird.
ralph71 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Mi 18.01.17 15:25 
ich verstehe schon was du meinst, aber ich habe in diesem Fall keine Ahnung wie ich das zu programmieren ist. :-(
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 18.01.17 15:39 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
class Form1
{
  private Form2 form2;

  void OpenForm2()
  {
    form2 = new Form2();
    form2.Show();
  }

  void Save()
  {
    if (form2 != null)
      form2.Save();
  }
}

Ich hoffe, das hilft dir weiter.
ralph71 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Do 19.01.17 12:48 
Danke Dir. Hilft weiter, ABER

jetzt da ich das verstehe, spielt eine andere Sache mit rein:

Form1 startet Save-Methode von Form3
Form2 instanziiert Form3

D.h. Form1 ist das Hauptformular und bindet Form2 und Form3 im Panel ein.
Form3 ist nur über Form2 erreichbar. Form2 instanziiert also immer Form3 mit form3 = new Form3(); und form3.Show();

Dein Quellcode unterstützt jedoch nur 2 "Ebenen". Ich habe 3.

Wenn ich deinen Code entsprechend umsetze, dann müsste ich Form3 aus Form1 instanziieren, Was aber nicht möglich ist.

Mit der Bitte um Hilfe.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 19.01.17 13:19 
Zitat:
Meine Form2 ist im Panel des Form1 bereits geöffnet, zeigt die Werte an und enthält die entsprechende Methode "Save".


Vielleicht gehen wir besser nochmal einen Schritt zurück. Warum muß das Ding das die Daten anzeigt (eine Form) auch das sein das speichert? Das ist eher nicht das was man will. Ich weiß aber nicht genau was dein Save() macht. Vielleicht was ganz anderes als ich bei etwas das Save heißt erwarte.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 19.01.17 13:21 
Dann rufst du eben von Form1 aus eine Methode in Form2 auf, welche dann wiederum Form3 aufruft:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
class Form2
{
  public void Save()
  {
    form3.Save();
  }
}


Ich verstehe trotzdem nicht so ganz deine Formulierung
ralph71 hat folgendes geschrieben:
und bindet Form2 und Form3 im Panel ein. Form3 ist nur über Form2 erreichbar.

Ein Steuerelement selbst kann keine Form einbinden, sondern ruft diese nur auf. Oder meinst du eingebettete Benutzersteuerelemente (UserControls)?

Die Frage von Ralf Jansen ist aber auch berechtigt.

PS: Generell halte ich auch 3 unabhängige nicht-modale Fenster in einer Applikation für kein gutes Design.
Du kannst dir auch mal das Beispielprojekt aus meinem Artikel Kommunikation von 2 Forms (ganz unten) herunterladen und anschauen...
ralph71 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Fr 20.01.17 11:58 
Begriffen habe ich jetzt, dass Form1 eine Referenz auf die Instanz von Form3 benötigt. Mit dieser Referenz kann dann die Methode von Form3 mit der "richtigen" Instanz von Form3 ausgeführt werden.
"new" kann also nicht zum Ziel führen.
Wie bekomme ich diese Referenz von Form3 nach Form1?
Ich weiß, dass sind jetzt Grundlagen der OO-Programmierung.... :-(

Danke!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 20.01.17 12:35 
Am besten gar nicht, so wie ich auch mein Code-Snippet aufgebaut habe, d.h. Form1 kennt nur Form2 und diese wiederum kennt dann Form3.

Das eigentliche Problem scheint auch eher bei dir zu sein, daß du in "Formen" denkst, anstatt datenorientiert, d.h. du solltest dir Datenklassen (Models) anlegen und darauf dann zugreifen (Stichwort: Model-View).