如何在DataGridView中为每个列添加CellContentClick事件

问题描述 投票:1回答:1

是否可以为每个列设置CellContentClick事件方法,例如作为DataGridViewColumn的方法。

如果仅对此列发生CellContentClick而不是像普通DataGridView.CellContentClick那样发生整个DataGridView,则会运行此方法。

我需要这个来推导DataGridViewButtonColumn。因此,如果需要,可以将自己的方法/属性添加到此DataGridViewColumn中。

c# winforms datagridview datagridviewcolumn
1个回答
1
投票

您可以为自定义列类型定义事件,然后覆盖自定义单元格的OnContentClick并引发列的事件。

请记住,要使用它,您需要通过代码订阅事件,因为事件属于Column,您无法在设计器中看到它。

在这里,我创建了一个自定义按钮列,您可以订阅它的ContentClick事件。这样,您无需检查CellContentClickDataGridView事件是否因为单击此按钮列而引发。

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");
© www.soinside.com 2019 - 2024. All rights reserved.