WinForms:Umgang mit dem DataGridViewButtonColumn-Klickereignis

WinForms:Umgang mit dem DataGridViewButtonColumn-Klickereignis

Es gibt keine direkte Möglichkeit, das Klickereignis der DataGridViewButtonColumn-Schaltfläche zu behandeln.

Stattdessen müssen Sie:

  • Das DataGridView.CellContentClick-Ereignis verarbeiten.
  • Überprüfen Sie, ob sie auf die Schaltflächenspalte geklickt haben.
  • Führen Sie die Verarbeitungslogik für Schaltflächenklicks aus und übergeben Sie das gebundene Datenelement.

In diesem Artikel zeige ich ein Schritt-für-Schritt-Beispiel, wie man mit dem Button-Klick umgeht.

Beispiel DataGridView mit einer Schaltflächenspalte

Wenn ich auf die Schaltfläche klicke, möchte ich, dass sie der Person Hallo sagt.

Setzen Sie die Datenquelle auf BindingList

var people = new BindingList<Person>()
{
	new Person() {FullName="Octavia Harris" },
	new Person() {FullName="Thomas Noel" },
	new Person() {FullName="Sama Weir" },
	new Person() {FullName="Usamah Barclay" }
};

dgvHelloWorld.DataSource = people;
Code language: C# (cs)

ClickHandler hinzufügen (Person p)

public void ClickHandler(Person p)
{
	MessageBox.Show($"Hi {p.FullName}");
}
Code language: C# (cs)

DataGridViewButtonColumn zu DataGridView hinzufügen

dgvHelloWorld.Columns.Add(new DataGridViewButtonColumn()
{
	Text = "Say Hi",
	Tag = (Action<Person>)ClickHandler,
	UseColumnTextForButtonValue = true,
	AutoSizeMode = DataGridViewAutoSizeColumnMode.None
});
Code language: C# (cs)

Beachten Sie, dass ich DataGridViewButtonColumn.Tag =ein Delegatobjekt für die ClickHandler-Methode festlege. Warum, erfahren Sie im nächsten Schritt.

Behandeln Sie das CellContentClick-Ereignis

Verbinden Sie zuerst den CellContentClick-Handler.

dgvHelloWorld.CellContentClick += DgvHelloWorld_CellContentClick;
Code language: C# (cs)

Implementieren Sie nun den Handler.

private void DgvHelloWorld_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
	var grid = (DataGridView)sender;

	if(e.RowIndex < 0)
	{
		//They clicked the header column, do nothing
		return;
	}

	if(grid[e.ColumnIndex, e.RowIndex] is DataGridViewButtonCell)
	{
		var clickHandler = (Action<Person>)grid.Columns[e.ColumnIndex].Tag;
		var person = (Person)grid.Rows[e.RowIndex].DataBoundItem;

		clickHandler(person);
	}
}
Code language: C# (cs)

Beachten Sie, dass dies nicht weiß, welche Methode es aufruft. Es wird lediglich der Action-Delegat vom Tag abgerufen und ausgeführt. Dadurch kann der Code einfach erweitert werden, wenn ich eine weitere Schaltflächenspalte hinzufügen möchte. Im Grunde würde ich einfach die Schaltflächenspalte hinzufügen und ihre Tag-Eigenschaft auf eine andere Methode setzen. Der CellContentClick müsste überhaupt nicht geändert werden. Dabei gilt das Open-Closed-Prinzip und ist ein Beispiel für das Strategiemuster .