Ich entwickle eine Windows-Anwendung mit C #. ich benutzeDataGridView
, um Daten anzuzeigen. Ich habe eine Schaltflächenspalte hinzugefügt. Ich möchte wissen, wie ich mit Klickereignissen auf dieser Schaltfläche in DataGridView umgehen kann.
c#
.net
winforms
datagridview
Himadri
quelle
quelle
Antworten:
Sie haben Ihrer Schaltfläche eine Schaltfläche hinzugefügt
DataGridView
und möchten beim Klicken Code ausführen.Einfach peasy - folgen Sie einfach diesen Schritten:
Verbote:
Zunächst ist Folgendes NICHT zu tun:
Ich würde die Vorschläge in einigen der anderen Antworten hier vermeiden und sogar in der Dokumentation bei MSDN enthalten sein, um den Spaltenindex oder den Spaltennamen fest zu codieren, um festzustellen, ob auf eine Schaltfläche geklickt wurde. Das Klickereignis wird für das gesamte Raster registriert. Sie müssen also irgendwie feststellen, dass auf eine Schaltfläche geklickt wurde. Sie sollten dies jedoch nicht tun, indem Sie davon ausgehen, dass Ihre Schaltfläche in einem bestimmten Spaltennamen oder Index gespeichert ist. Es gibt einen einfacheren Weg.
Achten Sie auch darauf, welches Ereignis Sie behandeln möchten. Auch hier verstehen die Dokumentation und viele Beispiele dies falsch. Die meisten Beispiele behandeln das
CellClick
Ereignis, das ausgelöst wird:... sondern auch feuern , wenn die Zeile Header geklickt wird. Dies erfordert das Hinzufügen von zusätzlichem Code, um festzustellen, ob der
e.RowIndex
Wert kleiner als 0 istBehandeln Sie stattdessen das,
CellContentClick
was nur auftritt:Aus irgendeinem Grund wird die Spaltenüberschrift auch als "Inhalt" in einer Zelle betrachtet, daher müssen wir dies unten noch überprüfen.
DOS:
Folgendes sollten Sie also tun:
Zuerst warf den Absender eingeben
DataGridView
es interne Eigenschaften zur Entwurfszeit belichten. Sie können den Typ des Parameters ändern, dies kann jedoch manchmal das Hinzufügen oder Entfernen von Handlern schwierig machen.Um zu sehen, ob auf eine Schaltfläche geklickt wurde, überprüfen Sie einfach, ob die Spalte, die das Ereignis auslöst, vom Typ ist
DataGridViewButtonColumn
. Da wir den Absender bereits in Typ umgewandelt habenDataGridView
, können wir dieColumns
Sammlung abrufen und die aktuelle Spalte mit auswählene.ColumnIndex
. Überprüfen Sie dann, ob dieses Objekt vom Typ istDataGridViewButtonColumn
.Wenn Sie zwischen mehreren Schaltflächen pro Raster unterscheiden müssen, können Sie diese natürlich anhand des Spaltennamens oder des Index auswählen. Dies sollte jedoch nicht Ihre erste Prüfung sein. Stellen Sie immer sicher, dass zuerst auf eine Schaltfläche geklickt wurde, und behandeln Sie dann alles andere entsprechend. In den meisten Fällen, in denen Sie nur eine Schaltfläche pro Raster haben, können Sie direkt zu den Rennen springen.
Alles zusammen:
C # :
VB :
Update 1 - Benutzerdefiniertes Ereignis
Wenn Sie ein bisschen Spaß haben möchten, können Sie Ihr eigenes Ereignis hinzufügen, das ausgelöst wird, wenn auf eine Schaltfläche im DataGrid geklickt wird. Sie können es nicht zum DataGrid selbst hinzufügen, ohne mit Vererbung usw. in Konflikt zu geraten. Sie können Ihrem Formular jedoch ein benutzerdefiniertes Ereignis hinzufügen und es gegebenenfalls auslösen. Es ist etwas mehr Code, aber der Vorteil ist, dass Sie getrennt haben, was Sie tun möchten, wenn auf eine Schaltfläche geklickt wird, und wie Sie feststellen können, ob auf eine Schaltfläche geklickt wurde.
Deklarieren Sie einfach ein Ereignis, lösen Sie es gegebenenfalls aus und behandeln Sie es. Es wird so aussehen:
Update 2 - Erweitertes Raster
Was großartig wäre, wäre, wenn wir mit einem Raster arbeiten würden, das diese Dinge nur für uns erledigt. Wir könnten die erste Frage leicht beantworten :
you've added a button to your DataGridView and you want to run some code when it's clicked
. Hier ist ein Ansatz, der dieDataGridView
. Es lohnt sich möglicherweise nicht, mit jeder Bibliothek ein benutzerdefiniertes Steuerelement bereitzustellen, aber zumindest wird der Code, der zum Bestimmen, ob auf eine Schaltfläche geklickt wurde, verwendet wird, maximal wiederverwendet.Fügen Sie dies einfach Ihrer Baugruppe hinzu:
Das ist es. Nie wieder anfassen. Stellen Sie sicher, dass Ihr DataGrid vom Typ
DataGridViewExt
ist, der genauso funktionieren sollte wie ein DataGridView. Außer es wird auch ein zusätzliches Ereignis ausgelöst, das Sie wie folgt behandeln können:quelle
TypeOf senderGrid.Rows(e.RowIndex).Cells(e.ColumnIndex) Is DataGridViewButtonCell
public class DataGridViewExt : DataGridView { public event DataGridViewCellEventHandler CellButtonClick; public DataGridViewExt() { this.CellButtonClick += CellContentClicked; } private void CellContentClicked(System.Object sender, DataGridViewCellEventArgs e) { if (this.Columns[e.ColumnIndex].GetType() == typeof(DataGridViewButtonColumn) && e.RowIndex >= 0 ) { CellButtonClick.Invoke(this, e); } } }
Dies wird hier für WinForms vollständig beantwortet: DataGridViewButtonColumn Class
und hier: Gewusst wie: Auf Schaltflächenereignisse in einem GridView-Steuerelement reagieren
für Asp.Net abhängig von der Steuerung, die Sie tatsächlich verwenden. (Ihre Frage lautet DataGrid, aber Sie entwickeln eine Windows-App. Das Steuerelement, das Sie dort verwenden würden, ist also DataGridView ...)
quelle
dataGridView1_CellClick
diesen Code nicht eingegeben. Können Sie Ihre Antwort aktualisieren und mir eine Beschreibung geben?Hier ist die bessere Antwort:
Sie können kein Ereignis mit Schaltflächenklick für Schaltflächenzellen in einer DataGridViewButtonColumn implementieren. Stattdessen verwenden Sie das CellClicked-Ereignis von DataGridView und bestimmen, ob das Ereignis für eine Zelle in Ihrer DataGridViewButtonColumn ausgelöst wurde. Verwenden Sie die DataGridViewCellEventArgs.RowIndex-Eigenschaft des Ereignisses, um herauszufinden, auf welche Zeile geklickt wurde.
hier zu finden: button click event in datagridview
quelle
Dies löst mein Problem.
quelle
Ein bisschen zu spät zur Tabelle hier, aber in c # (vs2013) müssen Sie auch keine Spaltennamen verwenden, tatsächlich ist ein Großteil der zusätzlichen Arbeit, die einige Leute vorschlagen, völlig unnötig.
Die Spalte wird tatsächlich als Mitglied des Containers erstellt (das Formular oder die Benutzersteuerung, in die Sie DataGridView eingefügt haben). Aus dem Designer-Code (dem Material, das Sie nur bearbeiten sollen, wenn der Designer etwas kaputt macht) sehen Sie Folgendes:
...
...
Im CellContentClick-Handler müssen Sie also nicht nur sicherstellen, dass der Zeilenindex nicht 0 ist, sondern auch überprüfen, ob die angeklickte Spalte tatsächlich die gewünschte ist, indem Sie Objektreferenzen vergleichen:
Beachten Sie, dass das Schöne daran ist, dass alle Namensänderungen vom Compiler abgefangen werden. Wenn Sie mit einem Textnamen indizieren, der sich ändert oder den Sie falsch großschreiben, sind Sie an Laufzeitprobleme gebunden. Hier verwenden Sie tatsächlich den Namen eines Objekts, das der Designer basierend auf dem von Ihnen angegebenen Namen erstellt. Aber jede Nichtübereinstimmung wird Sie vom Compiler darauf aufmerksam machen.
quelle
Hier ist mein Code-Snippet, um das Klickereignis auszulösen und den Wert an ein anderes Formular zu übergeben:
quelle
Angenommen, Sie haben beispielsweise
DataGridView
die unten angegebenen Spalten und die datengebundenen Elemente sind vom TypPrimalPallet
, können Sie die unten angegebene Lösung verwenden.Es ist sicherer, direkt auf Spalten zuzugreifen, als sie zu verwenden,
dataGridView1.Columns["MyColumnName"]
und es ist nicht erforderlich, sie zu analysierensender
,DataGridView
da sie nicht benötigt werden.quelle
gut, ich werde beißen.
Sie müssen so etwas tun - offensichtlich ist alles Metacode.
Dadurch wird die IClicked_My_Button_method-Methode bis zum Click-Ereignis der Schaltfläche "eingehakt". Jedes Mal, wenn das Ereignis innerhalb der Eigentümerklasse "ausgelöst" wird, wird unsere Methode ebenfalls ausgelöst.
In der IClicked_MyButton_method geben Sie einfach ein, was passieren soll, wenn Sie darauf klicken.
Die tatsächlichen Details hier liegen bei Ihnen, aber wenn Ihnen noch etwas fehlt, lassen Sie es mich wissen und ich werde versuchen zu helfen.
quelle
Die am häufigsten gewählte Lösung ist falsch, da nicht mit wenigen Schaltflächen in einer Reihe gearbeitet werden kann.
Die beste Lösung ist der folgende Code:
quelle
ToList()
Fügen Sie einfach eine Methode am Ende Ihrer Liste hinzu, wo Sie an datagridview DataSource binden:quelle
Sie können es versuchen, die Reihenfolge der Spalten ist Ihnen egal.
quelle
Zum Beispiel für ClickCell-Ereignis in Windows Forms.
Grüße :)
quelle
Falls jemand C # verwendet (oder siehe Hinweis zu VB.NET unten) und diesen Punkt erreicht hat, aber immer noch nicht weiterkommt, lesen Sie bitte weiter.
Joshuas Antwort hat mir geholfen, aber nicht den ganzen Weg. Sie werden bemerken, dass Peter fragte "Woher würden Sie den Knopf bekommen?", Aber unbeantwortet blieb.
Die einzige Möglichkeit für mich bestand darin, einen der folgenden Schritte auszuführen, um meinen Ereignishander hinzuzufügen (nachdem die DataSource von DataGridView zu meiner DataTable und die DataGridViewButtonColumn zur DataGridView hinzugefügt wurden):
Entweder:
oder:
Fügen Sie dann die in den verschiedenen Antworten oben gezeigte Handlermethode hinzu (entweder dataGridView1_CellClick oder dataGridView1_CellContentClick).
Hinweis: VB.NET unterscheidet sich in dieser Hinsicht von C #, da wir der Signatur unserer Methode einfach eine Handles-Klausel hinzufügen oder eine AddHandler-Anweisung ausgeben können, wie im Microsoft-Dokument "Gewusst wie: Aufrufen eines Ereignishandlers in Visual Basic " beschrieben.
quelle
Sie werden eine solche Schaltflächenspalte in Ihre dataGridView einfügen
Anschließend können Sie einige Aktionen innerhalb des Zellenklickereignisses hinzufügen. Ich fand, dass dies der einfachste Weg ist.
Ich habe festgestellt, dass das Cell Click-Ereignis häufig automatisch abonniert wird. Also brauchte ich diesen Code unten nicht. Wenn Ihr Zellenklickereignis jedoch nicht abonniert ist, fügen Sie diese Codezeile für Ihre dataGridView hinzu.
quelle