简短版本:
有没有一种方法可以添加属性并覆盖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控件一起获取功能。
帮助!
答案 0 :(得分:2)
无论如何,您的用户控件似乎内部都有DataGridView
。
因此,不是绑定现有的MouseDown
/ MouseUp
事件等(实际上是用户控件的事件,而不是网格),只需向用户控件添加新事件,然后让它们传递给网格视图。例如:
public event MouseEventHandler GridMouseDown
{
add { dataGrid.MouseDown += value; }
remove { dataGrid.MouseDown -= value; }
}
修改强>
好的,既然你特别要求覆盖OnMouseDown
方法,答案很简单:创建派生类型是唯一的方法。
你可以用一些非常脏的黑客来解决这个问题,但对于像这样微不足道的事情来说,这是一个坏主意。