C# 如何扩展dataGridView内置行拖放

C# 如何扩展dataGridView内置行拖放,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,我已经能够让2个C#winform DataGridView在它们之间拖放行,但它使用了大量代码。现在,我正在考虑创建一个包含10个这样的网格的表单,并尝试重用代码。我以为我可以简单地创建DataGridView的子类并添加事件处理程序,但我遇到了麻烦 具体来说,当intellisense看到的唯一事件没有正确的签名时,如何重写onDragDrop事件 我看到这样的签名:protectedoverride void OnDragDrop(DragEventArgs e),但我希望看到这样的签名:

我已经能够让2个C#winform DataGridView在它们之间拖放行,但它使用了大量代码。现在,我正在考虑创建一个包含10个这样的网格的表单,并尝试重用代码。我以为我可以简单地创建DataGridView的子类并添加事件处理程序,但我遇到了麻烦

具体来说,当intellisense看到的唯一事件没有正确的签名时,如何重写onDragDrop事件

我看到这样的签名:
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
使用覆盖时——它现在实际上已经生成了。我将尝试使用多个网格。下面的两个答案都是正确的,都有效。