如何在 DataGridView 中为每列添加 CellContentClick 事件
How to add a CellContentClick Event per Column in a DataGridView
是否可以为每个列设置一个 CellContentClick 事件方法,例如作为 DataGridViewColumn 的方法。
如果 CellContentClick 仅针对此列发生,而不是像正常 DataGridView.CellContentClick 那样针对整个 DataGridView 发生,则此方法 运行。
我需要这个来派生 DataGridViewButtonColumn。因此,如果需要,可以将我自己的 methods/properties 添加到此 DataGridViewColumn。
您可以为自定义列类型定义一个事件,然后覆盖自定义单元格的 OnContentClick
并引发该列的事件。
请记住,要使用它,您需要通过代码订阅事件,因为该事件属于 Column
,您在设计器中看不到它。
例子
我在这里创建了一个自定义按钮列,您可以订阅它的 ContentClick
事件。这样您就不需要检查 DataGridView
的 CellContentClick
事件是否因为单击此按钮列而引发。
using System.Windows.Forms;
public class MyDataGridViewButtonColumn : DataGridViewButtonColumn
{
public event EventHandler<DataGridViewCellEventArgs> ContentClick;
public void RaiseContentClick(DataGridViewCellEventArgs e)
{
ContentClick?.Invoke(DataGridView, e);
}
public MyDataGridViewButtonColumn()
{
CellTemplate = new MyDataGridViewButtonCell();
}
}
public class MyDataGridViewButtonCell : DataGridViewButtonCell
{
protected override void OnContentClick(DataGridViewCellEventArgs e)
{
var column = this.OwningColumn as MyDataGridViewButtonColumn;
column?.RaiseContentClick(e);
base.OnContentClick(e);
}
}
使用需要通过代码订阅事件,因为事件属于Column
,在设计器中看不到:
var c1 = new MyDataGridViewButtonColumn() { HeaderText = "X" };
c1.ContentClick += (obj, args) => MessageBox.Show("X Cell Clicked");
是否可以为每个列设置一个 CellContentClick 事件方法,例如作为 DataGridViewColumn 的方法。
如果 CellContentClick 仅针对此列发生,而不是像正常 DataGridView.CellContentClick 那样针对整个 DataGridView 发生,则此方法 运行。
我需要这个来派生 DataGridViewButtonColumn。因此,如果需要,可以将我自己的 methods/properties 添加到此 DataGridViewColumn。
您可以为自定义列类型定义一个事件,然后覆盖自定义单元格的 OnContentClick
并引发该列的事件。
请记住,要使用它,您需要通过代码订阅事件,因为该事件属于 Column
,您在设计器中看不到它。
例子
我在这里创建了一个自定义按钮列,您可以订阅它的 ContentClick
事件。这样您就不需要检查 DataGridView
的 CellContentClick
事件是否因为单击此按钮列而引发。
using System.Windows.Forms;
public class MyDataGridViewButtonColumn : DataGridViewButtonColumn
{
public event EventHandler<DataGridViewCellEventArgs> ContentClick;
public void RaiseContentClick(DataGridViewCellEventArgs e)
{
ContentClick?.Invoke(DataGridView, e);
}
public MyDataGridViewButtonColumn()
{
CellTemplate = new MyDataGridViewButtonCell();
}
}
public class MyDataGridViewButtonCell : DataGridViewButtonCell
{
protected override void OnContentClick(DataGridViewCellEventArgs e)
{
var column = this.OwningColumn as MyDataGridViewButtonColumn;
column?.RaiseContentClick(e);
base.OnContentClick(e);
}
}
使用需要通过代码订阅事件,因为事件属于Column
,在设计器中看不到:
var c1 = new MyDataGridViewButtonColumn() { HeaderText = "X" };
c1.ContentClick += (obj, args) => MessageBox.Show("X Cell Clicked");