Wir haben als Anwendungsfall einen Listbox die mit Werten gefüllt ist. Es sollen dynamisch Werte vom Benutzer hinzugefügt oder entfernt werden.
Sicherlich gibt es einige Lösungsansätze. Hier wird beschrieben wie diese Aufgabe mit einer Textbox und zwei zusätzlichen Buttons Plus und Minus gelöst wird. Bei Plus wird der Wert aus der Textbox in die Liste eingefügt. Bei Click auf Minus wird der Wert aus der Liste entfernt.
Ein Click auf einen Eintrag in die Liste soll den gewählten Wert in der Textbox anzeigen um ihn entweder löschen zu können oder abgeändert wieder hinzuzfügen. Dazu ist es zuerst wichtig bei der Listbox das Proberty AutoPostback zu aktivieren um nach jedem Click auf einen Eintrag die Behandlung am Server machen zu können.
<asp:ListBox id="lstOption" runat="server" Height="134px" Width="237px" AutoPostBack="True"></asp:ListBox> |
Bild1:
Der Eventhandler ist dann sehr einfach zu coden. Um auf den gewählten Eintrag zu kommen, steht die Eigenschaft SelectedItem bereit.
Private Sub lstOption_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstOption.SelectedIndexChanged txtList.Text = lstOption.SelectedItem.Text End Sub |
Als nächstes soll ein Eintrag eingefügt werden. Wir legen fest ( es liegt in unserer Macht), das das einfügen VOR den gewählten Eintrag erfolgen soll. Dazu gibt es alternativ zum normalerweise eingesetzen Item.Add ein Item.insert, das als Parameter die Postion und den Wert benötigt.
Private Sub cmdPlus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdPlus.Click lstOption.Items.Insert(lstOption.SelectedIndex, txtList.Text) End Sub |
Der letzte Punkt ist noch einen Eintrag zu entfernen. Vermuten würde man ein "Delete", es heist aber
Remove mit dem Wert als Parameter oder RemoveAt mit der Position. Am simpelsten ist die Methode über Remove, da andernfalls die gewählte Position verwendet werden müsste.
Private Sub cmdMinus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdMinus.Click lstOption.Items.Remove(txtList.Text) End Sub |
Hier tritt in der Praxis auch ein kleines Problem zu Tage. Dieser Code ist nicht besonders gut geeignet um mit doppelten Werten umzugehen. So springt der Cursor immer auf den ersten von zwei gleichen Werten, egal welchen man wählt.
Dies ist aber in der Praxis nicht so häufig, so das hier großmütig farüber hinweggesehen wurde.