List Box Selection wieder aufheben

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    List Box Selection wieder aufheben

    Edit by ErfinderDesRades: (Thema verschoben) Bitte richtiges UnterForum wählen!

    In einer Listbox kann man entweder ein Item ausgewählt haben, dann ist der SelectedIndex der Null-basierte Index der Zeile.

    Oder es ist kein Item ausgewählt, dann ist der SelectedIndex = -1

    Wie kann ich eigentlich eine einmal getroffene Auswahl per Maus-Klick wiederaufheben?

    Am liebsten wäre es mir, wenn ein Click in den freien Bereich der ListBox dies veranlassen würde. Aber wie kann ich abfragen, ob bei einem Click auf die ListBox eine Zeile ausgewählt wurde oder ob nur in den freien Bereich der ListBox geklickt wurde?

    Ich hoffe, ich habe mich präzise genug ausgedrückt!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @Peter329
    Probier' doch mal selber sowas in der Art zu machen. Probier' das aber erstmal :D

    VB.NET-Quellcode

    1. Public index As Integer = -1
    2. Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    3. If Me.index = ListBox1.SelectedIndex Then
    4. ListBox1.SelectedIndex = -1
    5. Else
    6. Me.index = ListBox1.SelectedIndex
    7. End If
    8. End Sub
    Mhh ... hier kommt es doch aber zu einer Rekursion, weil die Anweisung

    VB.NET-Quellcode

    1. ListBox1.SelectedIndex = -1


    dann das Ereignis

    ListBox1.SelectedIndexChanged

    erneut auslöst. Das kollidiert dann mit meiner Verarbeitung.

    Peter329 schrieb:

    Mhh ... hier kommt es doch aber zu einer Rekursion, weil die Anweisung
    Erst ausprobieren, dann beschweren :p

    VB.NET-Quellcode

    1. Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    2. Debug.Print("Ausgelöst")
    3. If Me.index = ListBox1.SelectedIndex Then
    4. ListBox1.SelectedIndex = -1
    5. Else
    6. Me.index = ListBox1.SelectedIndex
    7. End If
    8. End Sub

    Schau mal wie oft das unten in der Ausgabe angezeigt wird wenn du draufklickst! :)

    LaMiy schrieb:

    Schau mal wie oft das unten in der Ausgabe angezeigt wird wenn du draufklickst! :)


    Jau, hab ich gemacht. Wenn der SelectedIndex auf -1 gesetzt wird, dann wird "Ausgelöst" ein zweites Mal angezeigt. So wie das auch zu erwarten war.

    Mit einem Schalter kann man das beheben ... aber das ist halt nicht gerade so elegant.

    horstfh schrieb:

    Versuchs doch mal so:

    Das mit der rechten Maustaste ist eine mögliche Lösung. Aber die ist ein bissl gewöhnungsbedürftig, weil die rechte Maustaste ja eher für das Kontextmenue vorgesehen ist.
    Also, ich hab mich mit dem Problem eine ganze Weile beschäftigt.

    1. Es gibt wohl keine Möglichkeit herauszufinden, ob man in den "leeren" Bereich einer ListBox geklickt hat. Weder gibt es Methoden oder Ereignisse der ListBox, die das behandeln, noch lässt sich aus den Übergabeparametern "sender" bzw. "e" der Ereignisse "Click" bzw. "SelectedIndex_Changed" etwas ablesen.

    2. Das "Merken" und "Abfragen" des jeweils letzten SelectedIndex ist m.E. keine ganz so gute Idee. Erstens handelt man sich damit eine Rekursion ein. Und zweitens kollidiert das mit dem "Doppelclick" auf die ListBox. Wenn man einen markierten Eintrag doppelklickt erhält man dadurch nämlich ein anderes Resultat als wenn man einen unmarkierten Eintrag doppelclickt. Da wird das Ganze dann extrem unhandlich.

    3. Die Lösung mit der rechten Maustaste zum Entfernen einer Auswahl scheint mir nach alledem dann doch die beste Lösung zu sein. Und so hab ich das jetzt auch realisiert.

    4. Irgendwie fehlen m.E. im .NET Framework einige wichtige Dinge. Die Abfrage, ob ein Click auf die Listbox eine Zeile auswählt oder nicht, ist doch für Anwendungen von Bedeutung! Ich frage mich, ob dies daran liegt, dass ich "nur" VB 2010 Express verwende. Könnte es sein, dass in der Vollversion solche Dinge abgehandelt werden können?
    Also, ich hab mir die Klasse "ListBox" im ObjectBrowser in Ruhe angeschaut.

    Mhh, da gibt es eine Menge Einträge ... und irgendwie werde ich da nicht so recht fündig.

    Also entweder weiß ich nicht WO ich nachgucken muss ... oder ich bin komplett im FALSCHEN Dialog gelandet.

    Es wäre nett, wenn ich weitere Hilfestellung bekäme.
    Bilder
    • ObjectBrowser - ListBox.jpg

      456,96 kB, 1.411×1.040, 190 mal angesehen
    Das ist doch gar nicht so schwer:

    C-Quellcode

    1. private void listBox1_MouseClick(object sender, MouseEventArgs e)
    2. {
    3. for (int i = 0; i < listBox1.Items.Count; i++)
    4. if (listBox1.GetItemRectangle(i).Contains(e.Location)) return;
    5. listBox1.SelectedIndex = -1;
    6. }
    Ich möchte EDR jetzt nicht seine pädagogisch wertvolle Lösungsfindung zu Nichte machen, daher sage ich nur folgendes:
    Scroll in der Liste vom Screenshot mal ein bisschen herunter, bis zum Anfangsbuchstaben I.

    edit: @Artentus: das geht einfacher.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    @vb-checker:
    Jau, hast recht, diese Funktion kannte ich noch gar nicht.

    Falls dus selbst nicht rausfindest

    C-Quellcode

    1. private void listBox1_MouseClick(object sender, MouseEventArgs e)
    2. {
    3. if (listBox1.IndexFromPoint(e.Location) == ListBox.NoMatches)
    4. listBox1.SelectedIndex = -1;
    5. }
    Okie ...das war jetzt ein Super Hinweis. "GetItemRectancle" ... na da muss man erst mal drauf kommen! :D

    VB.NET-Quellcode

    1. Private Sub lstDirectories_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lstDirectories.MouseClick
    2. For i As Integer = 0 To lstDirectories.Items.Count - 1
    3. If (lstDirectories.GetItemRectangle(i).Contains(e.Location)) Then Exit Sub
    4. Next
    5. lstDirectories.SelectedIndex = -1
    6. End Sub


    Das klappt prima ... wenn ich in den freien Bereich klicke, wird die Auswahl aufgehoben.

    Das mit der Funktion "NoMatches" werde ich gleich noch mal ausprobieren. Das spart wohl ein bissl Code.

    Allerdings tut die Routine noch nicht ganz das was ich wirklich will. Ich würde ich die Auswahl auch gern aufheben, wenn ich den ausgewählten Eintrag NOCHMAL anklicke. Geht das? Oder muss ich mir da wieder den letzten ausgewählten Eintrag merken?
    Einfacher hab ichs nicht hinbekommen:

    C-Quellcode

    1. public class ExtendedListBox : ListBox
    2. {
    3. int oldIndex;
    4. protected override void OnSelectedIndexChanged(EventArgs e)
    5. {
    6. base.OnSelectedIndexChanged(e);
    7. oldIndex = this.SelectedIndex;
    8. }
    9. protected override void OnMouseDown(MouseEventArgs e)
    10. {
    11. int index = this.IndexFromPoint(e.Location);
    12. if (index == ListBox.NoMatches || index == oldIndex)
    13. this.SelectedIndex = -1;
    14. base.OnMouseDown(e);
    15. }
    16. }
    Wie wäre es so?

    Damit wird die Auswahl aufgehoben wenn in einen freien Bereich geklickt wird oder auf die Auswahl erneut geklickt wird.

    Quellcode

    1. Dim selIndex As Integer = -1
    2. Private Sub lbAuswahl_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles lbAuswahl.SelectedIndexChanged
    3. If Not lbAuswahl.SelectedIndex = selIndex Then
    4. 'hier passiert was bei SelectedIndexChange passieren soll
    5. Else
    6. lbAuswahl.ClearSelected()
    7. End If
    8. selIndex = lbAuswahl.SelectedIndex
    9. End Sub
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Schamash schrieb:

    Wie wäre es so?

    Ohne es jetzt ausprobieren zu wollen: Reagiert das denn auch wenn man auf einen Bereich der ListBox klickt wo kein ListItem ist? Ich meine nicht...
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Arby schrieb:

    Ohne es jetzt ausprobieren zu wollen: Reagiert das denn auch wenn man auf einen Bereich der ListBox klickt wo kein ListItem ist? Ich meine nicht...


    Ja tut es.
    Wenn man an eine Stelle Klickt an der kein Item ist verhällt sich die ListBox so das sie den SelectedIndex beibehält. Mein Codebeispiel behandelt den Fall also genau so als würde das bereits ausgewählte Item erneut ausgewählt.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Schamash“ ()