Laden...

Problem bei Zugriff auf HauptForm

Erstellt von ajenkuhn vor 13 Jahren Letzter Beitrag vor 13 Jahren 5.763 Views
Thema geschlossen
A
ajenkuhn Themenstarter:in
16 Beiträge seit 2011
vor 13 Jahren
Problem bei Zugriff auf HauptForm

Hallo,
ich habe eine WindowsForms Applikation unter SharpDevelop begonnen.
Nun habe ich eine HauptForm aus der ich eine 2.Form öffne. In dieser kann ich verschiedene Einstellungen tätigen, welche widerrum in einer config-Datei gespeichert werden. Wie kann ich nun meiner HauptForm beim schliessen der 2.Form sagen, dass sie eine bestimmte Methode (in dem Fall neu laden der Config-Datei) aufrufen soll? Ich habe das Problem, dass meine Hauptform nicht instanziert ist, bzw. dass sie in einem eigenen Thread gestartet wird, und ich so nicht an sie ran komme.

Die Hauptform wird wie folgt geöffnet: (diese datei 'program.cs' wurde automatisch von sharpdevelop angelegt um meine Form bzw Programm zu starten)


internal sealed class Program
	{
		[STAThread]
		private static void Main(string[] args)
		{
			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Application.Run(new MainForm());
		}
		
	}

Grüße
Andreas

D
99 Beiträge seit 2011
vor 13 Jahren

Wieso öffnest du die zweite Form nicht mit einem Form2.show()

oder einem Form2.ShowDialog()

//Edit: Oder hab ich die Frage falsch verstanden?

Ein guter Rat ist nur ein guter Rat für den, der ihn braucht.

A
ajenkuhn Themenstarter:in
16 Beiträge seit 2011
vor 13 Jahren

Die 2.Form geht ja auf. Ich würde einfach gerne aus der zweiten Form eine Methode der HauptForm aufrufen.

A
118 Beiträge seit 2009
vor 13 Jahren

Wenn du das 2. Fenster ja im Hauptfenster aufrufst, hast du ja ein Objekt davon und kannst das Event _FormClosed _abbonieren.

Mfg
Aratar

D
99 Beiträge seit 2011
vor 13 Jahren

Dann musst du die HauptForm der 2. Form bekannt machen. Und zwar nicht direkt sod as du eine zweite Form öffnest sonderm im Konstruktor einfach nur die Klasse übergeben.

also in der 2. Form

Form1 form;


public Form2()
{
   form = new Form1();
}

Hinweis von herbivore vor 13 Jahren

Das ist eine sehr schlechte Idee. Forms sollten sich immer nur in einer Richtung kennen. Bessere Möglichkeiten stehen in [FAQ] Kommunikation von 2 Forms.

Siehe auch den folgenden Hinweis von inflames2k.

Ein guter Rat ist nur ein guter Rat für den, der ihn braucht.

2.298 Beiträge seit 2010
vor 13 Jahren

Hallo ajenkuhn, sieh dir dazu bitte mal [FAQ] Kommunikation zwischen 2 Forms an.

// @Die Dose
Dort macht er aber auf die Weise das Hauptform nicht bekannt, sondern erstellt eine neue Instanz.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

5.299 Beiträge seit 2008
vor 13 Jahren

Ich habe das Problem, dass meine Hauptform nicht instanziert ist, bzw. dass sie in einem eigenen Thread gestartet wird, und ich so nicht an sie ran komme.

Jo, sowas funzt net.
Die anderen Probs wirste IMO nicht lösen können, wennde nicht vorher das geändert hast. Alles Gui muß im GuiThread laufen.

Der frühe Apfel fängt den Wurm.

A
ajenkuhn Themenstarter:in
16 Beiträge seit 2011
vor 13 Jahren

Das mit dem Event klappt allerdings, auch wenn ichs ned unbedingt soooo schön finde, da ich nun alle Felder und den 'Speichern-Button' in der 2.Form auf public setzen muss, da ich ja erst die Werte aus den Feldern abspeichern muss und dann erst auf die Config-Datei neu zugreifen kann. Würde ich mit dem Event in der Hauptform lediglich neu laden und mit dem Event in der 2.Form nur speichern bekäme ich wohl Probleme wer zuerst dran ist (speichern in Form2 / laden in Form1)

@Dose:
Du meinst etwa sowas?

In der Hauptform:


private OptionsForm optionsForm = new OptionsForm(this);

In der 2. Form:


MainForm mainForm;

public OptionsForm(Form mainForm)
		{
			InitializeComponent();
			this.mainForm = mainForm;
		}

private void MethodeXY()
		{
			mainForm.MethodeXY();
		}

Wäre glaube ich sogar etwas schöner wenn das so ginge. In Java hab ich das auch öfter mal so gemacht.

@inflames2k
Werde ich dann mal tun 😃

Trotzdem schonmal Dankeschön für die bereits funktionierende Lösung 😃

Grüße
Andreas

2.298 Beiträge seit 2010
vor 13 Jahren

Das funktioniert auf deine Weise, du solltest jedoch dennoch über ein Event gehen. Deine zweite Form sollte deine Hauptform garnicht kennen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

4.938 Beiträge seit 2008
vor 13 Jahren

Hallo ajenkuhn,

ein Beispielprojekt dafür habe ich bei meinem Artikel Kommunikation von 2 Forms (ganz unten als ZIP-Datei), welches genau die verwendung von Ereignissen zeigt.

Rufst du denn das Optionsfenster modal auf (ShowDialog) oder aber nicht-modal (Show)?
Bei ersterem kannst du doch einfach nach Schließen der Form das Neuladen aufrufen:


// im Hauptform
if (form.ShowDialog(this) == DialogResult.OK)
{
  // hier nun die Konfiguration neu laden
}

Und bei nicht-modalem Fenster einfach auf das FormClosed-Event warten (wie Aratar schon geschrieben hat):


void form_FormClosed(object sender, EventArgs e)
{
   // // hier nun die Konfiguration neu laden
}

Thema geschlossen