DataGridView - CheckBoxes.Value über Schleife setzen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Pry.

    DataGridView - CheckBoxes.Value über Schleife setzen

    Hallo Leute,

    ich habe in einer Anwendung eine DGV mit Zellen im Checkbox-Style. Die erste Spalte des DGV sind diese für jede Zeile vorhanden.
    Ich möchte nun über einen Button alle CheckBoxes im DGV auf False setzen, am besten mit einer For-Each-Schleife, aber ich komme dabei auf kein Ergebnis und brauch somit Unterstützung. Ich gebe zu, ich blicke da nicht durch :)

    So sieht es mittlerweile aus, was jedoch nicht rennt:

    VB.NET-Quellcode

    1. For Each ChkBx As DataGridViewCheckBoxCell In dgvDateien.Rows
    2. ChkBx.Value = False
    3. Next

    Anhand der Fehlermeldung ist mir auch klar, warum das nicht läuft, aber mir fehlt das Verständnis dafür, wie es richtigerweise aussehen muss ;(

    Viele Grüße,
    Pry
    Dateien umbenennen und nummerieren - nichts leichter als das!

    Basic File Renamer: 100%
    So fragst du ab ob sie gechecked sind
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Class Form1
    4. ' Prüfen ob eine CheckBox den Wert Check o. Unchecked hat
    5. ' Hier befindet sich in der ersten Spalte die ComboBox
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. ' Anzahl der Zeilen in der DataGridView
    8. Dim Menge As Integer = DataGridView1.Rows.Count - 1
    9. ' Genau so oft die Schleife wiederholen wie die Anzahl der Zeilen (Rows)
    10. For i = 0 To Menge
    11. ' jetzt deine Abfrage
    12. If CBool(DataGridView1.Rows(i).Cells(0).Value) = True Then
    13. MessageBox.Show("CheckBox in Row " & i.ToString & " ist checked !")
    14. End If
    15. Next
    16. End Sub
    17. End Class

    anstatt der MessageBox einfach deinen Wert ändern.
    Hi Bernd,

    danke erstmal für die Antwort. Eine Prüfung, ob gecheckt (oder nicht) benötige ich nicht. Zudem habe ich den Weg über eine For-To-Next-Schleife bereits versucht. Das klappt soweit ja auch ganz gut, ABER die erste CheckBox wird in ihrem Status nicht geändert (ja, ich fange bei 0 an zu zählen). Witzigerweise klappt es aber, wenn ich zuvor einmal in das DGV reinklicke. Dann läuft alles so wie gewollt. Ich kann mir das nicht erklären, daher wollte ich es nämlich mal mit der For-Each-Schleife probieren. Selbst wenn ich der DGV vor meiner Schleife den Focus gebe (was eigentlich keinen Unterschied machen sollte) funktioniert die For-To-Next Variante nicht bzw. erst nach einem Klick in diese.

    Viele Grüße,
    Pry
    Dateien umbenennen und nummerieren - nichts leichter als das!

    Basic File Renamer: 100%
    Bei deiner For Each kommt der fehler
    Das Objekt des Typs "System.Windows.Forms.DataGridViewRow" kann nicht in Typ "System.Windows.Forms.DataGridViewCheckBoxCell" umgewandelt werden.

    Also stimmt ja schon die For Each nicht.

    So müsste dann die For Each Schleife aussehen
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. For Each DataRow As DataGridViewRow In DataGridView1.Rows
    3. For Each DataCell As DataGridViewCell In DataRow.Cells
    4. DataCell.Value = False
    5. Next
    6. Next
    7. End Sub

    Jedoch fehlt hier noch die Abfrage ob in der Celle eine Checkbox ist!
    So werden alle Cellen auf False gesetzt bzw. False reingeschreiben.

    Edit:
    und weil es mich Interessiert hat, mal mit abfrage:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Class Form1
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. For Each DataRow As DataGridViewRow In DataGridView1.Rows
    6. For Each DataCell As DataGridViewCell In DataRow.Cells
    7. If CBool(DataCell.Value) = True Then
    8. DataCell.Value = False
    9. Else
    10. DataCell.Value = True
    11. End If
    12. Next
    13. Next
    14. End Sub
    15. End Class


    so nu jetzt aber



    Edit::
    aber auch diese Routine verbirgt dann fehler. Auch Textfelder werden durchlaufen.
    - alle felder werden durchlaufen. das dauert zu lange und ist nicht nötig
    - auch TextFelder werden mit For Each auf True bzw. False (geschreiben)

    also meiner meinung nach
    bleib bei Count und sprech die Cellen direkt an.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ChaosBernd“ ()

    Also deine Schleife funktioniert genauso wie die Count-Schleife, allerdings wird auch hier die CheckBox in Zeile 1 (RowIndex = 0) nicht verändert. Ich habe nun folgende simple Schleife im Einsatz, wo das eben genannte Problem auch auftritt:

    VB.NET-Quellcode

    1. For i = 0 To dgvDateien.Rows.Count - 1
    2. dgvDateien.Item(0, i).Value = False
    3. Next

    Die Schleife funktioniert erst, wenn ich einmal in das DGV geklickt habe, was ich echt nicht nachvollziehen kann. Ich habe mir mal den Spass gemacht und folgendes eingegeben:

    VB.NET-Quellcode

    1. dgvDateien.Item(0, 0).Value = Not dgvDateien.Item(0, 0).Value
    ==> Funktioniert nicht!

    VB.NET-Quellcode

    1. dgvDateien.Item(0, 1).Value = Not dgvDateien.Item(0, 1).Value
    ==> Funktioniert!

    Wie gesagt reicht ein Klick ins DGV und es rennt... das soll einer verstehen. :wacko:

    Grüße,
    Pry
    Dateien umbenennen und nummerieren - nichts leichter als das!

    Basic File Renamer: 100%
    Hi Bernd,

    das dachte ich mir fast :)
    Ich habe es gelöst, indem ich

    VB.NET-Quellcode

    1. dgvDateien.RefreshEdit()
    hinter die Schleife gepackt habe. Nun läuft es, wie es soll.

    Vielen Dank für die Unterstützung.

    Grüße,
    Pry
    Dateien umbenennen und nummerieren - nichts leichter als das!

    Basic File Renamer: 100%