none
C# Daten von einem DialogFenster zur sendenden Page weitergeben RRS feed

  • Frage

  • Hallo,

    aus einer Page heraus rufe ich ein Window als modalen Dialog auf.
    Nach dem Schließen des Dialoges möchte ich in der Page die dort erstellten Daten nutzen.

    Wie bekomme ich die Daten vom Window zur Page?

    Die Daten schreibe ich im Window in ein Object einer weiteren selbst geschriebenen Klasse MyDataClass.
    D.h. ich erzeuge in der Page und im Window jeweils das Objekt:

    MyDataClass myDataClass = new MyDataClass();

    Solange das Window offen ist, sehe ich die Daten auch in der Page ( im Objekt myDataClass),aber sobald ich das Window schließe sind auch in der Page die Werte aus dem Objekt verschwunden (leer).

    Was mache ich falsch? Wie geht es richtig?

    Frank


    www.mehlhop.com


    • Bearbeitet frank me Montag, 23. Dezember 2013 16:47
    Montag, 23. Dezember 2013 16:46

Antworten

  • Hallo,
    wenn du ein weiteres Fenster modal öffnest, dann heißt das, das das aufrufende Fenster (bzw. die Seite) nicht mehr bedienbar ist und somit eigentlich auch keine Daten aktualisiert.

    Wie genau transferierst du denn bisher diene Informationen?

    Nachfolgend mal ein kleines Beispiel, wie man es machen könnte. Zuerst die Klasse zur Datenübertragung:

    public class MyDataClass
    {
        public string MyString { get; set; }
    }

    Diese instanzieren wir in der Page und rufen das 2. Fenster auf:

    MyDataClass data = new MyDataClass();
    
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        data.MyString = "Test von der Page aus";
        Window1 wnd = new Window1(data);
        wnd.ShowDialog();//Fenster anzeigen
        MessageBox.Show(data.MyString);//Irgend etwas mit dem String machen
    }

    Im Window1 wird das MaDataClass-Objekt entgegen genommen und aufbewahrt:

    public Window1(MyDataClass data)
    {
        this.data = data;//Daten in de Instanz des 2. Fenster speichern.
        //Genau genommen handelt es sich um die selbe Instanz, da es nur ein Verweis ist.
        InitializeComponent();
        tb.Text = data.MyString;//Übetragene Daten ausgeben
    }
    
    MyDataClass data;

    Beim schließen des Fensters wird der Wert wieder zurück gegeben:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.data.MyString = tb.Text;//Daten in das Objekt speichern
        this.Close();//2. Fenster shcließen
    }

    Dadurch, das es sich bei MyDataClass um eine Klasseninstanz handelt, wird die ganze Zeit immer nur auf das eine Objekt zugegriffen. Das bleibt solange so, bis du mit new eine neue Instanz erstellst.

    Es gibt noch weitere Wege um Daten zurück zu geben. Unter anderem:

    • Events
      Es verhält sich genauso wie bei deiner anderen Frage. Das ist vor allem bei nicht modalen Fenstern nötig.
    • Eigenschaften
      Du erstellt im 2. Window eine (oder mehrere) Eigenschaft(en) die du beim schließen zuweist. Diese Eigenschaften kannst du dann in der Page auslesen.
    • Übergeben von Instanzen
      Das ist das, wie du es gelöst hast. Theoretisch kannst du auch die Instanz der Seite überreichen, was aber ein schlechter Programmierstilt ist, da Window1 und Page sich gegenseitig kennen müssen. Bei deiner implementation kennt nur die Page das Window und nicht anders herum.

    Wenn du sicher stellen willst, dass sich die Seite auch aktualisiert, wenn das 2. Fenster noch offen ist, dann würde ich auf ein nicht modales Fenster setzen und mit Events arbeiten. (Oder im Setter deiner Eigenschaft in MyDataClass die Seite aktualisieren.)


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert frank me Montag, 23. Dezember 2013 17:31
    Montag, 23. Dezember 2013 17:08
    Moderator

Alle Antworten

  • Hallo,
    wenn du ein weiteres Fenster modal öffnest, dann heißt das, das das aufrufende Fenster (bzw. die Seite) nicht mehr bedienbar ist und somit eigentlich auch keine Daten aktualisiert.

    Wie genau transferierst du denn bisher diene Informationen?

    Nachfolgend mal ein kleines Beispiel, wie man es machen könnte. Zuerst die Klasse zur Datenübertragung:

    public class MyDataClass
    {
        public string MyString { get; set; }
    }

    Diese instanzieren wir in der Page und rufen das 2. Fenster auf:

    MyDataClass data = new MyDataClass();
    
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        data.MyString = "Test von der Page aus";
        Window1 wnd = new Window1(data);
        wnd.ShowDialog();//Fenster anzeigen
        MessageBox.Show(data.MyString);//Irgend etwas mit dem String machen
    }

    Im Window1 wird das MaDataClass-Objekt entgegen genommen und aufbewahrt:

    public Window1(MyDataClass data)
    {
        this.data = data;//Daten in de Instanz des 2. Fenster speichern.
        //Genau genommen handelt es sich um die selbe Instanz, da es nur ein Verweis ist.
        InitializeComponent();
        tb.Text = data.MyString;//Übetragene Daten ausgeben
    }
    
    MyDataClass data;

    Beim schließen des Fensters wird der Wert wieder zurück gegeben:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.data.MyString = tb.Text;//Daten in das Objekt speichern
        this.Close();//2. Fenster shcließen
    }

    Dadurch, das es sich bei MyDataClass um eine Klasseninstanz handelt, wird die ganze Zeit immer nur auf das eine Objekt zugegriffen. Das bleibt solange so, bis du mit new eine neue Instanz erstellst.

    Es gibt noch weitere Wege um Daten zurück zu geben. Unter anderem:

    • Events
      Es verhält sich genauso wie bei deiner anderen Frage. Das ist vor allem bei nicht modalen Fenstern nötig.
    • Eigenschaften
      Du erstellt im 2. Window eine (oder mehrere) Eigenschaft(en) die du beim schließen zuweist. Diese Eigenschaften kannst du dann in der Page auslesen.
    • Übergeben von Instanzen
      Das ist das, wie du es gelöst hast. Theoretisch kannst du auch die Instanz der Seite überreichen, was aber ein schlechter Programmierstilt ist, da Window1 und Page sich gegenseitig kennen müssen. Bei deiner implementation kennt nur die Page das Window und nicht anders herum.

    Wenn du sicher stellen willst, dass sich die Seite auch aktualisiert, wenn das 2. Fenster noch offen ist, dann würde ich auf ein nicht modales Fenster setzen und mit Events arbeiten. (Oder im Setter deiner Eigenschaft in MyDataClass die Seite aktualisieren.)


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert frank me Montag, 23. Dezember 2013 17:31
    Montag, 23. Dezember 2013 17:08
    Moderator
  • Super! :)

    Das hab ich gut und schnell verstanden. :)
    Musste ebend das MyDataClass-Object mit rüber geben, statt ein neues zu erzeugen,
    damit ich wirklich nur mit einem arbeite.

    Danke schön! :) 


    www.mehlhop.com

    Montag, 23. Dezember 2013 17:33