DataGridView CheckBox mit Abfrage von Bedingungen

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

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von CorsaGSI16v.

    DataGridView CheckBox mit Abfrage von Bedingungen

    Hallo zusammen,

    ich stehe aktuell vor dem Problem das ich ein gebundenes DataGridView habe in dem mehrere CheckBoxen vorhanden sind.

    Wenn nun eine Checkbox bereits angehakt ist, möchte ich dem Benutzer eine Meldung ausgeben in der entscheiden muss ob er den Haken wirklich entfernen will. Wenn er "abbrechen" klickt soll der Haken nicht entfernt werden und die Abfrage wird beendet.

    Weiterhin möchte ich, wenn die Checkbox nicht angehakt ist und der Benutzer diese anwählt, eine Prüfung durchlaufen die eine Bedingung abfragt und wenn i.O. dann true ermöglich und wenn nein false setzt.

    Somit also für beide Checkboxmöglichkeiten eine Abfrage vor dem Abschließen des EndEdit.

    Folgender Codeausschnitt ist bisher vorhanden:

    VB.NET-Quellcode

    1. Private Sub DatensammlungDataGridView_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles DatensammlungDataGridView.CurrentCellDirtyStateChanged
    2. If DatensammlungDataGridView.IsCurrentCellDirty = True Then
    3. DatensammlungDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit)
    4. End If
    5. End Sub
    6. Private Sub DatensammlungDataGridView_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DatensammlungDataGridView.CellValueChanged
    7. If DatensammlungDataGridView.Columns(e.ColumnIndex).Name = "Kommissioniert" Then
    8. Select Case MsgBox("Vorgang wirklich zurücksetzen?" & Chr(10) & "Trotzdem abschließen?", MsgBoxStyle.OkCancel)
    9. Case MsgBoxResult.Ok
    10. Form1.DatensammlungDataGridView.EndEdit()
    11. Case MsgBoxResult.Cancel
    12. Form1.DatensammlungDataGridView.Rows(Zeile).Cells(Spalte).Value = True
    13. Form1.DatensammlungDataGridView.EndEdit()
    14. End Select
    15. End If
    16. End Sub


    Ich würd mich über Hilfe sehr freuen.
    Aktuell ist mir unklar wie ich nach der Prüfung die Checked Eigenschaft ordentlich setze oder abbreche.


    Vielen Dank und Gruß
    Christian

    CodeTags korrigiert ~VaporiZed

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

    Willkommen im Forum.

    Wenn es Dir darum geht, dass das Häkchen passend angezeigt wird und die MessageBox nur gezeigt wird, wenn ein Häkchen in der CheckBox drin ist, dann folgendermaßen (Die CheckBox-Änderungsaktivität hab ich abgewandelt):

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    2. DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
    3. End Sub
    4. Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
    5. If DataGridView1.CurrentCell Is Nothing OrElse DataGridView1.CurrentCell.ColumnIndex <> 1 Then Return 'CheckBox bei mir in Spalte 2
    6. If Not CBool(DataGridView1.CurrentCell.Value) AndAlso MessageBox.Show("Sicher?", Nothing, MessageBoxButtons.YesNo) = DialogResult.No Then
    7. DataGridView1.CurrentCell.Value = True
    8. DataGridView1.RefreshEdit()
    9. End If
    10. End Sub
    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.
    Tatsächlich hab ich deinen Code-Ausschnitt noch nicht ganz durchblickt, aber du kannst es im Grunde genauso angehen, wie du es geschrieben hast:

    1. Wenn beretis eine Checkbox.ISChecked = True -> Soll eine Abfrage erscheinen. Also kannst du ja durch jede deiner Checkboxen iterieren und falls mind. eine davon gechecked ist, kannst du das Ergebnis speichern und diese Iteration abbrechen

    2. Wenn die Iteration abgebrochen oder allgemein "zuende" ist, schaust du dir das Ergebnis ist. Ist dieses Positiv (also Check vorhanden), fragst du den Nutzer, ober er wirklich unchecken möchte. Dies speicherst du im Ergebnis

    3. Hat der Benutzer eine positive Rückmeldung gegeben (er möchte es unchecken), dann tust du das, wenn nicht dann nicht.
    (Wenn durch die Abfrage alles geunchecked werden soll, reicht die eine Abfrage nach der Iteration, ansonsten fragst du einfach jedes mal innerhalb der Iteration, ob diese eine Checkbox gechecked werden soll

    4. In dem EventHandle der Checkbox (dass der IsChecked Wert sich ändert) die Bedingung hinterlegen und abfragen und das Ereignis, wenn Bedingung nicht zutrifft, canceln
    Für mich ergibt schon die Frage keinen Sinn:

    CorsaGSI16v schrieb:

    Wenn nun eine Checkbox bereits angehakt ist, möchte ich dem Benutzer eine Meldung ausgeben in der entscheiden muss ob er den Haken wirklich entfernen will. Wenn er "abbrechen" klickt soll der Haken nicht entfernt werden und die Abfrage wird beendet.
    Hä?
    Angenommen du lädtst deine Daten, und 15 Checkboxen sind angehakt.
    Dann willst du bei jeder dieser Checkboxen einen Dialog aufpoppen, ob er wirklich den Haken wegmachen will?
    Ich als User würde die Hände vonne Tastatur nehmen und hilfesuchend in die Kamera: "Aber ich hab doch garnix gesagt...?!?!?"
    Ich muss intervenieren. Entsprechend den Post#1-Angaben soll der Haken einen Auftragsstatus à la »Erledigt« darstellen. Das ist normalerweise zu setzen, wenn der Auftrag wirklich endgültig erledigt ist. Ich sehe jetzt kein Problem darin, den User zu fragen, wenn er dabei ist, den Haken wegzumachen, ob er das wirklich vorhat. Den Haken setzt man normalerweise nicht ohne Grund auf erledigt. Und jetzt klingt es für mich so, als ob der TE nur noch nicht genau weiß, wie er das umsetzen kann. Aber vielleicht bin ich mal wieder am Spekulatiusbacken.
    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

    Ich hab das aber auch ähnlich wie du verstanden (wenn auch nicht, ob eine Abfrage des User für alles oder für jede CheckBox), und das ergibt auch irgendwie Sinn dann. Aber dann denke ich dennoch, dass man das in den einzelnen Schritten, die ich aufgezeigt habe, so der Reihe nach abarbeiten kann
    Bei mir kam an, dass jede DGV-Zeile ein von den anderen unabhängiger Auftrag ist.
    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.
    Hallo zusammen,

    vielen Dank für die schnellen Rückmeldungen.
    Der Hinweis mit

    Quellcode

    1. ​DataGridView1.RefreshEdit()

    ist super, vielen Dank dafür.

    Es ist nun so, das die "CellValueChanged" Sub nochmals durchlaufen wird wenn der Benutzer auf Abbrechen klickt (Weil die Checkeigenschaft nochmal geändert wird).

    Gibt es eine saubere Möglichkeit das zu umgehen?

    Und ja, jede DGV Zeile ist ein unabhängiger Auftrag.
    Du könntest eine Variable nehmen, mit du das abbrichst, wenn es durch den Benutzer geändert wird

    Benutzer Aktion -> Setze Variable "UserHandled" auf True, ändere checkbox.IsChecked

    CheckedChange Aktion -> If (Is Not UserHandled) ... mache deine Aktionen End If , danach setze "UserHandled" auf False

    Ist vielleicht nicht die eleganteste, aber eine Möglichkeit wie es funktioniert
    ich bin immer dafür an den Daten zu arbeiten - nicht am Control rumfummeln.
    Daher würde ich die Spalte auf Readonly setzen, und das CellContentClick-Event verarbeiten, und da den Dialog öffnen.
    Und je wie im Dialog entschieden wird wird der Wert in den Daten gesetzt (oder nicht).
    Mehr ist nicht zu tun - Dank Databinding wird das DGV das dann auch so anzeigen wie's ist.
    So ist man die Ereigniskette los, die sich auftut, wenn man erst reagiert, wenn der User schon was eingetragen hat, und dann - ja? lieber dochnicht? und zurückrudern.