Probleme mit Listview, Ownerdraw und Subitems

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

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Toolmaster.

    Probleme mit Listview, Ownerdraw und Subitems

    Hallo, ich möchte eigentlich nur das wenn ich auf eine Zeile im Listview klicke das sich die markierte Zeile die Farbe LightSlateGray bekommt.

    Das Funktioniert auch mit meiner

    VB.NET-Quellcode

    1. Private Sub ListView1_DrawItem
    . Jetzt zu meinem Problem. egal was ich in

    VB.NET-Quellcode

    1. ListView1_DrawSubItem
    schreibe die Subitems verschwinden wenn ich mit der Maus darüberfahre und bleiben erst sichtbar wenn ich sie einmal angeklickt habe.

    Was mache ich falsch?

    Hier mal mein Code. Derzeit befindet sich in beiden der fast gleiche Code.


    VB.NET-Quellcode

    1. Private Sub ListView1_DrawItem(sender As Object, e As DrawListViewItemEventArgs) Handles ListView1.DrawItem
    2. Dim strFormat As New StringFormat()
    3. Dim headerFont As New Font("Microsoft Sans Serif", 9, FontStyle.Regular)
    4. e.DrawBackground()
    5. If e.Item.Selected Then
    6. e.Graphics.FillRectangle(Brushes.LightSlateGray, e.Bounds)
    7. e.Graphics.DrawString(e.Item.Text, headerFont, Brushes.Black, e.Bounds, strFormat)
    8. Else
    9. e.Graphics.DrawString(e.Item.Text, headerFont, Brushes.Black, e.Bounds, strFormat)
    10. End If
    11. End Sub
    12. Private Sub ListView1_DrawSubItem(sender As Object, e As DrawListViewSubItemEventArgs) Handles ListView1.DrawSubItem
    13. Dim strFormat As New StringFormat()
    14. Dim headerFont As New Font("Microsoft Sans Serif", 9, FontStyle.Regular)
    15. e.DrawBackground()
    16. If e.Item.Selected Then
    17. e.Graphics.FillRectangle(Brushes.LightSlateGray, e.Bounds)
    18. e.Graphics.DrawString(e.SubItem.Text, headerFont, Brushes.Black, e.Bounds, strFormat)
    19. Else
    20. e.Graphics.DrawString(e.SubItem.Text, headerFont, Brushes.Black, e.Bounds, strFormat)
    21. End If
    22. End Sub
    @Toolmaster Das einfachste wäre, wenn Du sofort auf ein DataGridView umsteigst, da kannst Du solch wesentlich eleganter lösen.
    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!
    @Toolmaster Du kannst das DGV so aussehen lassen, wie das andere antiquierte Ding.
    Ansonsten bin ich dann draußen.
    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!
    @Toolmaster Frau Google sagt auf die Frage datagridview header backcolor z.B.: stackoverflow.com/questions/12…nform-datagridview-header
    Deine zweite Frage: Was soll statt dessen passieren?
    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!
    @Toolmaster so was:

    VB.NET-Quellcode

    1. DataGridView1.ClearSelection()
    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!
    Danke schaut ja jetzt wirlich aus wie ein listview.

    Nur ganz schön unübersichtlich zum einstellen. Aber dafür viele Möglichkeiten. :)

    Noch 2 sachen und dann gebe ich Ruhe. Dann hast du nämlich meinen Abend gerettet. :thumbsup: Meine Frau wird sich freuen.

    Man fügt doch so Einträge hinzu:

    VB.NET-Quellcode

    1. DataGridView1.Rows.Add(i & "Textbox1.Text", "hallo", "hugo", "test")


    wie kann ich jetzt zu einem eintrag einen tag hinzufügen.

    Das zweite ist sicher ne Einstellung aber ich finde sie nicht.
    Der Text in den Zeilen wird weiter Links angezeigt als der Text im Header.
    @Toolmaster Lass das DGV leer, generiere eine entsprechende DataTable und weise diese dem DGV als DataSource zu.
    Gugst Du z.B. hier: Differenz in Prozent ausrechnen
    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!
    Geht es nicht einfacher einen tag zu schreiben ohne das ich wieder alles umbauen muss'? :(

    Im listview war das simple

    OK da man im Datagriedview Collums verstecken kann ist tag nicht mehr wichtig.

    Vileicht nicht das schönste aber es funktioniert.

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

    Du kannst auch mal hier bischen spickeln, um eine Ahnung von dem zu kriegen, was mMn das wirkliche Potential des DGVs ist (Databinding): vier Views-Videos
    Das geht ja noch weit über das von Rod angedeutete hinaus.
    Wenn man so damit arbeitet, kommen einem so Ideen von Tags und versteckten Columns eher komisch vor.
    Weil alle Daten, die man zur Verarbeitung braucht, liegen in typisierten DataTables, und davon zeigt man das an, was anzuzeigen sinnvoll ist (verstecken würde ich das nicht nennen).
    Eines verstehe ich noch nicht an dem DataGridView.

    Ich fülle so mein View

    VB.NET-Quellcode

    1. For Each sFile In My.Computer.FileSystem.GetFiles(sPath, FileIO.SearchOption.SearchTopLevelOnly, "*.xml")
    2. Try
    3. Dim po As XElement = XElement.Load(sFile)
    4. Dim e As XElement = po.Element("Information")
    5. DataGridView1.Rows.Add(e.Attribute("Datum").Value, e.Attribute("Auflösung").Value, e.Attribute("Monitore").Value, e.Attribute("Benutzer").Value, sFile)
    6. Catch
    7. End Try
    8. Next
    9. End If
    10. DataGridView1.ClearSelection()


    Funktioniert auch wunderbar und durch DataGridView1.ClearSelection() ist auch keine Zeile markiert.

    Jetzt aber zu meinem Problem

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CurrentCellChanged(sender As Object, e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged


    sollte doch das gleiche sein wie bei der Listview

    VB.NET-Quellcode

    1. Private Sub ListView1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListView1.SelectedIndexChanged


    oder?

    Den wenn ich beim ersten mal die erste Zeile anklicke reagiert es nicht. erst beim zweiten mal. Merkwürdig.

    Habe ich da wo einen Denkfehler?

    Toolmaster schrieb:

    sollte doch das gleiche sein wie bei der Listview
    Eher nicht.
    Was sagt die MSDN zu CurrentCellDirtyStateChanged ?
    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!