0

我需要对 DataGridView 进行子类化,以获得解决方案中所有 DataGridView 所需的某些功能。

为此,我制作了这些示例代码:

Imports System.ComponentModel

Public Class xDataGridView
Inherits DataGridView

Protected Overrides Sub onKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
    If e.Control Then
        If e.KeyCode = Keys.Up Or e.KeyCode = Keys.Down Then
            e.Handled = True
        End If
    End If
End Sub

Protected Overrides Sub onMouseDown(ByVal e As MouseEventArgs)
' part of code for drag/drop
    fromindex = Me.HitTest(e.X, e.Y).RowIndex
    If fromindex > -1 Then
        Dim dragSize As Size = SystemInformation.DragSize
        dragrect = New Rectangle(New Point(CInt(e.X - (dragSize.Width / 2)), CInt(e.Y - (dragSize.Height / 2))), dragSize)
    Else
        dragrect = Rectangle.Empty
    End If
End Sub

使用 onKeyDown 我终止了 Ctrl+Up 到 GO HOME 和 Ctrl+Down 到 GO END 的内置功能。使用 onMouseDown 我为拖放执行通用代码。

所有这些实际上都可以正常工作,除了我在包含此类的主程序上的事件 _KeyDown 和 _MouseDown 永远不会被触发!如果我从类中删除这些代码,则主程序中的事件将按预期触发。

1)我做错了什么以及如何让主程序中的_KeyDown和_MouseDown在课堂上被解雇。

2)如何摆脱DataGridView的内置功能Ctrl+Click?

4

1 回答 1

4

每当您覆盖事件的 OnXxx 方法时,一个硬性要求是调用基类方法。不这样做会导致各种事故(DGV 已经覆盖了许多这些方法),它最终会阻止相应的事件被触发。所以修复第一个:

Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
    If e.Control Then
        If e.KeyCode = Keys.Up Or e.KeyCode = Keys.Down Then
            e.Handled = True
            Return               '' added
        End If
    End If
    MyBase.OnKeyDown(e)          '' added
End Sub

请注意 IntelliSense 如何帮助您陷入成功的陷阱,它会自动生成 MyBase 调用。

于 2013-08-17T22:31:52.960 回答