gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:25:11 24 4
gpt4 key购买 nike

简短版:

有没有一种方法可以在 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 - 所以单击网格不会触发覆盖的方法。

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

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

帮助!

最佳答案

看起来你的用户控件里面有一个DataGridView

因此,不要绑定(bind)现有的 MouseDown/MouseUp 事件等(实际上是用户控件的事件,而不是网格的事件),只需将新事件添加到您的用户控制,并让它们向下传递到 GridView 。例如:

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

编辑:

好的,既然您专门询问了有关重写 OnMouseDown 方法的问题,答案很简单:创建派生类型是唯一的方法。

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

关于c# - 是否可以在不进行子类化的情况下扩展 DataGridView 控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31876525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com