Rubrik: Controls · ListBox | VB-Versionen: VB4, VB5, VB6 | 08.09.04 |
MultiSelect in ListBox bzw. FileListbox Dieser Tipp zeigt eine erweiterte Möglichkeit zur Mehrfachselektion im List- und FileListBox-Control. | ||
Autor: Henryk Kolodziej | Bewertung: | Views: 18.691 |
www.hekoste.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Sie möchten in einer List- bzw. FileList-Box mehrere zusammenhängende Bereiche auswählen, bei einigen ausgewählten Bereichen die Auswahl teilweise wieder aufheben und zusätzlich einzelne Einträge aus- bzw. abwählen. Mit den VB-Standartvorgaben ist das auch möglich, aber vergleichen Sie selbst.
Und so wird es gemacht: Bei einer gedrückt gehaltenen Taste (frei wählbar) wählen Sie mit der Maus den ersten auszuwählenden Eintrag, dann den letzten des Bereichs aus.
Die Folge: Der gesamte Bereich wird markiert. Diesen Vorgang können Sie beliebig oft wiederholen.
Bei Abwahl von Einträgen halten Sie eine andere Taste gedrückt (ebenfalls frei wählbar) und wiederholen die obigen Schritte. Die Auswahl von Bereichen kann sowohl von oben nach unten als auch von unten nach oben erfolgen (die Taste können Sie zwischendurch wieder loslassen, bei Auswahl von Bereichen müssen Sie diese aber wieder gedrückt halten).
Für die Aus- bzw. Abwahl einzelner Einträge wird die Taste nicht benötigt.
Die Auswahl funktioniert auch bei einer Listbox mit der Style-Eigenschaft 1 (Kontrollkästchen).
Bei einer FileListBox funktioniert die Aus- bzw. Abwahl von Bereichen nur, wenn Sie für die Auswahl die Shift-Taste, für Abwahl die Strg-Taste benutzen!
Öffnen Sie eine neues Projekt und platzieren 5 CommandButtons, 2 ListBoxen und eine FileListBox auf die Form. Setzen Sie bei List1 die Multiselect-Eigenschaft auf 1, bei List2 die Style-Eigenschaft auf 1 und bei FileListbox die Multiselect-Eigenschaft auf 1.
Im Beispiel erfolgt die Bereichswahl bei gedrückter Shift-Taste, Abwahl bei Strg-Taste. Die Tastenzuordnung selbst erfolgt im Code.
Fügen Sie jetzt den folgenden Code ein und probieren die Möglichkeiten einfach aus.
Option Explicit ' Variablendefinition Public SelAnf As Long Public SelEnd As Long Public TasteGeDrueckt As String Public TasteSelect As String Public TasteDelSelect As String Public KeyCode As Integer
Private Sub Form_Load() ' wichtig Me.KeyPreview = True Command1.Caption = "List1 füllen" Command2.Caption = "List1 zurücksetzen" Command3.Caption = "List2 füllen" Command4.Caption = "List2 zurücksetzen" Command5.Caption = "FileList zurücksetzen" End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) ' Taste ist noch gedrückt If TasteGeDrueckt = "Y" Then Exit Sub ' Merken, wenn Taste gedrückt ' hier erfolgt auch die Tastenzuordnung If KeyCode = vbKeyShift Then TasteSelect = "Y" If KeyCode = vbKeyControl Then TasteDelSelect = "Y" If TasteSelect = "Y" Or TasteDelSelect = "Y" Then TasteGeDrueckt = "Y" SelAnf = -1 SelEnd = -1 End Sub
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) ' Taste wurde losgelassen TasteGeDrueckt = "N" TasteSelect = "N" TasteDelSelect = "N" End Sub
Private Sub Command1_Click() ' List1 füllen Dim i As Long List1.Clear For i = 1 To 50 List1.AddItem i Next i End Sub
Private Sub Command2_Click() ' List1: Auswahl zurücksetzen Dim i As Long For i = 0 To List1.ListCount - 1 If List1.Selected(i) = True Then List1.Selected(i) = False Next i End Sub
Private Sub Command3_Click() ' List2 füllen Dim i As Long List2.Clear For i = 1 To 50 List2.AddItem i Next i End Sub
Private Sub Command4_Click() ' List2: Auswahl zurücksetzen Dim i As Long For i = 0 To List2.ListCount - 1 If List2.Selected(i) = True Then List2.Selected(i) = False Next i End Sub
Private Sub Command5_Click() ' FileList: Auswahl zurücksetzen Dim i As Long For i = 0 To File1.ListCount - 1 If File1.Selected(i) = True Then File1.Selected(i) = False Next i End Sub
Private Sub File1_Click() SetExtendedSelection File1 End Sub Private Sub List1_Click() SetExtendedSelection List1 End Sub Private Sub List2_Click() SetExtendedSelection List2 End Sub
Private Sub SetExtendedSelection(oList As Object) Dim i As Long ' nur wenn taste gedrueckt If TasteGeDrueckt = "Y" Then With oList ' Aanfangs-Position merken If SelAnf = -1 Then SelAnf = .ListIndex Exit Sub End If ' End-Position festlegen If SelEnd = -1 Then SelEnd = .ListIndex ' Auswahlmarkierung nur, ' wenn Anfangs- und End-Position vorhanden If SelAnf < SelEnd Then ' Auswahl von oben nach unten For i = SelAnf To SelEnd If TasteSelect = "Y" Then .Selected(i) = True ElseIf TasteDelSelect = "Y" Then .Selected(i) = False End If Next i ElseIf SelEnd < SelAnf Then ' Auswahl erfolgte von unten nach oben For i = SelEnd To SelAnf If TasteSelect = "Y" Then .Selected(i) = True ElseIf TasteDelSelect = "Y" Then .Selected(i) = False End If Next i End If ' Zurücksetzen der Positionswerte SelAnf = -1 SelEnd = -1 End If End With End If End Sub