【问题标题】:How to add a CellContentClick Event per Column in a DataGridView如何在 DataGridView 中为每列添加 CellContentClick 事件
【发布时间】:2019-03-12 10:33:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# winforms datagridview datagridviewcolumn


    【解决方案1】:

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

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

    示例

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      相关资源
      最近更新 更多