Ich habe eine Winforms-App und möchte Code auslösen, wenn ein in ein DataGridView
Steuerelement eingebettetes Kontrollkästchen aktiviert / deaktiviert ist. Jedes Ereignis habe ich auch versucht
- Wird
CheckBox
ausgelöst, sobald auf das geklickt wird, bevor sich sein aktivierter Status ändert, oder - Wird nur
CheckBox
ausgelöst, wenn der Fokus verloren geht
Ich kann anscheinend kein Ereignis finden, das unmittelbar nach der Änderung des überprüften Status ausgelöst wird.
Bearbeiten:
Was ich versuche zu erreichen, ist, dass sich die Daten in zwei anderen ändern , wenn sich der überprüfte Zustand von a CheckBox
in one ändert. Bei allen Ereignissen, die ich verwendet habe, ändern sich die Daten in den anderen Gittern erst, nachdem der Fokus im ersten verloren gegangen ist. DataGridView
DataGridView
CheckBox
DataGridView
c#
winforms
datagridview
PJW
quelle
quelle
CurrentCellDirtyStateChanged
Event überprüft ?Antworten:
Um das
DatGridView
s-CheckedChanged
Ereignis zu behandeln, müssen Sie zuerst dasCellContentClick
Feuer auslösen (das nicht denCheckBox
aktuellen Status hat!) Und dann aufrufenCommitEdit
. Dies löst wiederum dasCellValueChanged
Ereignis aus, mit dem Sie Ihre Arbeit erledigen können. Dies ist ein Versehen von Microsoft . Machen Sie etwas wie das Folgende ...Ich hoffe das hilft.
PS Überprüfen Sie diesen Artikel https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.currentcelldirtystatechanged(v=vs.110).aspx
quelle
DataGridViewCheckBox
ist. Dies ist kein WPF und ein Doppelklick auf das Steuerelement unterbricht keine Datenbindung, sondern WinForms. Ein Doppelklick auf das Steuerelement visuell nicht aktualisieren kann aber nicht brechen nichts und in diesem Fall vielleicht die Lösung unten ist die bessere. Vielen Dank.CellContentClick
in hinzufügenCellContentDoubleClick
.CellMouseUp
Dies wird auch dann ausgelöst, wenn die Zelle ausgewählt ist, aber das Kontrollkästchen nicht aktiviert ist - was nicht erwünscht ist.Ich fand, dass @ Killercams Lösung funktioniert, war aber etwas zwielichtig, wenn der Benutzer zu schnell doppelklickte. Ich bin mir nicht sicher, ob andere das auch gefunden haben. Ich habe hier eine andere Lösung gefunden .
Es verwendet die Datagrid's
CellValueChanged
undCellMouseUp
. Changhong erklärt dasHier ist es in Aktion von seinem Beispiel:
Und der Code, der dem Kontrollkästchen mitteilt, dass die Bearbeitung beim Klicken abgeschlossen ist, anstatt zu warten, bis der Benutzer das Feld verlässt:
quelle
KeyPreview
im Formular den Wert true festgelegt und wanne.KeyCode == Keys.Space
festgelegte.Handled = true
. Mit anderen Worten, ich habe gerade die Tastaturbearbeitung deaktiviert.Die Lösung von jsturtevants hat großartig funktioniert. Ich habe mich jedoch für die Verarbeitung im EndEdit-Ereignis entschieden. Ich bevorzuge diesen Ansatz (in meiner Anwendung), da das EndEdit-Ereignis im Gegensatz zum CellValueChanged-Ereignis nicht ausgelöst wird, während Sie das Raster füllen.
Hier ist mein Code (von dem ein Teil von jsturtevant gestohlen wurde:
quelle
CellContentClick
anstatt zu verwenden,CellMouseUp
da Letzteres aufgerufen wird, wenn der Benutzer irgendwo in der Zelle klickt, während Ersteres nur aufgerufen wird, wenn das Kontrollkästchen aktiviert ist.Dies übernimmt auch die Tastaturaktivierung.
quelle
Hier ist ein Code:
quelle
CommitEdit
vonCurrentCellDirtyStateChanged
ist die gesamte Lösung.nach Killercam'answer, Mein Code
und :
quelle
Es geht nur darum, die Zelle zu bearbeiten. Das Problem ist, dass die Zelle nicht bearbeitet wurde. Sie müssen also die Änderungen der Zelle oder der Zeile speichern, um das Ereignis zu erhalten, wenn Sie auf das Kontrollkästchen klicken, damit Sie diese Funktion verwenden können:
Damit können Sie es auch bei einem anderen Ereignis verwenden.
quelle
Ich habe eine einfachere Antwort auf dieses Problem gefunden. Ich benutze einfach die umgekehrte Logik. Der Code ist in VB, unterscheidet sich jedoch nicht wesentlich von C #.
Eines der besten Dinge dabei ist, dass nicht mehrere Ereignisse erforderlich sind.
quelle
Was für mich funktionierte, war
CurrentCellDirtyStateChanged
in Kombination mitdatagridView1.EndEdit()
quelle
Der Code wird in DataGridView wiederholt und überprüft, ob die CheckBox-Spalte aktiviert ist
quelle
Für den Fall CellContentClick können Sie diese Strategie verwenden:
quelle
Ich habe einige Antworten von hier aus versucht, aber ich hatte immer ein Problem (wie Doppelklick oder Verwendung der Tastatur). Also habe ich einige davon kombiniert und ein konsistentes Verhalten erhalten (es ist nicht perfekt, funktioniert aber richtig).
quelle
Um dies bei Verwendung des devexpress xtragrid zu tun, muss das EditValueChanged- Ereignis eines entsprechenden Repository-Elements wie hier beschrieben behandelt werden . Es ist auch wichtig, die Methode gridView1.PostEditor () aufzurufen, um sicherzustellen, dass der geänderte Wert gebucht wurde. Hier ist eine Implementierung:
Beachten Sie, dass es erforderlich ist, eine for-Schleife zu verwenden, um über Zeilen zu iterieren, da das xtragrid keinen Enumerator bereitstellt.
quelle
Durch Entfernen des Fokus nach Änderungen der Zellenwerte können die Werte in DataGridView aktualisiert werden. Entfernen Sie den Fokus, indem Sie die CurrentCell auf null setzen.
quelle
Sie können die Zelle zwingen, den Wert festzuschreiben, sobald Sie auf das Kontrollkästchen klicken und dann das CellValueChanged- Ereignis abfangen . Der CurrentCellDirtyStateChanged wird ausgelöst, sobald Sie auf das Kontrollkästchen klicken.
Der folgende Code funktioniert für mich:
Anschließend können Sie Ihren Code in das CellValueChanged- Ereignis einfügen .
quelle
Ben Voigt fand die beste Lösung in einer Kommentar-Antwort oben:
Im Ernst, das ist alles was Sie brauchen.
quelle