GridView Liste sortieren

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    GridView Liste sortieren

    Hallo,

    ich versuche mich neu in .NET mit Visual Studio.
    Zum lernen habe ich mir ein kleines Programm geschrieben das Textdateien einliest und in einer GridView als Tabelle ausgibt.
    In dem Programm nutze ich ein Eingabefeld um die Tabellen zu durchsuchen.
    Die Ergebnisse werden mit roter Hintergrundfarbe markiert, alle anderen bleiben im Hintergrund weiß.
    Ich möchte die Ergebnisse so aussortieren, dass die nicht markierten, also weißen Zeilen, ausgeblendet und nur die rot markierten angezeigt werden.
    Nun scheitere ich daran, und bekomme das nicht hin. Ich habe mehrere Versuche gestartet, aber das wird nichts.
    Ich habe die Aussortierung in den GridViews versucht.
    Ich gebe es zu, ich blicke noch nicht durch.
    Kann mir jemand einen Tipp geben wie ich die Sortierung machen muss?

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Environment
    3. Imports System.Windows.Forms.VisualStyles.VisualStyleElement
    4. Imports System.Data.Common
    5. Public Class MeineCDListe
    6. Private Sub MeineCDListe_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. End Sub
    8. Private rnd As Random = New Random
    9. Private zeile As Object
    10. Private sAppPath As String
    11. Private Sub ButtonCover_Click(sender As System.Object, e As System.EventArgs) Handles ButtonCover.Click
    12. Dim files() = System.IO.Directory.GetFiles("w:\CDs\Cover", "*.jpg")
    13. Dim index As Integer = rnd.Next(files.Count)
    14. PictureBoxCover.Image = New Bitmap(files(index))
    15. DataGridView1.Visible = False
    16. PictureBoxCover.Visible = True
    17. End Sub
    18. Private Sub PictureBoxCover_Click(sender As Object, e As EventArgs) Handles PictureBoxCover.Click
    19. End Sub
    20. Private Sub DataGridView1_CellContentClick_1(sender As Object, e As DataGridViewCellEventArgs)
    21. End Sub
    22. Private Sub ButtonSuchen_Click_1(sender As Object, e As EventArgs) Handles ButtonSuchen.Click
    23. DataGridView1.Rows.Clear()
    24. DataGridView1.Columns.Clear()
    25. Dim lines As String() =
    26. Microsoft.VisualBasic.Split(My.Computer.FileSystem.ReadAllText(
    27. "W:\CDs\Listen\ARTISTS.txt", System.Text.Encoding.Default),
    28. Microsoft.VisualBasic.vbCrLf)
    29. With DataGridView1
    30. .Columns.Add("Interpret", "Interpret")
    31. '.Columns.Add("Titel", "Titel")
    32. '.Columns.Add("Genre", "Genre")
    33. .Columns.Add("Standort", "Standort")
    34. Dim fields() As String
    35. For Each line As String In lines
    36. fields = line.Split(";"c)
    37. .Rows.Add(fields)
    38. Next line
    39. End With
    40. DataGridView1.Columns("Interpret").Width = 700
    41. 'DataGridView1.Columns("Titel").Width = 340
    42. 'DataGridView1.Columns("Genre").Width = 150
    43. DataGridView1.Columns("Standort").Width = 230
    44. DataGridView1(DataGridView1.CurrentCell.ColumnIndex, DataGridView1.CurrentCell.RowIndex).Selected = False
    45. DataGridView1.Visible = True
    46. PictureBoxCover.Visible = False
    47. For Each Iterrow As DataGridViewRow In DataGridView1.Rows
    48. For Each c As DataGridViewCell In Iterrow.Cells
    49. If c.Value IsNot Nothing AndAlso c.Value.ToString.Contains(TextBox1.Text) Then
    50. c.Style.BackColor = Color.Red
    51. c.Style.ForeColor = Color.Yellow
    52. DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.SteelBlue
    53. DataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = Color.White
    54. Else
    55. c.Style.BackColor = Color.White
    56. End If
    57. If c.Style.BackColor = Color.Red Then DataGridView1.CurrentCell = c
    58. Next
    59. Next
    60. End Sub
    61. Private Sub ButtonListe_Click(sender As Object, e As EventArgs) Handles ButtonListe.Click
    62. DataGridView1.Rows.Clear()
    63. DataGridView1.Columns.Clear()
    64. Dim lines As String() =
    65. Microsoft.VisualBasic.Split(My.Computer.FileSystem.ReadAllText(
    66. "W:\CDs\Listen\SONGS.txt", System.Text.Encoding.Default),
    67. Microsoft.VisualBasic.vbCrLf)
    68. With DataGridView1
    69. .Columns.Add("Titel", "Titel")
    70. .Columns.Add("Interpret", "Interpret")
    71. .Columns.Add("Album", "Album")
    72. .Columns.Add("Standort", "Standort")
    73. Dim fields() As String
    74. For Each line As String In lines
    75. fields = line.Split(";"c)
    76. .Rows.Add(fields)
    77. Next line
    78. End With
    79. DataGridView1.Columns("Titel").Width = 250
    80. DataGridView1.Columns("Interpret").Width = 250
    81. DataGridView1.Columns("Album").Width = 260
    82. DataGridView1.Columns("Standort").Width = 170
    83. DataGridView1(DataGridView1.CurrentCell.ColumnIndex, DataGridView1.CurrentCell.RowIndex).Selected = False
    84. DataGridView1.Visible = True
    85. PictureBoxCover.Visible = False
    86. For Each Iterrow As DataGridViewRow In DataGridView1.Rows
    87. For Each c As DataGridViewCell In Iterrow.Cells
    88. If c.Value IsNot Nothing AndAlso c.Value.ToString.Contains(TextBox1.Text) Then
    89. c.Style.BackColor = Color.Red
    90. c.Style.ForeColor = Color.Yellow
    91. DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Green
    92. DataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = Color.White
    93. Else
    94. c.Style.BackColor = Color.White
    95. End If
    96. If c.Style.BackColor = Color.Red Then
    97. DataGridView1.CurrentCell = c
    98. End If
    99. Next
    100. Next
    101. End Sub
    102. Private Sub ButtonKuenstler_Click(sender As Object, e As EventArgs) Handles ButtonKuenstler.Click
    103. ' Pfad und DateiName
    104. Dim Path As String() = Microsoft.VisualBasic.Split(My.Computer.FileSystem.ReadAllText("W:\CDs\Listen\ZUFALLSINTERPRET.txt", System.Text.Encoding.Default), Microsoft.VisualBasic.vbCrLf)
    105. ' String Varianle für die spätere aufnahme deiner Zeile
    106. Dim MeineZeile As String = Nothing
    107. ' Zufallsgenerator
    108. Dim Zufall As New Random
    109. ' Deine TextDatei in ein Arry einlesen
    110. Dim lines() As String = Path
    111. ' Die Menge der Zeilen aus der TextDatei ermitteln
    112. Dim Menge As Integer = lines.Count
    113. ' Zufallszahl zwischen 0 und Menge der Zeilen
    114. Dim returnValue As Integer = Zufall.Next(0, Menge)
    115. ' Die Zeile auslesen
    116. MeineZeile = lines(returnValue)
    117. ' Die Zeile anzeigen
    118. RichTextBox1.Text = MeineZeile
    119. End Sub
    120. Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
    121. End Sub
    122. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    123. End Sub
    124. Private Sub Label1_Click(sender As Object, e As EventArgs)
    125. End Sub
    126. Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
    127. End Sub
    128. Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    129. End Sub
    130. End Class


    Danke schon mal

    *Topic verschoben, VB.NET-BBCode aktiviert*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Nur mal so auf die Schnelle...
    Könnte das funktionieren?

    VB.NET-Quellcode

    1. For Each Iterrow As DataGridViewRow In DataGridView1.Rows
    2. For Each c As DataGridViewCell In Iterrow.Cells
    3. If c.Value IsNot Nothing AndAlso c.Value.ToString.Contains(TextBox1.Text) Then
    4. c.Style.BackColor = Color.Red
    5. c.Style.ForeColor = Color.Yellow
    6. DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Green
    7. DataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = Color.White
    8. Else
    9. iterrow.visible = false
    10. exit for
    11. End If
    12. If c.Style.BackColor = Color.Red Then
    13. DataGridView1.CurrentCell = c
    14. End If
    15. Next
    16. Next

    Hi @rolaloe
    was genau funktioniert nicht?
    DatagridRows sollten doch über die .visible-Eigenschaft verfügen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. For Each Iterrow As DataGridViewRow In DataGridView1.Rows
    2. For Each c As DataGridViewCell In Iterrow.Cells
    3. If c.Value Is Nothing orelse not c.Value.ToString.Contains(TextBox1.Text) Then
    4. Iterrow.visible = false
    5. else
    6. c.Style.BackColor = Color.Red
    7. c.Style.ForeColor = Color.Yellow
    8. DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Green
    9. DataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = Color.White
    10. If c.Style.BackColor = Color.Red Then
    11. DataGridView1.CurrentCell = c
    12. End If
    13. End If
    14. Next
    15. Next


    Dieser Code sollte alle Zeilen ausblenden, deren Zellen keinen passenden Text enthalten und passende Zellen visuell hervorheben. Zusätzlich wird die letzte hervorgehobene Zelle als aktuelle Zelle ausgewählt.
    Willst Du stattdessen die erste hevorgehobene Zelle als aktiv setzen, dann so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim firstRedCell As DataGridViewCell = Nothing
    2. For Each Iterrow As DataGridViewRow In DataGridView1.Rows
    3. For Each c As DataGridViewCell In Iterrow.Cells
    4. If c.Value IsNot Nothing AndAlso c.Value.ToString().Contains(TextBox1.Text) Then
    5. c.Style.BackColor = Color.Red
    6. c.Style.ForeColor = Color.Yellow
    7. DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Green
    8. DataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = Color.White
    9. ' ZwischenSpeichern der ersten rote Zelle
    10. If firstRedCell Is Nothing Then
    11. firstRedCell = c
    12. End If
    13. Else
    14. Iterrow.Visible = False
    15. End If
    16. Next
    17. Next
    18. If firstRedCell IsNot Nothing Then
    19. DataGridView1.CurrentCell = firstRedCell
    20. End If


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

    Hallo Dideldum,

    ich habe den Code so eingebaut wie du es geschickt hast.
    Dann wird 1. keine Liste mehr angezeigt und 2. schließt sich das Programm.
    Es wird diese Meldung ausgegeben: "System.InvalidOperationException: "Die neue Zeile, für die kein Commit durchgeführt wurde, kann nicht unsichtbar gemacht werden.""
    Gehe ich recht davon aus, dass Du die Tabelle stets automatisiert befüllen lässt?
    Dann füge in jeden Handler vor dem jeweiligen Befüllen die folgende Zeile ein:

    VB.NET-Quellcode

    1. DataGridView1.AllowUserToAddRows = False

    Ich vermute, dass über die standardmässig eingeblendete unteste "Neue Zeile" gestolpert wird.
    Alternativ kannst Du den .visible = false mit:

    VB.NET-Quellcode

    1. If Not Iterrow.IsNewRow Then
    2. Iterrow.Visible = False
    3. End If

    ergänzen. falls Du die "Neue Zeile" brauchst.

    EDIT:
    Ein:

    VB.NET-Quellcode

    1. DataGridView1.ClearSelection

    ist wohl zweckmässiger, als:

    VB.NET-Quellcode

    1. DataGridView1(DataGridView1.CurrentCell.ColumnIndex, DataGridView1.CurrentCell.RowIndex).Selected = False



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

    Dann poste doch nochmal Deinen aktuellen Code.

    EDIT:
    Was sagt der Einzelschrittablauf, wenn Du einen der Handler abarbeitest?
    Also in die erste Spalkte vor die Zeilennummer 27 klicken - dann erscheint ein roter Ball.
    Dann das Programm starten und Button1 anklicken.
    An dieser Stelle wird das Script beim Ausführen gestoppt und Du kannst mit der Maus über die Einträge im Code-Editor fahren. Dann werden Dir die jeweiligen aktuellen Inhalte angezeigt.
    Mit "F10" wird die nächste Zeile abgearbeitet.
    Mit "F5" wird das Programm fortgesetzt.
    Klickst Du erneut auf den roten Ball, verschwindet dieser und die Einzelschritt-Überwachung ist deaktiviert.
    So sucht man im eigenen Programm mögliche Fehler.

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

    @rolaloe
    Gerne. ;)
    Du hast schon gemerkt, dass ich in meinen beiden Beispielen unterschiedliche Bedingungen reingeschrieben habe, um die Funktionsprinzipien vonAndalso, Orelse und Not zu veranschaulichen?
    Wenn's nicht klappt, poste doch nochmal Deinen derzeitigen Code.
    Hallo Haudrauferzappeltnoch,

    Danke für den Hinweis.
    Ich habe keine Ahnung wie ich dieses Programm zustande gebracht habe.
    Jedenfalls, merke ich, dass ich ganz am Anfang von .NET bin und keine Ahnung habe von was du oder Dideldum redet/schreibt.
    Ich versuche gerade die Hinweise von Dideldum umzusetzen und probiere diese aus.
    Leider bis jetzt, mit wenig Erfolg.

    Wie geschrieben, ich melde mich sobald ich alles durchhabe.
    @rolaloe

    Hallo;
    es ist großartig, dass du dich in .NET und Visual Studio einarbeitest! Dein Ansatz mit der Verarbeitung von Textdateien und der Darstellung in einer GridView ist für den Einstieg in die GUI-Programmierung nachvollziehbar. Es kann jedoch sein, dass dieser Ansatz dich vor einige unnötig komplexe Herausforderungen stellt, besonders wenn es um das Filtern und Formatieren der Daten in der GridView geht.

    Textdateien sind für Einsteiger häufig eine Verlockung, weil sie einfach zu erstellen und zu laden sind. Allerdings haben sie einige Nachteile, zum Beispiel, dass die Daten unstrukturiert sind und du viel zusätzliche Logik brauchst, um sie zu analysieren und darzustellen. Das kann von den grundlegenden Konzepten der Programmlogik ablenken und die Fehlersuche erschweren.

    Eine bessere Alternative für den Einstieg könnte die Verwendung einer einfachen XML-Struktur sein. XML bietet eine klare und leicht lesbare Möglichkeit, Daten hierarchisch zu speichern.
    Diese Daten/Dateien lassen sich relative einfach laden, sortieren usw...

    Vorteile von XML:
    • Lesbarkeit: XML-Dateien sind menschenlesbar und bieten eine klare Struktur.
    • Einfaches Handling: Mit wenigen Zeilen Code kannst du Daten aus einer XML-Datei einlesen und in deiner Anwendung verwenden.
    • Flexibilität: Du kannst die XML-Daten später einfach in eine DataSet, DataTable oder BindingSource überführen oder mit einer "Model-Klasse" arbeiten.
    • Für später: Wenn du fortgeschrittener bist, kannst du XML-Daten mit den integrierten .NET-Klassen wie DataSet oder XmlDocument verarbeiten und direkt an eine DataGridView binden.


    Eine ganz einfache XML-Struktur:

    XML-Quellcode

    1. <Daten>
    2. <Eintrag>
    3. <Interpret>Queen</Interpret>
    4. <Titel>Bohemian Rhapsody</Titel>
    5. <Genre>Rock</Genre>
    6. <Standort>CD-Regal 1</Standort>
    7. </Eintrag>
    8. </Daten>


    Eine einfache Model-Klasse:

    VB.NET-Quellcode

    1. Public Class Eintrag
    2. Public Property Interpret As String
    3. Public Property Titel As String
    4. Public Property Genre As String
    5. Public Property Standort As String
    6. End Class

    Vorteile der "Model-Klasse":
    Deine Daten werden als Objekte abgebildet, was die Arbeit mit ihnen (z. B. Filtern, Sortieren) erleichtert.
    Der Code bleibt sauber und gut wartbar.
    Später kannst du den Umgang mit Datenbanken oder anderen Datenquellen leicht erweitern, indem du dich an das Modell hältst.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    :whistling:
    Danke Amelie, momentan verstehe ich nur Bahnhof.
    XML Dateien sind mir bekannt.
    Nur eben der Einstieg in .Net mit VB noch nicht.
    Die Software kennenlernen, dann das Programmieren lernen .....
    Aber ich bin dran.
    Nur eben wird es im Alter immer schwerer neues zu lernen.
    Nanana, ich gehe auch straight auf das Erwerbs-Ende zu und habe nach über 20jähriger Programmier-Abstinenz vom VB6 vor gut einem Jahr erst mit VB.net angefangen. :D

    VB.NET-Quellcode

    1. DataGridView1.AllowUserToAddRows = False

    Sorgt dafür, dass die standardmässig in DatagridViews in er untersten Zeile verfügbare Eingabezeile für das Hinzufügen von Einträgen ausgeblendet wird, da Du diese wahrscheinlich nicht benötigen wirst und diese sich nicht mit .visible = false verstecken lässt, was wahrscheinlich zu dem Fehler im Code-Ablauf führte.

    Solltest Du die unterste "Neue Zeile" aber brauchen, um manuell Zeilen zur Datagrid hinzuzufügen, musst Du diese mit:

    VB.NET-Quellcode

    1. If Not Iterrow.IsNewRow Then
    2. Iterrow.Visible = False
    3. End If

    in der Schleife überspringen, damit kein Runtime-Fehler eintritt.

    rolaloe schrieb:

    keine Ahnung habe von was du oder Dideldum redet/schreibt
    typisiertes DataSet gibts auch Doku von Microsoft.
    Mit Rechtsklick auf das Projekt im Projektexplorer -> Hinzufügen -> Komponente auswählen -> DataSet auswählen. Du gelangst direkt in den DataSet-Designer. Da einfach mal eine Tabelle draufziehen, zwei/drei spalten eintippen. Rechtsklick auf Projekt -> Neu erstellen. Dann in den Form-Designer wechseln und aus den datenquelle deine Tabelle raussuchen und aufs Form ziehen. Das erzeugt automatisch ein DataGridView das per BindingSource an deine Tabelle gekoppelt wurde. Gucke mal hier rein. Da sind Filmchen drin, die das vorturnen und noch mehr.
    @rolaloe

    ​Nur eben der Einstieg in .Net mit VB noch nicht. Die Software kennenlernen, dann das Programmieren lernen .


    Wenn du gerade erst mit VB.Net anfängst, wäre es gut, dir gleich von Anfang an gute Gewohnheiten anzugewöhnen. Das hilft dir nicht nur, den Überblick zu behalten, sondern spart dir später viel Zeit und Nerven, wenn deine Programme größer und komplexer werden.

    Stell dir vor, dein Programm ist wie eine gut organisierte Werkstatt: Alles hat seinen festen Platz, und du weißt genau, wo du nachschauen musst, wenn du etwas brauchst. So vermeidest du das sogenannte "Spaghetti-Code-Chaos", bei dem alles durcheinander und schwer nachvollziehbar ist.

    Ein guter Ansatz ist, die einzelnen Aufgaben deines Programms aufzuteilen. Zum Beispiel:
    • Die Form-Klasse: Diese sollte hauptsächlich dazu dienen, deine Daten anzuzeigen und mit dem Benutzer zu interagieren.
    • Andere Klassen: Diese kümmern sich um die eigentliche Logik, wie das Suchen, Sortieren, Laden und Speichern von Daten. Jede Klasse und darin enthaltenen Methoden haben ihre eigene Verantwortung.
    Das Schöne daran ist, dass du später genau weißt, wo du etwas ändern musst, ohne lange suchen zu müssen. Außerdem wird dein Programm dadurch verständlicher – auch für andere, die deinen Code vielleicht einmal anschauen.

    Genauso wichtig ist es, aussagekräftige Namen zu vergeben. (Hatte ich früher auch so meine Problemchen mit) Ein Button, der ein zufälliges Bild anzeigt, könnte zum Beispiel BtnShowRandomCover heißen. So weißt du oder jemand anderes später sofort, was der Button macht.


    Beispiel:

    VB.NET-Quellcode

    1. ​Private Sub ButtonCover_Click(sender As System.Object, e As System.EventArgs) Handles ButtonCover.Click


    In ein paar Monaten weist du selber ggf nicht mehr was sich dahinter verbirgt.

    Beispiel:

    VB.NET-Quellcode

    1. Private Sub BtnShowRandomCover_Click(sender As System.Object, e As System.EventArgs) Handles BtnShowRandomCover.Click


    Das ButtonClick-Event verweist dann auf die entsprechende Methode.

    Ein einfaches Beispiel:
    Spoiler anzeigen

    Die Form-Class:

    VB.NET-Quellcode

    1. Public Class FrmCD_Liste
    2. ' Private Instanz der Klasse
    3. Private _randomCDCover As New RandomCDCover
    4. Private Sub BtnShowRandomCover_Click(sender As Object, e As EventArgs) Handles BtnShowRandomCover.Click
    5. If _randomCDCover.VerifyDirectoryExists() Then
    6. ' Alles OK ... Aufruf der nächsten Methode
    7. Else
    8. MessageBox.Show("Das Verzeichnis konnte nicht gefunden oder geprüft werden.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    9. End If
    10. End Sub
    11. End Class


    Die Class mit den Methoden:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class RandomCDCover
    3. Private ReadOnly rnd As New Random() ' Zufallsgenerator als Klassenvariable
    4. Private ReadOnly directoryPath As String = "w:\CDs\Cover" ' Verzeichnis als Konstante oder Klassenvariable
    5. ' Methode zum Prüfen, ob das angegebene Verzeichnis vorhanden ist.
    6. Public Function VerifyDirectoryExists() As Boolean
    7. Try
    8. Return IO.Directory.Exists(directoryPath)
    9. Catch ex As Exception
    10. ' Fehler wird hier geloggt oder optional behandelt, ohne die Hauptlogik zu blockieren
    11. ' oder das das Programm abstürzt.
    12. Debug.WriteLine($"Fehler beim Überprüfen des Verzeichnisses: {ex.Message}")
    13. Return False
    14. End Try
    15. End Function
    16. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: