DataGridView CheckBox immer False?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von Drahuverar.

    DataGridView CheckBox immer False?

    Heyhoo..

    wieder einmal eine Frage zu 'nem Control :whistling:

    Ich dachte mir, das ich ziemlich schnell überprüfen kann, ob die CheckBox einen Haken hat oder nicht:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    2. Dim isChecked As Boolean = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
    3. MsgBox(isChecked)
    4. End Sub


    Aber irgendwie bekomme ich immer ein "False" zurück. Auf anderen Zellen erhalte ich ein True...(varchars) ?(
    Die CheckBox wird durch mein DataSet erstellt (Bit Datenfeld aus der Datenbank)
    Bin ich auf dem Holzweg?

    Grüße,
    Drahuverar
    Option Strict On!
    Jou.
    @Drahuverar Dies funktioniert:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim isChecked As Boolean = DirectCast(DataGridView1.Rows(0).Cells(0).Value, Boolean)
    3. MessageBox.Show(isChecked.ToString)
    4. End Sub
    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!
    Hey @ErfinderDesRades
    Also Option Strict On und Explizit On habe ich generell (was heißt generell.. seit 2 Wochen :thumbsup: ) immer am Anfang meines Quellcodes.
    Habe auch so keine Meldung von VS bekommen, das es falsch sei. Bisher habe ich auch keine MsgBox angezeigt bekommen, wenn ich nicht .ToString drangeschrieben habe, also schon komisch das es mir trotzdem angezeigt worden ist. ?(


    EDIT:
    Visual Studio neugestartet und die IDE hat direkt gemeckert. Nun weiß ich was du meinst :/

    @RodFromGermany
    Das funktioniert... Aber wieso klappt es nicht wenn ich den "RowIndex" und "ColumnIndex" nehme?
    Das sind doch Integer .. ?(
    Oder ist CellContentClick das falsche Event?

    Option Strict On!
    Wahrscheinlich

    Drahuverar schrieb:

    das falsche Event
    Ich hab ne Situation, da kommt da immer True raus. :/
    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!
    @ErfinderDesRades
    Ich bekomme keine Fehlermeldung.
    Ein Bildchen im Anhang die beinhaltete Werte hab ich mal so dabei geschrieben..
    Ist ja im Grunde genau das gleiche wie beim Button Event, nur halt variabel.

    @RodFromGermany
    Also ich hab, nachdem die Box nicht mehr gecheckt war, ein False bekommen.
    Über den Button.Click

    Mh.. Ich dachte dieses CellContentClick sei etwas spezifischer ^^
    Wenn nicht muss ich mein CellClick in dieser Spalte explizit vergeben.. kA 8|

    Ich denke sowieso das ich das mit einem Button.Click dann lösen werde.. Laufe dann alle durch und je nach gecheckter Box wird die Flag in der Datenbank gesetzt.. :whistling:
    Bilder
    • Werte.png

      9,96 kB, 1.016×120, 152 mal angesehen
    Option Strict On!

    Drahuverar schrieb:

    CellClick
    funktioniert. :thumbsup:
    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
    Danke für dein Feedback!
    Ich hab es gerade getestet...

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
    2. Dim isChecked As Boolean = DirectCast(DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value, Boolean)
    3. MessageBox.Show(isChecked.ToString)
    4. End Sub


    Immernoch "False" bei mir ?(


    @ErfinderDesRades
    Noch eine Frage an euch beide.

    CellClick
    "Tritt auf, wenn auf einen beliebigen Teil einer der Zelle geklickt wird."

    CellContentClick
    "Tritt auf, wenn auf den Inhalt einer Zelle geklickt wird."

    Also meine Vermutung:
    CellContentClick meint wirklich die Zelle und nicht das darauf liegende (Child) Control (CheckBox) ?
    Wäre das denn nun richtig oder falsch? Nur für mein Verständnis ?(


    Also ich bin kurz vorm durchdrehen. 8o

    Wenn ich nun folgendes mache:
    Checkbox haken rein -> False
    Checkbox haken raus -> False
    Checkbox haken rein -> False Dann Button.Click -> True
    Checkbox haken raus -> True
    Checkbox haken rein -> True

    da stimmt doch generell was nicht!?


    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim isChecked As Boolean = DirectCast(DataGridView1.Rows(1).Cells(1).Value, Boolean) 'Mit Zelle 2/2 getestet
    3. MessageBox.Show(isChecked.ToString)
    4. End Sub
    5. Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
    6. Dim isChecked As Boolean = DirectCast(DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value, Boolean)
    7. MessageBox.Show(isChecked.ToString)
    8. End Sub

    Option Strict On!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Drahuverar“ ()

    Drahuverar schrieb:

    CellContentClick
    kommt beim Klick auf das CheckBox-Quadrat,
    CellClick kommt beim Klick irgendwo in der Zelle.
    Zieh die Zellen mal extrem breit.
    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!
    Was ein Mist... :huh:

    Dann müsste doch bei CellContentClick auch der Wert richtig rauskommen? True/False?
    Ich glaube ich lass es für heute sein <X

    @RodFromGermany
    Was ein Käse; Kann wohl nicht klappen an dieser Stelle
    For clicks in a DataGridViewCheckBoxCell, this event occurs before the check box changes value, so if you do not want to calculate the expected value based on the current value, you will typically handle theDataGridView.CellValueChanged event instead
    msdn.microsoft.com/en-us/libra…iew.cellcontentclick.aspx
    auch gut~
    codingeverything.com/2013/01/f…iew-cellvaluechanged.html

    Man muss also die Zelle verlassen um das Event auszulösen.. Ich geh kaputt. Ich mach das nun über MouseEvents, 2 boolsche werte und dann sollte das passen oder?
    Option Strict On!

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

    @EaranMaleasi
    ...Gerade im letzten post editiert :D

    Wieso warst du nicht schon früher da? :P :D
    Ist auf jeden Fall blöd beschrieben..... Dann tritt es ja nicht auf, wenn ich Klicke, sondern verlasse... 8| :cursing:

    Habe vorher immer alles in Textboxen gemacht und anderen Controls, weswegen das DataGridView noch völlig Neuland ist. :S
    "Noch viel zu lernen ich hab."
    Option Strict On!

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

    Die Frage ist, musst du tatsächlich genau dann, wenn ein User das Ding anklickt irgendetwas erledigen? oder muss es irgendwann zwischen dem Klick und einer anderen USeraktivität ausgeführt werden?

    Wenn du die Zeit hast, also der User klickt das Häkchen an, und danach noch auf nen Button zum Bestätigen, kannste das ValueChangedEvent trozdem benutzen. Eine Form läuft auch nur in einem Thread, demnach müsste das ValueChangedEvent irgendwo zwischen dem Verlust des Fokus des Grids und dem Click-Event des Buttons aktiv werden.

    Edit:
    Tatsächlich. Eine aufploppende Messagebox im ValueChangedEvent verhindert das Click-Event des Buttons.

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

    Die eigentliche Idee war nach anhaken der CheckBox die Zeile zu entfernen und in der Datenbank als "Erledigt" (1) zu markieren.
    Nach dem Einwand von @RodFromGermany mit dem Button.Click habe ich mir gedacht, dass es wohl besser ist das der Anwender mehrere Datensätze "checken" kann und dann anschließend die Datensätze geupdatet werden..

    So hat der Anwender ein wenig Zeit,.. falls er es sich doch anders überlegt hat (Auch wenn erledigt, erledigt ist)

    Mich hat letzten Endes interessiert was da nun passiert ;(
    Da die Beschreibung für mich bedeutet, dass nach einem Klick das Event abgefeuert wird.. <X
    Option Strict On!
    @ErfinderDesRades
    Ja, wenn man weiß wieso.


    Habe ja angenommen das nach meinem Klick in die Zelle (Die CheckBox in der Zelle) alles läuft will wie ich will. Hätte ich gewusst, das erst nach dem verlassen der Zelle bzw. anklicken einer anderen Zelle oder klicken eines anderen Controls, der Wert der CheckBox auf true bzw. false geschrieben wird, hätte ich das natürlich bleiben lassen.

    Wieder etwas gelernt..
    Option Strict On!
    Dem kann man auf die Sprünge helfen, wie ich grad ausprobiertete:

    VB.NET-Quellcode

    1. Private Sub ItemDataGridView_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles ItemDataGridView.CellContentClick
    2. ItemDataGridView.EndEdit()
    3. Dim value = DirectCast(ItemDataGridView(e.ColumnIndex, e.RowIndex).Value, Boolean)
    4. End Sub
    Ist übrigens eine interessante Idee, an diesem Punkt das DatagridView-Verhalten grundsätzlich zu modifizieren.
    Also normal ists ja oft ganz sinnvoll, dass nicht jede Eingabe gleich ins Datenmodell weiter-geleitet wird, sondern zuvor noch gecancelt werden kann.
    Aber grad bei Checkbox-Betätigung wäre eiglich noch sinnvoller, deren Eingaben gleich zu übernehmen.

    Vlt. mache ich mal ein "Behavior" dafür - das kann man dann aktivieren, und die Checkboxen auf den DGVs verhalten sich anders.

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