Entwickler-Ecke

WinForms - Änderungen auf gerufener Form mitbekommen


pascalsv - Di 16.09.08 10:57
Titel: Änderungen auf gerufener Form mitbekommen
Hallo zusammen,

ich rufe in einer Methode eine andere Form auf. Darauf sitzen zwei listboxes zwischen denen ich Einträge hin- und herschiebe. Wird nun ein Button geklickt, will ich in der aufrufenden Methode den Inhalt der Listbox "lbChosenQueries" mitbekommen. Gibt es einen eleganteren Weg als diesen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
            fQueries queriesForm = new fQueries(queryListResponse);
            if (queriesForm.ShowDialog() == DialogResult.OK)
            {
                String [] arrayQueries = null;
                for (int i = 0; i < queriesForm.lbChosenQueries.Items.Count; i++)
                    arrayQueries[i] = (string)queriesForm.lbChosenQueries.Items[i];
            }


Danke,

Pascal


Kha - Di 16.09.08 13:12

"Items" besitzt auch eine CopyTo-Methode. In beiden Fällen musst du allerdings erst einmal ein leeres Array erstellen, sonst fliegt dir (wie du wahrscheinlich schon bemerkt hast) eine Exception um die Ohren.


JüTho - Di 16.09.08 13:18
Titel: Re: Änderungen auf gerufener Form mitbekommen
Hallo Pascal,

user profile iconpascalsv hat folgendes geschrieben:
Gibt es einen eleganteren Weg als diesen:

Ja. Du musst im rufenden Formular einen EventHandler/Delegate schreiben, der durch das Button.Click ausgelöst wird und die gewünschten Änderungen übernimmt:

C#-Quelltext
1:
2:
3:
4:
5:
6:
private void GetInformation(object sender, EventArgs e) {
  //  werte Daten aus
}

fQueries queriesForm = new fQueries(queryListResponse); 
queriesForm.MyButtonClick += GetInformation;

Das Problem bei dieser Lösung bleibt, dass in der GetInformation-Methode die Elemente von queriesForm nicht bekannt sind und Du keinen Zugriff auf die Controls hast. Eine bessere Lösung ist deshalb, eine eigene EventArgs-Klasse und einen passenden Delegate zu definieren, indem bestimmte Informationen - wie in Deinem String-Array - übergeben werden.

Eine Einführung über Delegates findest Du z.B. in OpenBook Visual C# Kap.4.4 [http://www.galileocomputing.de/openbook/visual_csharp/visual_csharp_04_004.htm].

Übrigens solltest Du auf String-Arrays möglichst verzichten; besser ist fast immer List<string>.

Gruß Jürgen

/Edit
Wenn Dich das Ergebnis erst nach dem Schließen des Unterformulars interessiert, geht es auch so, wie Du es gemacht hast. Du solltest aber nicht ListBox.Items abfragen, sondern (weil Dich eine String-Liste interessiert) eine solche als Eigenschaft zur Verfügung stellen und diese innerhalb des Unterformulars erstellen. Dazu ist auch Kha's Hinweis sehr hilfreich.


pascalsv - Di 16.09.08 13:18

Gute Idee!!!

Das mache ich, danke!!

Pascal