Click auf ListView außerhalb aller Zeilen

Wenn ich auf eine Zeile klicke, wird diese ausgewählt und die zuvor ausgewählte wird abgewählt. Keine Probleme bis hier.

Wenn ich außerhalb der Einträge klicke, wird die aktuell ausgewählte Zeile abgewählt. Ich möchte dies zu verhindern. Kann jemand mir sagen wie?

Hallo dikn,

eine einfache Möglichkeit wäre, eine globale Variable mit dem SelectedIndex zu definieren.

Irgendwo zwischen den sub()-Defintionen kommt ein integer z.B.
Dim lastIndex as Int16=0;

Dann kommt in das ListBox1_SelectedIndexChanged() sowas wie :
if Listbox1.SelectedIndex=-1 then Listbox1.SelectedIndex=lastIndex else lastIndex=Listbox1.SelectedIndex

Auch möglich wäre, bei MouseDown die Position der Eventargs e.y mit dem Listview-Einträgen zu vergleichen. Ist e.Y zwischen Listview.top (+ form top + menü-rahmen etc.) und dem Wert + Anzahl der Einträge*Höhe der Einträge, wurde auf ein Item geklickt. die andere Lösung ist einfacher, löst aber ggf. das indexchanged-event erneut aus (falls du da noch was drin programmiert hast).

Ich hoffe das die Lösung zu deinem Problem passt^^

Vielen Dank für Deine rasche Antwort!
Ich habe den 2.Vorschlag versucht.
Unterscheidung innerhalb/außerhalb funktioniert,
aber markierte Zeile bleibt bei Klick außerhalb nicht markiert. Was mache ich falsch?

Dim lastIndex As Int16 = 0

Private Sub LV_MouseDown _
(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles LV.MouseDown
'------------------------------------------------------

If e.Y

Hallo dikn,

so auf die schnelle sagt will mir da nix passendes einfallen, da ich mit diesem Steuerelement noch nicht gearbeitet habe, aber spontan würde ich sagen du speicherst jedesmal das letzt ausgewählte Element und selektierst es wenn kein element ausgewählt wurde… in etwa so:

 Private Sub ListView1\_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListView1.SelectedIndexChanged
 Static old As ListViewItem
 If ListView1.SelectedItems.Count \> 0 Then
 old = ListView1.SelectedItems.Item(0)
 Else
 If Not IsNothing(old) Then
 old.Selected = True
 End If
 End If
 End Sub

viel Erfolg

Enrico

Ich bin dies ganze Woche unterwegs. Ich werde Ihnen dann antworten. Das Problem ist lösbar.

Wenn ich auf eine Zeile klicke, wird diese ausgewählt und die
zuvor ausgewählte wird abgewählt. Wenn ich außerhalb der Einträge klicke, wird die aktuell
ausgewählte Zeile abgewählt. Ich möchte dies zu verhindern.

Welche Version von vb.net hast du?
mir sagt er bei
lastIndex = Me.LV.SelectedItems(0).Index
einen Fehler.
Das müsste eigentlich doch Me.LV.SelectedIndex sein. Das gibt dir ja den Index des ersten, markierten Elementes.
mit(0) müsstest du auch sicherstellen, dass es Elemente gibt.

wie kommt deine Höhenberechnung zustande?
ich habe mich vorhin vertan, dass man noch LV.top abziehen müsste, da ich nicht genau wusste, worauf er e.Y bezieht. Nun bezieht er es auf den oberen Rand der Listbox. Ich denke, daher hast du die 23.
ich kenne natürlich nicht deine Formatierung, aber bei mir ist folgende Beziehung für SelectMode=single am besten:

 If e.Y 

Möchte man mehrere Elemente ausgewählt lassen, bietet sich das Verwenden von selectedIndices an:


     Dim lastindex As New List(Of Int16)
     Private Sub ListBox1\_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseUp
     If e.Y 
    
    Das funktioniert auch bei SelectionMode=Single, ist aber evtl bisschen overkill^^
    
    Ich muss aber nochmal fragen, welche Version du benutzt. Wenn ich meine Listbox auf SelectionMode Single stelle, wird auch beim Klick in leere Bereiche die bisherige Auswahl nicht aufgehoben.
    Ich benutze die vb2008.
    
    mit freundlichen Grüßen
    Julian

Hi!

ich würde das spontan so lösen, daß ich eine globale Variable (zb. Private LastID As Integer) füllen würde mit der ID des zuletzt gewählten Eintrags (im Event SelectedIndexChanged). Wenn sich der Index auf -1 ändert (also nichts gewählt wurde), einfach den zuletzt gespeicherten Index wieder aufrufen.

Setze ListView.HideSelection = False

Das müsste Dein Problem lösen.

Hallo,
programmierst du in VB6 / .NET?
VB ist ja ereignisorientiert. D.H beim Klick wird ein Ereignis ausgelöst (auch z.B. .Validate / .LostFocus oder .Gotfocus).
Zuerst mussst du herausfinden durch welches Ereignis dein Programm beim Klick läuft.
Oder hast du im Listview irgendwo eine Eigenschaft ausgewählt, das beim Verlassen des Listview automatisch die Zeile entmarkiert wird.?
Also zuerst herausfinden welches Ereignis durchlaufen wird.

Viel Spaß
ips

Welche Version von vb.net hast du? -> VB 2008

Aber List’VIEW’ nicht List’BOX’

Setze ListView.HideSelection = False

Das müsste Dein Problem lösen.

-> leider nicht!

Hallo,
das müsste funktionieren, indem Du die Property „HideSelection“ des ListView auf False setzt.

Gruß
Thomas

… oh nein^^
Tut mir echt leid, da hab’ ich mich verrannt^^

Versuch mal das:

 Dim int As New List(Of Int16)
 Private Sub ListView1\_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseUp
 If ListView1.SelectedIndices.Count = 0 Then
 For Each s As Int16 In int
 ListView1.SelectedIndices.Add(s)
 Next
 End If
 int.Clear()
 For Each s As Int16 In ListView1.SelectedIndices
 int.Add(s)
 Next
 End Sub

Hi,

erstmal was generelles, Grußwort und Abschied gehören zu einer Anfrage dazu, einfach nur aus reiner Höflichkeit.

Welche Technologie benutzt du?

Lg Knerd

Funktioniert bestens!!!
Vielen, vielen, vielen Dank!!!

Aber verstanden hab ich es noch nicht…

Anfangs ist ein Eintrag markiert
-> int-Liste wird eingelesen

Bei Klick innerhalb ist die Anzahl der markierten Einträge Null
-> int-Liste wird erneut eingelesen

Bei Klick außerhalb ist die Anzahl der markierten Einträge = Null
-> LV.SelectedIndices werden aus Int-Liste
eingelesen
-> int-Liste wird gelöscht
-> int-Liste wird erneut eingelesen

Frage: Warum erfolgt jetzt (wie gewünscht) keine Änderung

Nochmal - Vielen Dank

Wohin klickst Du?
In’s ListView?

Vielen Dank
Ein Tipp von Julian funktioniert besten

Dim int As New List(Of Int16)

Private Sub ListView1_MouseUp (…)
If ListView1.SelectedIndices.Count = 0 Then
For Each s As Int16 In int
ListView1.SelectedIndices.Add(s)
Next
End If
int.Clear()
For Each s As Int16 In ListView1.SelectedIndices
int.Add(s)
Next
End Sub

Vielen Dank
Ein Tipp von Julian funktioniert besten

Dim int As New List(Of Int16)

Private Sub ListView1_MouseUp (…)
If ListView1.SelectedIndices.Count = 0 Then
For Each s As Int16 In int
ListView1.SelectedIndices.Add(s)
Next
End If
int.Clear()
For Each s As Int16 In ListView1.SelectedIndices
int.Add(s)
Next
End Sub
.

Vielen Dank
Ein Tipp von Julian funktioniert besten

Dim int As New List(Of Int16)

Private Sub ListView1_MouseUp (…)
If ListView1.SelectedIndices.Count = 0 Then
For Each s As Int16 In int
ListView1.SelectedIndices.Add(s)
Next
End If
int.Clear()
For Each s As Int16 In ListView1.SelectedIndices
int.Add(s)
Next
End Sub

.

Vielen Dank
Ein Tipp von Julian funktioniert besten

Dim int As New List(Of Int16)

Private Sub ListView1_MouseUp (…)
If ListView1.SelectedIndices.Count = 0 Then
For Each s As Int16 In int
ListView1.SelectedIndices.Add(s)
Next
End If
int.Clear()
For Each s As Int16 In ListView1.SelectedIndices
int.Add(s)
Next
End Sub