DataGridView Cell abfrage

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

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Maffi.

    DataGridView Cell abfrage

    Moin Freunde, habe da ein kleines Problem und hoffe Ihr könnt mir helfen.
    Plan:
    Wenn ich eine Auflistung von meinem DataGridView habe, möchte ich gerne wissen, wie viele Cellen in allen columns in einer senkrechten spalte "gefüllt" sind oder "empty/Nothing" sind. Und dies möchte ich gerne zusammengezählt haben und wiedergeben können in einer MSG oder Label oder etc.
    Sry für die kack Quali Bild:

    Also sagen wir die 3 Felder Rust sind leer, nun möchte ich gerne wissen wie viele leer oder dementsprechend voll sind. das gezählt und wiedergegeben in den verschiedenen sachen.

    Ist dies möglich ? habe schon viel rumprobiert und gegoogelt und auch hier im Forum gesucht aber nicht das gefunden was mir weiterhelfen könnte.


    Dankeschööööön
    1. Bitte Bilder forenintern per [Erweiterte Antwort] hochladen.
    2. Gehe alle Zeilen per For-Schleife durch, schaue, ob die 3. Zelle der aktuellen Schleifen-Zeile leer ist und wenn ja, erhöhe eine mit 0 initialisierte Variable um 1. Am Ende den Wert der Variable anzeigen lassen. Basics. Woran scheitert es?

    btw: Sollten Deine Daten irgendwo anders herkommen, dann geh die Datenquelle durch.
    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.
    okay danke, nächster Fehler:

    Quellcode

    1. ​For i = 0 To DataGridView1.RowCount - 1
    2. Label9.Text = "0"
    3. If DataGridView1.Rows(i).Cells(2).Value Is Nothing Then
    4. Label9.Text = DataGridView1.RowCount.ToString '
    5. DataGridView1.Rows(i).DefaultCellStyle.BackColor = Color.Red
    6. 'MessageBox.Show("Test" & DataGridView1.RowCount.ToString)
    7. End If
    8. Next

    Warum komm bei der abfrage wenn ich 2 Spalten erstelle wo in einer Zelle "nothing" ist und in der anderen nicht alles belegt = 2 raus und bei der selben abfrage nur 0 ?
    Die Frage ergibt inhaltlich für mich keinen Sinn. Der Inhalt lautet: Wenn Du den Code das 1. Mal ausführst, kommt Zwei raus und beim 2. Mal kommt Null raus.

    Der Code ergibt auch keinen Sinn. Bei jedem Schleifendurchgang setzt Du Dein Label9.Text auf "0" zurück. Das darf aber nur 1x geschehen, und zwar bevor die Schleife beginnt. Und außerdem lässt Du Dir in dem Label die Anzahl aller Zeilen im DGV angeben. Wozu? Ich dachte, dass es darum geht, die Anzahl der leeren Zeilen zu zählen und diese Zahl Am Ende, also nach der Schleife anzeigen zu lassen.
    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.
    Dann bitte umsetzen. Punkt für Punkt.
    1. Du setzt Dein Label9.Text auf "0" zurück, und zwar bevor die Schleife beginnt.
    2. Wenn eine leere Zeile erkannt wird (Post#3, Zeile#3; Dein Code), dann erhöhe eine vor der Schleife deklarierte und mit 0 initialisierte Integer-Variable um 1.
    3. Nach der Schleife zeige den Wert dieser Variable in Deinem Label9 an.
    Woran scheitert es?
    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.



    VB.NET-Quellcode

    1. Private Sub btnCount_Click(sender As Object, e As EventArgs) Handles btnCount.Click
    2. Dim cellNotStringEmpty As Integer = 0
    3. Dim cellIsStringEmpty As Integer = 0
    4. Dim cellisNothing As Integer = 0
    5. For i = 0 To DGV.Rows.Count - 1
    6. For y = 1 To DGV.Columns.Count - 1
    7. Dim cell = DGV.Rows(i).Cells(y).Value
    8. Select Case True
    9. Case cell IsNot Nothing
    10. Dim cellString = DGV.Rows(i).Cells(y).Value.ToString
    11. If cellString IsNot String.Empty Then
    12. cellNotStringEmpty = cellNotStringEmpty + 1
    13. Else
    14. cellIsStringEmpty = cellIsStringEmpty + 1
    15. End If
    16. Case Else
    17. cellisNothing = cellisNothing + 1
    18. End Select
    19. Next y
    20. Next i
    21. MessageBox.Show("Zellen Inhalt - Voll: " & cellNotStringEmpty & " Leer: " & cellIsStringEmpty & " Nothing: " & cellisNothing)
    22. End Sub






    Mit (For y = 1 To DGV.Columns.Count - 1) wird die ID Spalte nicht mit gezählt.
    Supi. Damit geht der Lerneffekt jetzt gegen Null. :cursing:
    Aber wenn Du schon Komplettlösungen anbietest, dann sind die ja auch kommentierbar.

    Zeile#1, #2, #3: Über Option Infer On kann man streiten, ich aktiviere es immer.
    Z#6: Count - 1 ist fragwürdig, da dann die AddNew-Zeile (also die letzte DGV-Zeile) mit ausgewertet wird und somit immer Nothing-Zellen dabei sind. Count - 2 wäre m.E. sinnvoller.
    Z#8: Der Variablenname cell legt eine falsche Fährte. Der Inhalt der Variable ist keine Zelle, sondern deren Value.
    Z#9: wegen 2 Fällen mit Select Case zu arbeiten, ist m.E. Overkill. Ein einfaches If-Statement genügt.
    Z#8, #11: statt .Rows(x).Cells(y) kann man kürzer auch .Item(y, x) schreiben
    Z#13, #15, #18: statt x = x + 1 schreibt man besser und kürzer x += 1
    Z#20, #21: Nach einem Next braucht es keine Variablennamen. Wer die Übersicht verliert, sollte eine komplexe Doppelschleife in Funktionen auslagern.
    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.
    Das mit dem Lerneffekt, war selbstverständlich nicht von mir beabsichtigt!

    ​ Über Option Infer On kann man streiten, ich aktiviere es immer.

    Ist bei mir immer aktiviert. Mir ist klar, dass man nicht 'As Integer = 0' angeben muss. ich dacht zwecks Übersichtlichkeit schreibe ich es trotzdem.
    Genauso wie die Variablen Namen nach dem 'Next'. Mein Fehler.

    ​Count - 1 ist fragwürdig
    und
    ​ wegen 2 Fällen mit Select Case

    Hab ich deswegen genommen weil ich 3 Fälle abfrage. 1. ob value = Nothing, 2. value IsNot String.Empty, 3. value Is String.Empty

    Variablen Namen hab ich geändert. Hast du vollkommen Recht!

    ​.Item(y, x)
    und
    ​x += 1
    wusste ich nicht. Dankeschön!

    Fehler: Um die 'ID'-Spalte nicht zu zählen, muss es natürlich 'For i = 1 To DGV.Rows.Count - 1' sein.

    Geänderter Code:

    VB.NET-Quellcode

    1. ​Private Sub btnCount_Click(sender As Object, e As EventArgs) Handles btnCount.Click
    2. Dim valueNotEmpty As Integer
    3. Dim valueEmpty As Integer
    4. Dim valueNothing As Integer
    5. For i = 1 To DGV.Rows.Count - 1
    6. For y = 0 To DGV.Columns.Count - 1
    7. Dim value = DGV.Item(i, y).Value
    8. Select Case True
    9. Case value IsNot Nothing
    10. Dim cellValue = DGV.Item(i, y).Value.ToString
    11. If cellValue IsNot String.Empty Then
    12. valueNotEmpty += 1
    13. Else
    14. valueEmpty += 1
    15. End If
    16. Case Else
    17. valueNothing += 1
    18. End Select
    19. Next
    20. Next
    21. MessageBox.Show("Zellen Inhalt - Voll: " & valueNotEmpty & " Leer: " & valueEmpty & " Nothing: " & valueNothing)
    22. End Sub


    Über deine Meinung zum geänderten Code, da ich hier im Forum von dir schon sehr viel lernen durfte, würde ich mich freuen.
    Bzgl. der ID-Spalte und der AddNew-Zeile hast Du jetzt aber was durcheinander gehauen. In Zeile#6 und #7 ... uh, das ist aber ungünstig, sehe ich gerade. Du könntest mit x und y als Variablennamen arbeiten, um die "Koordinaten" im DGV anzugeben, aber die Spalten mit y durchzugehen, könnte Verwirrung stiften. Die Spalten (Z#7) müssen von 1 bis DGV.Columns.Count - 1 durchgegangen werden, da stimmte Dein 1. Code, da Du ja die ID-Spalte überspringen willst. Nur die Zeilen müssen eben (weil die letzte Zeile immer leer ist, wenn man AddNew aktiviert hat) von 0 bis DGV.Rows.Count - 2 durchgegangen werden.
    Mit Select Case muss ich Dir widersprechen. Du gehst nur 2 Fälle durch. Und bei einem Fall machst Du noch 2 Unter-Unterscheidungen. Ein doppeltes If wäre m.E. klarer. Aber Haarspalterei.
    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 Du hast vollkommen Recht, dass mich deine Antworten ein wenig verwirrt haben.
    Ich habe bis jetzt immer zuerst die Zeilen durchlaufen. Habe mir heute ein kleines Projekt gemacht und ausprobiert.
    Ich gehe jetzt zuerst die Spalten(x) und in der zweiten Schleife die Zeilen(y) durch.

    Im Projekt sind 3 Datagridview's. Im ersten wird einfach alles gezählt und eingefärbt. Im zweiten ist Spalte "ID" ausgeblendet und die Eigenschaften des Datagridview "AllowUserToAddRows" auf False gesetzt. Das dritte erklärt sich, mM nach, von selbst.




    Und das ist der Code der drei Buttons.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Private Sub btnCount1_Click(sender As Object, e As EventArgs) Handles btnCount1.Click
    2. Dim valueIsNotEmpty As Integer
    3. Dim valueIsEmpty As Integer
    4. Dim valueIsNothing As Integer
    5. For x = 0 To Dgv1.Columns.Count - 1
    6. For y = 0 To Dgv1.Rows.Count - 1
    7. Dim value = Dgv1.Item(x, y).Value
    8. If value IsNot Nothing AndAlso value.ToString IsNot String.Empty Then
    9. valueIsNotEmpty += 1
    10. lsb1.Items.Add(value)
    11. Dgv1(x, y).Style.BackColor = Color.YellowGreen
    12. ElseIf value IsNot Nothing AndAlso value.ToString Is String.Empty Then
    13. valueIsEmpty += 1
    14. Dgv1(x, y).Style.BackColor = Color.SteelBlue
    15. Else
    16. valueIsNothing += 1
    17. Dgv1(x, y).Style.BackColor = Color.Tomato
    18. End If
    19. Next
    20. Next
    21. lblVoll1.Text = valueIsNotEmpty.ToString
    22. lblLeer1.Text = valueIsEmpty.ToString
    23. lblNothing1.Text = valueIsNothing.ToString
    24. lblList1.Text = lsb1.Items.Count.ToString
    25. MessageBox.Show("Zellen Inhalt - Voll: " & valueIsNotEmpty & " Leer: " & valueIsEmpty & " Nothing: " & valueIsNothing)
    26. End Sub
    27. Private Sub btnCount2_Click(sender As Object, e As EventArgs) Handles btnCount2.Click
    28. Dim valueIsNotEmpty As Integer
    29. Dim valueIsEmpty As Integer
    30. For x = 0 To Dgv2.Columns.Count - 1
    31. For y = 0 To Dgv2.Rows.Count - 1
    32. Dim value = Dgv2.Item(x, y).Value
    33. If value.ToString IsNot String.Empty Then
    34. valueIsNotEmpty += 1
    35. lsb2.Items.Add(value)
    36. Dgv2(x, y).Style.BackColor = Color.YellowGreen
    37. Else
    38. valueIsEmpty += 1
    39. Dgv2(x, y).Style.BackColor = Color.SteelBlue
    40. End If
    41. Next
    42. Next
    43. lblVoll2.Text = valueIsNotEmpty.ToString
    44. lblLeer2.Text = valueIsEmpty.ToString
    45. lblList2.Text = lsb2.Items.Count.ToString
    46. MessageBox.Show("Zellen Inhalt - Voll: " & valueIsNotEmpty & " Leer: " & valueIsEmpty)
    47. End Sub
    48. Private Sub btnCount3_Click(sender As Object, e As EventArgs) Handles btnCount3.Click
    49. Dim valueIsNotEmpty As Integer
    50. Dim valueIsEmpty As Integer
    51. For x = 1 To Dgv3.Columns.Count - 1
    52. For y = 0 To Dgv3.Rows.Count - 2
    53. Dim value = Dgv3.Item(x, y).Value
    54. If value.ToString IsNot String.Empty Then
    55. valueIsNotEmpty += 1
    56. lsb3.Items.Add(value)
    57. Dgv3(x, y).Style.BackColor = Color.YellowGreen
    58. Else
    59. valueIsEmpty += 1
    60. Dgv3(x, y).Style.BackColor = Color.SteelBlue
    61. End If
    62. Next
    63. Next
    64. lblVoll3.Text = valueIsNotEmpty.ToString
    65. lblLeer3.Text = valueIsEmpty.ToString
    66. lblList3.Text = lsb3.Items.Count.ToString
    67. MessageBox.Show("Zellen Inhalt - Voll: " & valueIsNotEmpty & " Leer: " & valueIsEmpty)
    68. End Sub


    Ich denke, hoffe, dass ich deine Anregungen richtig verstanden habe.