none
ListView Doppelclick mit aktivierten Checkboxen RRS feed

  • Frage

  • Hallo Forengemeinde

    Ich habe folgendes Problem. Ich setze ein Listview ein und setze die Eigenschaft Checkbox = True

    Wenn ich jetzt das Ereignis "Listview.DoubleClick" auswerte bekomme ich kein ListViewItem welches ich doppelt angeklickt habe. Die Auflistung "SelectedItems" und "SelectedIndices" sind beide immer Count=0.

    Wenn ich nun die Eigenschaft "CheckBoxes"=False setze bekomme ich im Ereignis "DoubleClick" wieder das Doppelt angeklickte Item.

    Kann das jemand bestätigen und wenn ja soll das so sein oder ist das ein Bug? Für mich wäre es wichtig das ich trotz aktivierter Checkboxen über ein Doppelklick das ListViewItem lokalisieren kann.

    Gruß Thomas

    Mittwoch, 15. September 2010 13:46

Antworten

  • Hallo Thomas,

    Habe gerade das Ereignis "ItemActivate" probiert aber es das selbe Beide Auflistungen sind Count=0

    wenn Du den Doppelklick auf dem Bereich der CheckBox ausführst ist das klar. Dabei wird ja der Eintrag nicht selektiert, sondern nur der Wert der CheckBox geändert. Klickst Du doppelt auf den Text des Eintrags bzw. die übrige Zeile, wird auch der Eintrag selektiert. Das Verhalten ist so gewünscht, da es eben zwei unterschiedliche Eigenschaften sind. selektiert <> checked. Die angehakten Einträge kannst Du über die CheckedItems Eigenschaft abfragen.

    Das ItemActivate Ereignis greift dabei auch nur, wenn nicht auf den Bereich der CheckBox geklickt wurde. Bei Auswahl der CheckBox werden das ItemCheck und das ItemChecked Ereignis ausgelöst. Bei allen drei Ereignissen bekommst Du das betroffene Item über die EventArgs geliefert.

    Das einzige was funktioniert ist über das Ereignis "MouseDoubleClick"
     Private Sub _LV_Muster_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles _LV_Muster.MouseDoubleClick
     '//
     Dim tmpLVI As ListViewItem = Me._LV_Muster.GetItemAt(e.X, e.Y) 
     

    Hier beziehst Du Dich ja auch nicht auf den ausgewählten Eintrag, sondern den Eintrag an der aktuellen Mausposition. Das ist schon etwas anderes.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    • Als Antwort markiert tommytom73 Mittwoch, 24. November 2010 07:47
    Mittwoch, 15. September 2010 19:48
    Moderator

Alle Antworten

  • Hallo Thomas,

    Für mich wäre es wichtig das ich trotz aktivierter Checkboxen über ein Doppelklick das ListViewItem lokalisieren kann.

    hast Du bei Verwendung des ItemActivate Ereignisses das gleiche Verhalten? Dieses signalisiert normalerweise, dass die "Standardaktion" für den ausgewählten Eintrag ausgeführt werden soll. Beim ListView kann man ja zwischen den beiden Modi wählen, Einträge per Doppelklick oder per einfachen Klick auszuwählen bzw. eine Aktion zu starten. Siehe auch Activation Eigenschaft.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Mittwoch, 15. September 2010 14:10
    Moderator
  • Hallo Thorsten

    Habe gerade das Ereignis "ItemActivate" probiert aber es das selbe Beide Auflistungen sind Count=0

    Meine Eigenschaften für das Listview sind :

    With Me._LV_QZV
     .View = View.Details
     .Items.Clear()
     .Columns.Clear()
     .HeaderStyle = ColumnHeaderStyle.Clickable
     .GridLines = False
     .CheckBoxes = True
     .FullRowSelect = True
     .ShowItemToolTips = True
     .MultiSelect = False
     .... Einstellungen der Header + Items
    End With
    

    Das einzige was funktioniert ist über das Ereignis "MouseDoubleClick"

     Private Sub _LV_Muster_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles _LV_Muster.MouseDoubleClick
      '//
      Dim tmpLVI As ListViewItem = Me._LV_Muster.GetItemAt(e.X, e.Y)
      '//
      If IsNothing(tmpLVI) = False Then
       Dim tmpConfigDlg As New Frm_Detail(tmpLVI)
       tmpConfigDlg.ShowDialog(Me)
       tmpConfigDlg.Dispose()
      End If
     End Sub

    Das scheint soweit zu funktionieren, aber warum das normale Doppelklick Ereignis nicht greift finde ich komisch.

    Gruß Thomas 

    Mittwoch, 15. September 2010 14:22
  • Hallo Thomas,

    Habe gerade das Ereignis "ItemActivate" probiert aber es das selbe Beide Auflistungen sind Count=0

    wenn Du den Doppelklick auf dem Bereich der CheckBox ausführst ist das klar. Dabei wird ja der Eintrag nicht selektiert, sondern nur der Wert der CheckBox geändert. Klickst Du doppelt auf den Text des Eintrags bzw. die übrige Zeile, wird auch der Eintrag selektiert. Das Verhalten ist so gewünscht, da es eben zwei unterschiedliche Eigenschaften sind. selektiert <> checked. Die angehakten Einträge kannst Du über die CheckedItems Eigenschaft abfragen.

    Das ItemActivate Ereignis greift dabei auch nur, wenn nicht auf den Bereich der CheckBox geklickt wurde. Bei Auswahl der CheckBox werden das ItemCheck und das ItemChecked Ereignis ausgelöst. Bei allen drei Ereignissen bekommst Du das betroffene Item über die EventArgs geliefert.

    Das einzige was funktioniert ist über das Ereignis "MouseDoubleClick"
     Private Sub _LV_Muster_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles _LV_Muster.MouseDoubleClick
     '//
     Dim tmpLVI As ListViewItem = Me._LV_Muster.GetItemAt(e.X, e.Y) 
     

    Hier beziehst Du Dich ja auch nicht auf den ausgewählten Eintrag, sondern den Eintrag an der aktuellen Mausposition. Das ist schon etwas anderes.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    • Als Antwort markiert tommytom73 Mittwoch, 24. November 2010 07:47
    Mittwoch, 15. September 2010 19:48
    Moderator
  • Hallo Thorsten

    Da muss ich dir jetzt wiedersprechen. Ich klicke immer auf die ganze Zeile doppelt. Deswegen auch "FullRowSelect=True"

    Erreichen möchte ich, daß wenn ich auf die ganze Zeile Doppelt klicke ich ein neues Form öffnet wo ich die Einträge der "Subitems" verändern kann. Und durch die Checkbox möchte ich die Einträge markieren die ich dann später abspeichere. Den Doppelklick bräuchte ich nicht wenn ich die "Subitem" direkt editieren könnte. Aber das lässt das ListView aus dem Framework nicht zu oder hast du da eine Idee!!!

    Es nervt mich sowieso das durch den Doppelklick automatisch die Checkbox markiert wird, und man dieses Verhalten nicht abschalten kann. Das MFC-Pendant ist da anders aber ich glaube nicht das man das in eine vb.net Anwendung integrieren kann.

    Gruß Thomas

    Mittwoch, 15. September 2010 21:26
  • Hallo Thomas,

    Da muss ich dir jetzt wiedersprechen. Ich klicke immer auf die ganze Zeile doppelt. Deswegen auch "FullRowSelect=True"

    kannst Du bitte ein reproduzierbares Beispiel bereitstellen. Ich kann es mit Deinen Angaben hier nicht nachstellen.

    Erreichen möchte ich, daß wenn ich auf die ganze Zeile Doppelt klicke ich ein neues Form öffnet wo ich die Einträge der "Subitems" verändern kann.

    Verwende hier besser ItemActivate. Hier bekommst Du den angeklickten Eintrag bereits über die EventArgs geliefert.

    Und durch die Checkbox möchte ich die Einträge markieren die ich dann später abspeichere. Den Doppelklick bräuchte ich nicht wenn ich die "Subitem" direkt editieren könnte. Aber das lässt das ListView aus dem Framework nicht zu oder hast du da eine Idee!!!

    Bei der Anforderung Subitems bearbeiten zu wollen, kann ein DataGridView die bessere Alternative sein. Dieses unterstützt das 'out of the box'. Sonst auch:

    In-place editing of ListView subitems
    http://www.codeproject.com/KB/list/ListViewCellEditors.aspx

    Es nervt mich sowieso das durch den Doppelklick automatisch die Checkbox markiert wird, und man dieses Verhalten nicht abschalten kann.

    Das Verhalten kommt bereits vom Windows ListView und wird im .NET ListView nur 'weitergereicht':

    Overcoming a .NET ListView CheckBoxes quirk
    http://blogs.msdn.com/b/hippietim/archive/2006/03/27/562256.aspx


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 16. September 2010 05:56
    Moderator
  • Hallo Thomas,

    in welchem Kontext stehen denn dein Listview und die Checkbox?


    Liebe Grüße Stefan ------------------------------------------------ Ich verwende Visual Basic 2008 Express
    Donnerstag, 23. September 2010 10:59
  • Hallo Stefan,

    in welchem Kontext stehen denn dein Listview und die Checkbox?

    höchstwahrscheinlich in diesem hier: ListView.CheckBoxes Eigenschaft.

    Schaut dann in etwa so aus:
    ListView.CheckBoxes
    Quelle: http://msdn.microsoft.com/en-us/library/ms971338.aspx

    Leider bleibt Thomas ein reproduzierbares Beispiel für das von ihm geschilderte Verhalten schuldig.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 23. September 2010 17:31
    Moderator
  • Hallo Thorsten,

    aha, das kannte ich noch nicht. Ich hatte vielmehr den Verdacht, dass er über eine Funktion, die er über eine "normale" CheckBox regelt, ggf. einen Fehler provoziert.

    Was mich in diesem Zusammenhang aber noch mehr interessiert als die ListView.CheckBoxes  ist die Frage, wie es dir gelungen ist, hier einen Screenshot einzubinden. Das wäre mir bei der einen oder anderen Frage auch schon mal hilfreich gewesen.


    Liebe Grüße Stefan ------------------------------------------------ Ich verwende Visual Basic 2008 Express
    Donnerstag, 23. September 2010 19:20
  • Hallo Stefan,

    Was mich in diesem Zusammenhang aber noch mehr interessiert als die ListView.CheckBoxes  ist die Frage, wie es dir gelungen ist, hier einen Screenshot einzubinden.

    wenn es ein eigener Screenshot ist, musst Du ihn irgendwo öffentlich bereitstellen bspw. über Skydrive. Einbinden kannst Du ihn dann über die HTML Schaltfläche beim Foreneditor über das img Element:

    <img alt="ListView.CheckBoxes" src="http://i.msdn.microsoft.com/dynimg/IC32980.gif" width="383" height="181">
    

    Die Größenangaben kannst Du auch weglassen. Verwende diese Möglichkeit aber bitte sparsam, denn nicht jeder hat die Bandbreite, um Beiträge mit etlichen oder riesigen Screenshots zu laden.

    
    
    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 23. September 2010 20:17
    Moderator
  • Sorry das Ich mich lange nicht auf das Thema gemeldet habe aber ich lag kranheitsbedingt ein wenig um.

    Ich werde die Tage das Problem mal in ein kleines Projekt packen, so das man es reproduzieren kann.

    Freitag, 1. Oktober 2010 11:12
  • Danke Thorsten,

    wenn das nicht den eigentlichen Thread irritieren würde, wäre das schon wieder eine Antwort, die als solche Markiert gehört.


    Liebe Grüße Stefan ------------------------------------------------ Ich verwende Visual Basic 2008 Express
    Freitag, 1. Oktober 2010 16:45
  • Das Thema kann geschlossen werden. liegt an meinem Entwicklungsrechner.

    Ich habe mir eine TestApp geschrieben und sie auf einem anderen Rechner ausgeführt, da funktioniert das Ereignis. Auf mein Entwicklungsrechner funktioniert sie nicht, ich werden den Rechner wohl komplett neu aufsetzten müssen, weil alle Rep.Versuche brachten keine besserung.

    Also Thema kann abgeschlossen werden.

    Mittwoch, 24. November 2010 07:47