首页 > 解决方案 > 如何将 DataGridViewCellEventArgs 设置为已处理?

问题描述

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

该类DataGridViewCellEventArgs没有处理的属性,它的基类也没有。

我正在处理的事件是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;
}

标签: c#winformsdatagridviewevent-handlingdatagridviewcolumn

解决方案


您可以根据自己的要求使用以下任一解决方案。

1 - 使用 BeginInvoke

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

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

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

创建一个MyDataGridViewCellEventArgs源自DataGridViewCellEventArgs拥有Handled属性的新事件参数。然后在您的派生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;
}

推荐阅读