是否可以在不进行子类化的情况下扩展DataGridView控件?

时间:2015-08-07 11:21:38

标签: c# winforms datagridview

简短版本:

有没有一种方法可以添加属性并覆盖DataGridView控件上的OnMouseDown / OnMouseUp功能,而无需创建扩展DataGridView的自己的控件?

长版(附带说明):

我正在现有应用程序中的网格之间实现拖放多行移动。我有一个扩展的DataGridView控件具有我需要的功能,它可以在这个网格的实例之间完美地移动行。

这是扩展的DGV类代码:

public partial class DragDropGrid : DataGridView
{
    /// <summary>
    /// When set, the mouse down event and click events don't happen until the mouse button is released.
    /// </summary>
    public bool DelayMouseDown = false;

    public int MouseDownRowIndex = -1;

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (DelayMouseDown)
        {
            return;
        }
        base.OnMouseDown(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        if (DelayMouseDown)
        {
            base.OnMouseDown(e);
        }
        base.OnMouseUp(e);
    }
}

但是,我还有另一个网格(自定义UserControl),我需要能够处理相同的拖放功能。这个网格是我们基类套件的复合用户控件,它有一个DataGridView以及一堆其他东西放在控件上。

我已经尝试过以下方法来实现与我已经成功扩展的基础DataGridView相同的功能,但是没有运气让它起作用:

  • 扩展我的基类网格与DataGridView相同。这个 不会像重写MouseDown / MouseUp方法那样工作 自定义UserControl,而不是控件上的DataGridView - 所以 单击网格不会触发重写的方法。

  • 使用properties /重写方法更新基类网格。 这与上述问题相同; MouseDown / MouseUp是 覆盖UserControl的方法,因此单击上的DataGridView 控件没有击中被覆盖的方法。

我希望只添加属性并覆盖整个DataGridView类的方法,以便自定义UserControl上的DGV将与其他DataGridView控件一起获取功能。

帮助!

1 个答案:

答案 0 :(得分:2)

无论如何,您的用户控件似乎内部都有DataGridView

因此,不是绑定现有的MouseDown / MouseUp事件等(实际上是用户控件的事件,而不是网格),只需向用户控件添加新事件,然后让它们传递给网格视图。例如:

public event MouseEventHandler GridMouseDown 
{ 
  add { dataGrid.MouseDown += value; }
  remove { dataGrid.MouseDown -= value; }
}

修改

好的,既然你特别要求覆盖OnMouseDown方法,答案很简单:创建派生类型是唯一的方法。

你可以用一些非常脏的黑客来解决这个问题,但对于像这样微不足道的事情来说,这是一个坏主意。