Entwickler-Ecke

WinForms - Bearbeitung des Inhalts einer ListBox


DevInet - Do 02.09.10 09:52
Titel: Bearbeitung des Inhalts einer ListBox
Hallo zusammen.

Ich arbeite momentan an einem Programm zu dem die Pflege einer Mitarbeiter-Liste, über ein UI, gehört.
Das ganze schaut wie folgt aus.

Die MitarbeiterListe wird in eine ListBox geladen. Dort soll, um Einträge zu löschen, der entsprechende Eintrag ausgewählt werden und dann über ein Button gelöscht werden. Der "SelectionMode" ist auf "MultiExtended" gestellt. Wenn man nur einen Eintrag auswählt, funktioniert das ganze ohne Probleme. Wählt man aber mehrere Einträge aus, werden alle Einträge bis auf einen gelöscht, oder auch die ganze Liste.

Hier mein Code

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
int zNr = lstBox1.SelectedIndex;
            string miAlt = lstBox1.Items[zNr].ToString();
            StreamWriter schleife = new StreamWriter(@"T:\transfer\hes\templates\mitarbeiter3.csv"true, System.Text.Encoding.UTF7);
            System.Collections.IEnumerator entryItr = lstBox1.Items.GetEnumerator();
            while (entryItr.MoveNext())
                while (entryItr.MoveNext())
                {
                    string entry = entryItr.Current.ToString();
                    if (entry != miAlt)
                    {
                        schleife.WriteLine(entry, System.Text.Encoding.UTF7);
                    }
                    else
                    {
                        continue;
                    }
                }
            schleife.Close();


Vielen Dank schonmal im vorraus.

Mfg
DevInet


danielf - Do 02.09.10 10:54

Hallo,

wieso hast du zweimal while(entryItr.MoveNext()) ?

Da überspringt er den Ersten...

Gruß


Th69 - Do 02.09.10 11:12

Außerdem kann man die Schleife eleganter programmieren:

C#-Quelltext
1:
foreach(string entry in lstBox1.Items)                    


P.S. UTF7 ist nun wirklich eine der ungebräuchlichsten Encodings, s.a. http://de.wikipedia.org/wiki/UTF-7 - Nimm lieber UTF8 bzw. Default.
Und einen StreamWriter "schleife" zu nennen, ist auch etwas verwirrend -)

Außerdem solltest du mal den Begriff "DataBinding" nachschlagen, d.h. die Trennung von GUI und Daten, so daß deine Methoden nur noch auf den Daten arbeiten und nicht mehr direkt mit den GUI-Steuerelementen (Für die Anbindung an die ListBox gehören dazu die Eigenschaften "DisplayMember", "ValueMember" sowie "DataSource).


Necaremus - Fr 03.09.10 11:12

was ich auch etwas komisch finde ist die else {continue;} anweisung zum schluss der schleife - die ist eigentlich komplett überflüssig, oder überseh ich etwas?

ich würde empfehlen mit nem DataGridView zu arbeiten, da das control wesentlich mächtiger ist.
du könntest auch nen ListView-Control nehmen und da die checkbox eigenschaft auf true setzen, sodass man einfach die items auswählen kann - wäre evtl auch eleganter :)


CSMN - Fr 03.09.10 13:33

Nicht dass ich den bisherigen Antworten nicht recht gebe, aber das eigentlich Problem ist dass
wenn du mehrere Einträge löschen möchtest auch die entspechenden Indizes liefern musst. Du lieferst
aber nur einen einzigen Index (Quelltext Zeile 1). Entweder erweiterst du das Codefragmet in Zeile 9 ff
um eine Schleife die alle gelöschten Mitarbeiter umfasst oder du baust vor dem Speichern eine
Methode die die Zeilen aus der listbox mit listBox1.Items.RemoveAt(); löscht.


Trashkid2000 - Sa 04.09.10 10:55

Hallo,

ich verstehe das ganze eigentlich so, als ob die Einträge gar nicht in der ListBox (oder wo auch immer) gelöscht werden sollen, sondern, dass ausgewählte Einträge nur nicht in der Datei landen sollen.
Mehr geht aus dem Code eigentlich nicht hervor. Obwohl es auch komisch ist.

Un abzufragen, welche Einträge abgefragt wurden, hat eine ListBox die Eigenschaft "SelectedIndices". Diese liefert eine Collection aller ausgewählter Indexe zurück.

kurzes Anwendungsbeispiel:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for (int i = 0; i < listBox1.Items.Count; i++)
{
  if (!listBox1.SelectedIndices.Contains(i))
  {
    //Eintrag wurde nicht ausgewählt
    //tu was mit dem Eintrag 
  }
}


Muss aber @Necaremus Recht damit geben, dass ein anderes Steuerelement zur Anzeige vielleicht wirklich besser wäre. Denn du hast ja besimmt von einem Mitarbeiter mehrere Daten, nicht nur den Namen.

LG, MArko