如何将 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;
}
我想将 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;
}