Как добавить событие CellContentClick для каждого столбца в DataGridView - PullRequest
1 голос
/ 12 марта 2019

Можно ли установить метод события CellContentClick для каждого столбца, например, как метод DataGridViewColumn.

Этот метод будет запускаться, если CellContentClick происходит только для этого столбца вместо всего DataGridView, как обычный DataGridView.CellContentClick делает.

Мне это нужно для получения DataGridViewButtonColumn.Так что было бы возможно добавить мои собственные методы / свойства к этому DataGridViewColumn, если это необходимо.

1 Ответ

1 голос
/ 12 марта 2019

Вы можете определить событие для пользовательского типа столбца, затем переопределить OnContentClick пользовательской ячейки и вызвать событие столбца.

Просто имейте в виду, чтобы использовать его, вам нужно подписать событие через код, потому что событие принадлежит Column, и вы не можете увидеть его в конструкторе.

Пример

Здесь я создал столбец пользовательских кнопок, на который вы можете подписаться на событие ContentClick. Таким образом, вам не нужно проверять, вызвано ли событие CellContentClick для DataGridView из-за нажатия на этот столбец кнопки.

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");
...