C# 如何扩展dataGridView内置行拖放
我已经能够让2个C#winform DataGridView在它们之间拖放行,但它使用了大量代码。现在,我正在考虑创建一个包含10个这样的网格的表单,并尝试重用代码。我以为我可以简单地创建DataGridView的子类并添加事件处理程序,但我遇到了麻烦 具体来说,当intellisense看到的唯一事件没有正确的签名时,如何重写onDragDrop事件 我看到这样的签名:C# 如何扩展dataGridView内置行拖放,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,我已经能够让2个C#winform DataGridView在它们之间拖放行,但它使用了大量代码。现在,我正在考虑创建一个包含10个这样的网格的表单,并尝试重用代码。我以为我可以简单地创建DataGridView的子类并添加事件处理程序,但我遇到了麻烦 具体来说,当intellisense看到的唯一事件没有正确的签名时,如何重写onDragDrop事件 我看到这样的签名:protectedoverride void OnDragDrop(DragEventArgs e),但我希望看到这样的签名:
protectedoverride void OnDragDrop(DragEventArgs e)
,但我希望看到这样的签名:protected override void OnDragDrop(object sender,DragEventArgs e)
,因为我在代码中使用了sender。我错过了什么?如何正确覆盖此事件?我的非工作代码如下:
public class DragGrid : DataGridView
{
private DragGrid()
{
}
private DragGrid(DataTable table)
{
this.DataSource = table;
}
protected override void OnDragEnter(DragEventArgs e)
{
base.OnDragEnter(e);
e.Effect = DragDropEffects.Copy;
}
protected override void OnDragDrop(DragEventArgs e)
{
base.OnDragDrop(e);
DataGridView grid = sender as DataGridView;
DataTable table = grid.DataSource as DataTable;
DataRow row = e.Data.GetData(typeof(DataRow)) as DataRow;
if (row != null && table != null && row.Table != table)
{
table.ImportRow(row);
row.Delete();
table.AcceptChanges();
}
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
DragGrid.HitTestInfo info = ((DragGrid)this).HitTest(e.X, e.Y);
if (info.RowIndex >= 0)
{
DataRow view = ((DataTable)(this.DataSource)).Rows[info.RowIndex];
if (view != null)
{
this.DoDragDrop(view, DragDropEffects.Copy);
}
}
}
}
您在事件和代理之间的定义上犯了错误:
protectedoverrideondragenter(DragEventArgs e){}
是一种调用数据网格的
当此事件累计时,将调用签名为受保护的所有委托(对象发送方,DragEventArgs e){}
因此,您不能覆盖事件-这只是一个字段。您可以重写调用它的方法,但我认为这并不是您想要的。我建议您在构建过程中为脚本的DragEnter
事件添加一个处理程序:
private DragGrid(DataTable table)
{
this.DataSource = table;
this.DragEnter += new DragEventHandler(_onDragEnter);
}
private void _onDragEnter(object sender, DragEventArgs e)
{
// your code here
}
覆盖在DataGridView本身中。只需用“this”替换“sender”,您就一切就绪。-好的,我应该如何重写该方法?-给出错误:
error 2无法将类型“System.EventHandler”隐式转换为“System.Windows.Forms.DragEventHandler”M:\Projects\flexointorymanagement\flexointorymanagement\DragGrid.cs 15 31 flexointorymanagement
-我应该在方法中仍然引用base.
我会做点什么。没有完整的解决方案很难说。另外,我建议您不要在事件处理程序中使用基。
——仅当您将对OnDragEnter
使用覆盖时——它现在实际上已经生成了。我将尝试使用多个网格。下面的两个答案都是正确的,都有效。