WinForms:cómo manejar el evento de clic de DataGridViewButtonColumn

WinForms:cómo manejar el evento de clic de DataGridViewButtonColumn

No hay una forma directa de manejar el evento de clic del botón DataGridViewButtonColumn.

En su lugar, tienes que:

  • Manejar el evento DataGridView.CellContentClick.
  • Compruebe si hicieron clic en la columna del botón.
  • Ejecute la lógica de manejo del clic del botón, pasando el elemento de datos enlazado.

En este artículo, mostraré un ejemplo paso a paso de cómo manejar el clic del botón.

Ejemplo de DataGridView con una columna de botones

Cuando hago clic en el botón, quiero que diga hola a la persona.

Establezca el origen de datos en 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)

Añadir controlador de clics (persona p)

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

Agregar DataGridViewButtonColumn a DataGridView

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

Observe que estoy configurando DataGridViewButtonColumn.Tag =un objeto delegado para el método ClickHandler. Verá por qué en el siguiente paso.

Manejar el evento CellContentClick

Primero conecte el controlador CellContentClick.

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

Ahora implemente el controlador.

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)

Tenga en cuenta que esto no sabe a qué método está llamando. Solo se trata de obtener el delegado Action de la etiqueta y ejecutarlo. Esto hace que el código sea fácil de extender si quiero agregar otra columna de botones. Básicamente, simplemente agregaría la columna del botón y establecería su propiedad Tag en otro método. No sería necesario modificar CellContentClick en absoluto. Esto se adhiere al Principio Abierto-Cerrado y es un ejemplo del Patrón de estrategia .