Entwickler-Ecke

WinForms - Daten zwischen Forms austauschen - rückwärts


chip777 - Mo 19.04.10 13:25
Titel: Daten zwischen Forms austauschen - rückwärts
Hier der Link auf den Thread wie man Daten von einer aufrufenden Form zur aufgerufenen bekommt:
http://www.c-sharp-forum.de/viewtopic.php?t=99033

Aber wie bekomme ich Daten zurück zur Form die aufgerufen hat? Ich hab schon viel im Internet gesucht, auch in der MSDN, aber entweder hab ich es nicht verstanden, oder es war nicht das richtige dabei.
Einige schreiben von Events, andere von Properties. Wäre super wenn mir das jmd etwas erklären könnte.


danielf - Mo 19.04.10 13:41

Das kannst du über eine Referenz auf eine einfachen (out-Parameter) Datentype machen oder über eine komplexe Datenstruktur (die automatisch als Referenz übergeben wird) - sprich einer Klasse.
Konfigurationsklasse:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public class ProjectSettings
{
    public string Path { get; set; }

    public override ToString()
    {
        return string.Format("Path: {0}", Path);
    }
}

Anwendungsklasse:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
ProjectSettings ps = new ProjectSettings{ Path = @"C:\Projects"; };

BfwEditor editorForm = new BfwEditor(ps);

editorForm.Show();

MessageBox.Show("Path: " + editorForm.ProjectSettings);


Kha - Mo 19.04.10 15:14

user profile iconchip777 hat folgendes geschrieben Zum zitierten Posting springen:
Einige schreiben von Events, andere von Properties. Wäre super wenn mir das jmd etwas erklären könnte.
user profile icondanielf ist schon über das Minimalbeispiel hinaus in Richtung (View-)Models gegangen, aber allgemein gilt: Wenn du Show benutzt und sich die Forms live beeinflussen sollen, brauchst du Events. Wenn du ShowDialog benutzt, brauchst du Properties. Worum geht's ;) ?


chip777 - Mo 19.04.10 15:20

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconchip777 hat folgendes geschrieben Zum zitierten Posting springen:
Einige schreiben von Events, andere von Properties. Wäre super wenn mir das jmd etwas erklären könnte.
user profile icondanielf ist schon über das Minimalbeispiel hinaus in Richtung (View-)Models gegangen, aber allgemein gilt: Wenn du Show benutzt und sich die Forms live beeinflussen sollen, brauchst du Events. Wenn du ShowDialog benutzt, brauchst du Properties. Worum geht's ;) ?


Live sollen sie sich nicht beeinflussen, wenn das zweite aufgerufen wurde, dann wird da etwas eingegeben und dann wird es wieder beendet, danach brauch ich dann erst die Daten aus diesem.


Kha - Mo 19.04.10 15:23

Sicher, dass dann nicht ein modaler Dialog besser geeignet wäre? Ich höre die Windows-Design-Guidelines im Hintergrund kreischen... :) .


chip777 - Mo 19.04.10 15:29

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Sicher, dass dann nicht ein modaler Dialog besser geeignet wäre? Ich höre die Windows-Design-Guidelines im Hintergrund kreischen... :) .


Kann schon sein das das besser ist, aber um das feststellen zu können, müsstest du mir vorher mal sage was ein modaler Dialog ist.

Ich bin noch ziemlich neu in der objektorientierten C# Windows Programmierung. Aber für mein Praxissemester während meines Studiums muss ich mich da bisschen reinfinden, dass Problem ist, dass mein Betreuer auch noch nciht viel Ahnung von C# hat und ich so quasi immer nur im Internet nach Infos suchen kann.

Ich hab jetzt ca. 6 Monate Zeit ein ziemlich umfangreiches Programm zu schreiben, und da bin ich natürlich für jede Hilfe dankbar um das Programm schneller, effizienter, und übersichtlicher zu machen.


Kha - Mo 19.04.10 15:51

user profile iconchip777 hat folgendes geschrieben Zum zitierten Posting springen:
Kann schon sein das das besser ist, aber um das feststellen zu können, müsstest du mir vorher mal sage was ein modaler Dialog ist.
Das ist der mit ShowDialog statt Show ;) . Gerade Dialoge für Optionen etc. sollten unbedingt modal angezeigt werden, und das wird zum Glück auch von wirklich fast jedem Programm befolgt.

user profile iconchip777 hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab jetzt ca. 6 Monate Zeit ein ziemlich umfangreiches Programm zu schreiben, und da bin ich natürlich für jede Hilfe dankbar um das Programm schneller, effizienter, und übersichtlicher zu machen.
Ich denke, da bist du bei uns an der richtigen Adresse :) .


danielf - Mo 19.04.10 16:53

Ja der ShowDialog sollte natürlich die Erweiterung zu meinem Ansatz sein.

Damit du dann später Änderungen an der Klasse vornehmen kannst, diese aber erst bei OK übernimmst.

Sprich:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
MeineSettings settings = new MeineSettings();
...
MeinSettings copy = settings.Clone();
SettingsForm settingsFOrm = new SettingsForm(copy);
if (settingsForm.ShowDialog == DialogResult.OK)
{
   settings = copy;
}


chip777 - Di 20.04.10 11:33

Ich muss sagen ich hab dein Beispiel leider noch nicht so ganz verstanden -.-
Wie wäre es vielleicht mit einem einfacherem Beispiel?
Im konkreten Fall will ich aus meiner form main heraus ein neues fenster öffnen:


C#-Quelltext
1:
2:
ProjektWizard myForm = new ProjektWizard(); //Form erstellen  
            myForm.ShowDialog(); //anzeigen


In dieser Form werden einige Eingaben gemacht, diese werden in einer Datei gespeichert. Ich würde jetzt gerne 2 Variablen aus der 2ten Form(also dem ProjektWizard) wieder in die main form übergeben.

Könntest du mir dafür vielleicht nochmal ein paar Zeilen Code schreiben? Ich denke an einem konkreten Beispeil versteh ich es vielleicht besser.

Martin


danielf - Di 20.04.10 11:50

Ich dachte das war ein konkretes Beispiel ;)

Dann nochmal einen Versuche ....


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
MeineSettings settings = new MeineSettings();
...
MeinSettings copy = settings.Clone();
SettingsForm settingsFOrm = new SettingsForm(copy);
if (settingsForm.ShowDialog == DialogResult.OK)
{
   settings = copy;
}


Das Grundgerüst steht.... SettingsForm würdest du nun durch dein ProjektWizard ersetzen.

Was du dabei angezeigt haben willst regelst du a) in der MeineSettings-Klasse (Daten) und b) in der SettingsForm (Anzeige).

Sprich die MeinSettings könnte so aussehen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public class MeinSettings : ICloneable
{
   public string Path { get; set; }
   public string Name { get; set; }

   public Object Clone()
   {
      MeinSettings ms = new MeinSettings { Path = this.Path, Name = this.Name };
   }
}


In der View SettingsForm musst du nun eine Möglichkeit anbieten, wie man die Daten bearbeiten kann.

Das schnellste wäre ein Form mit einem PropertyGrid, welchem du dann das MeinSettings Objekt als DataSource zuweist.

Viel Erfolg


Kha - Di 20.04.10 15:50

user profile iconchip777 hat folgendes geschrieben Zum zitierten Posting springen:
Ich muss sagen ich hab dein Beispiel leider noch nicht so ganz verstanden -.-
Wie wäre es vielleicht mit einem einfacherem Beispiel?
Daniels Gerüst ist für Einstellungen wirklich wunderbar geeignet[*], aber um es ganz einfach zu halten:

C#-Quelltext
1:
2:
3:
4:
5:
class SubForm : Form
{
  ...
  public string Foo { get { return fooTextBox.Text; } }
}


C#-Quelltext
1:
2:
3:
using (var form = new SubForm) // !
  if (form.ShowDialog() == DialogResult.OK)
    DoSomethingWith(form.Foo);


[*]Clone würde ich ohne ICloneable implementieren, das Interface hätte nie in die BCL gelangen dürfen ;) .