如何将 DataGridViewCellEventArgs 设置为已处理?

How Can I Set DataGridViewCellEventArgs As Handled?

我想将 DataGridViewCellEventArgs 标记为已处理,以便它的下游不会干扰它的处理方式。

DataGridViewCellEventArgs class 没有句柄 属性,它的基数 class.

也没有

我正在处理的事件是CellMouseEnter

这是我从中实例化的基础 DataGridView 控件:

public class DataGridViewWithFormatting : System.Windows.Forms.DataGridView
{
    protected override void OnCellMouseEnter(DataGridViewCellEventArgs e)
    {
        base.OnCellMouseEnter(e);
        this.Cursor = Cursors.Default;
    }
}

这是我在表单中使用的 DataGridView 控件:

private CustomControls.DataGridViewWithFormatting dgvItems;

和...

dgvItems.CellMouseEnter += new EventHandler(dgvItems_CellMouseEnter);

然后...

private void dgvItems_CellMouseEnter()
{
    this.Cursor = Cursors.Hand;
}

您可以根据需要使用以下任一解决方案。

1 - 使用 BeginInvoke

要在CellMouseEnter中设置光标,您可以使用BeginInvoke:

private void Dgv_CellMouseEnter(object sender, DataGridViewCellEventArgs e)
{
    BeginInvoke(new Action(() => dgv.Cursor = Cursors.Hand));
}

2 - 创建一个新的可取消(可处理)DataGridViewCellEventArgs

创建一个新的 MyDataGridViewCellEventArgs 事件参数,派生自具有 Handled 属性 的 DataGridViewCellEventArgs。然后在派生的 DataGridView 中,当调用 base.OnCellMouseEnter 时,传递新的可取消(可处理)事件参数的实例。在事件处理程序中,仍然保留签名中的 DataGridViewCellEventArgs。要取消,将其转换为 MyDataGridViewCellEventArgs 并通过设置 Handled = true;:

取消它
public class DataGridViewWithFormatting : System.Windows.Forms.DataGridView
{
    protected override void OnCellMouseEnter(DataGridViewCellEventArgs e)
    {
        var myE = new MyDataGridViewCellEventArgs(e);
        base.OnCellMouseEnter(myE);
        if (!myE.Handled)
            this.Cursor = Cursors.Default;
    }
}
public class MyDataGridViewCellEventArgs : DataGridViewCellEventArgs
{
    public bool Handled { get; set; } = false;
    public MyDataGridViewCellEventArgs(DataGridViewCellEventArgs e)
        : base(e.ColumnIndex, e.RowIndex) { }
}

和事件处理程序:

private void Dgv_CellMouseEnter(object sender, DataGridViewCellEventArgs e)
{
    dgv.Cursor = Cursors.Hand;
    var myE = e as MyDataGridViewCellEventArgs;
    if (myE != null)
        myE.Handled = true;
}