Einzelne Checkboxen bei Listview NICHT anzeigen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    Einzelne Checkboxen bei Listview NICHT anzeigen

    Hallo Leute,

    Ich habe eine Listview mit Checkboxen. Zur besseren Übersichtlichkeit möchte ich aber einige freie Zeilen in der Listbox lassen. Dort sollen natürlich dann keine Checkboxen angezeigt werden. Wie bekommt man das am einfachsten hin.

    Hinweis: Die Einträge sind fix und es gibt keine Scrollmöglichkeit, da alle möglichen Einträge immer sichtbar sind.

    Danke für Eure Hinweise.
    Bilder
    • 02102022130157.jpg

      91,55 kB, 225×598, 72 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @dive26 Wie kommen denn die Items da rein?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    so:

    VB.NET-Quellcode

    1. With ListView_Geraete.Items.Add(HistoricValues(i))
    2. ...
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @dive26 Und in dieser Schleife gestaltest Du Dein LV nach Deinen Wünschen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany und wie genau?
    Checkboxen kann man nur für alle oder keinen Eintrag aktivieren.
    Ich könnte maximal da ein schwarzes Rechteck drüberzeichnen. Aber ist das die "gute Art"?
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    Checkboxen kann man nur für alle oder keinen Eintrag aktivieren.
    OK, das ist so eine ListView-Eigenart.
    Probier mal ne ListBox, da müssen die Einträge nix miteinander zu tun haben.
    Oder nimm ein TableLayoutPanel mit einer Spalte, da kannst Du reinpacken, was immer Du willst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nein, etwas Drübermalen ist schlechter Stil.
    Ich habe zwar bisher keinen Weg gefunden, aber sind Gruppen vielleicht das Richtige für Dich?
    Bilder
    • ListViewWithGroups.png

      3,44 kB, 399×367, 61 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    ja super. Das wäre eine Lösung.
    Ich schau mir das mal an (hatte ich noch nie am Schirm).

    Edit: funktioniert bei mir nicht. Womöglich (oder sicher) falscher Code ;)

    VB.NET-Quellcode

    1. With ListView_Geraete
    2. .SuspendLayout()
    3. .Clear()
    4. .Columns.Add("LanguageValues", 200, HorizontalAlignment.Left)
    5. .Columns.Add("Values", 0, HorizontalAlignment.Left)
    6. End With
    7. Dim Power_group As New ListViewGroup("Power", HorizontalAlignment.Left)
    8. Dim Volt_group As New ListViewGroup("Volt", HorizontalAlignment.Left)
    9. Dim Ampere_group As New ListViewGroup("Ampere", HorizontalAlignment.Left)
    10. With ListView_Geraete.Groups
    11. .Add(Power_group)
    12. .Add(Volt_group)
    13. .Add(Ampere_group)
    14. End With
    15. Dim SprachFormTemp As String = ""
    16. For i As Integer = 1 To 9
    17. With ListView_Geraete.Items.Add(HistoricValues(i)) 'hier dann die Values aus String-Variablen
    18. .UseItemStyleForSubItems = False
    19. .SubItems.Add(HistoricValues(i))
    20. .SubItems(0).ForeColor = HistoricColors(i)
    21. .Group = Power_group
    22. If i = 2 Then .Checked = True
    23. End With
    24. Next i
    25. For i As Integer = 10 To 20
    26. With ListView_Geraete.Items.Add(HistoricValues(i)) 'hier dann die Values aus String-Variablen
    27. .UseItemStyleForSubItems = False
    28. .SubItems.Add(HistoricValues(i))
    29. .SubItems(0).ForeColor = HistoricColors(i)
    30. .Group = Volt_group
    31. End With
    32. Next i
    33. ListView_Geraete.ResumeLayout()
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „dive26“ ()

    Im Designer auf das ListView, da auf den Smarttag, dann auf Gruppen bearbeiten. Dann die Gruppen hinzufügen und im Code beim Hinzufügen der Items die Gruppe festlegen.

    VB.NET-Quellcode

    1. ListView1.Items.Add(New ListViewItem With {.Group = ListView1.Groups(HierGruppenindexSelbstErmitteln)})

    Gruppen sind z.B. in der Detailansicht sichtbar, aber die ColumnHeader kann man ausblenden: ListView.HeaderStyle auf None
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Das Ding mag mich nicht:

    VB.NET-Quellcode

    1. With ListView_Geraete.Items.Add(New ListViewItem With {.Group = ListView_Geraete.Groups(0)})
    2. .Text = HistoricValues(i)
    3. .UseItemStyleForSubItems = False
    4. .SubItems.Add(HistoricValues(i))
    5. .SubItems(0).ForeColor = HistoricColors(i)
    6. If i = 2 Then .Checked = True
    7. End With


    .. mit Gruppenalage im Designer, wäre aber doch das selbe wie das hier


    VB.NET-Quellcode

    1. Dim Power_group As New ListViewGroup("Power", HorizontalAlignment.Left)
    2. With ListView_Geraete.Groups
    3. .Add(Power_group)
    4. End With
    5. With ListView_Geraete.Items.Add(HistoricValues(i)) 'hier dann die Values aus String-Variablen
    6. .UseItemStyleForSubItems = False
    7. .SubItems.Add(HistoricValues(i))
    8. .SubItems(0).ForeColor = HistoricColors(i)
    9. .Group = Power_group
    10. End With


    Hab den Fehler gefunden.Habe Application.EnableVisualStyles() 'Visuelle Stile aktivieren aufgerufen, nachdem ich schon eine Form angezeigt hatte. Das wollte das Ding nicht. Habs jetzt im Code vor dem öffnen der ersten Form gesetzt und dann werden auch die Header angezeigt.

    Das einzige was ich nun noch rausbekommen muss ist, wie man die Farbe der Gruppe ändert. Die wird bei mir Dunkelblau auf schwarzem Hintergrund angezeigt ;)
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

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

    Leider kann ich mir unter der Aussage

    dive26 schrieb:

    Das Ding mag mich nicht
    nichts konkretes unter dem Missverhältnis zwischen Soll- und Ist-Wert vorstellen.

    VB.NET-Quellcode

    1. Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim Power_group As New ListViewGroup("Power", HorizontalAlignment.Left)
    3. Dim VoltageGroup As New ListViewGroup("Voltage", HorizontalAlignment.Left)
    4. ListView_Geraete.Groups.AddRange({Power_group, VoltageGroup})
    5. Dim HistoricValues As New List(Of String) From {"a", "b", "c", "d", "e"}
    6. Dim HistoricColors As New List(Of Color) From {Color.Red, Color.Green, Color.Black, Color.Blue, Color.Orange}
    7. For i = 0 To 4
    8. Dim CurrentGroup = Power_group
    9. If i >= 3 Then CurrentGroup = VoltageGroup
    10. With ListView_Geraete.Items.Add(HistoricValues(i)) 'hier dann die Values aus String-Variablen
    11. .UseItemStyleForSubItems = False
    12. .SubItems.Add(HistoricValues(i))
    13. .SubItems(0).ForeColor = HistoricColors(i)
    14. .Group = CurrentGroup
    15. .Checked = i Mod 2 = 0
    16. End With
    17. Next
    18. End Sub


    Da Du die HistoricValues pro Eintrag doppelt drinhaben willst, fehlte noch die zweite Spalte. Daher Korrektur des Bildes.

    ##########

    dive26 schrieb:

    die Farbe der Gruppe
    Ehm … viel Spaß, ist wohl ein steiniger Weg laut stackoverflow
    Bilder
    • Result.png

      2,15 kB, 399×287, 49 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    @VaporiZed

    Nein passt schon, die Funktion macht nun das was die Funktion machen sollte.
    Aber leider die Gruppen-Header in Blau. Das kann ich nicht gebrauchen, da mein Hintergrund fast schwarz ist.
    Das sieht nicht gut aus. Zudem zieht sich die Gruppenlinie bis zum Ende der Listbox, was auch optisch nicht für meine Anwendung passt. Aber funktionieren tut es jetzt, nachdem ich die VisualStyles richtig aktiviert hatte.

    Aus optischen Gründen mache ich es jetzt auf die unsaubere Art mit OwnerDraw ;-).
    Danke aber trotzdem, habe ich wieder einiges dazugelernt zur Listbox.
    Bilder
    • 02102022182932.jpg

      219,85 kB, 962×659, 56 mal angesehen
    • BOPV_history.jpg

      299,74 kB, 962×659, 53 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

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

    RodFromGermany schrieb:

    Oder nimm ein TableLayoutPanel mit einer Spalte, da kannst Du reinpacken, was immer Du willst.

    Das halte ich für die mit Abstand beste Lösung.
    Da funkt dir keine, nicht benötigte, Logig ("Gruppen-Header in Blau") dazwischen, das ganze ist ist sehr flexible und ohne viel aufwand realisierbar.
    @ErfinderDesRades

    tatsächlich verwende ich Listview nie.


    Bei mir ist es gerade umgekehrt.
    Ich mag das Listview lieber als das DataGridView. Obwohl man bei manchen Aufgaben um das DatagridView nicht herum kommt ;-).

    ja - das listviewItem kennt doch bestimmt den Checkstate.Indeterminated.Für Indeterminated könnte man ein Blank-Icon einführen, und dann setzt man die Item, die ohne Checkbox sein sollen auf Indeterminated.

    Das ist auch nur so eine Notlösung wie das OwnerDraw. Da lasse ich einfach die schon umgesetzte Notlösung mit OwnerDraw im Listitem. Das funktioniert einwandfrei. Dem User ist es egal - der sieht ja nicht wie es intern technisch gelöst ist. Solange Optik und Funktion passen ist alles gut.
    Bilder
    • BOPV_history.jpg

      299,74 kB, 962×659, 47 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at