现有处理程序是 "not found"

Existing handler is "not found"

我创建了一个自定义控件,继承自 DateTimePicker 以处理 "continuous typing"。

Public Class TimePicker
    Inherits System.Windows.Forms.DateTimePicker

    Private keyPressed As Boolean = False
    Private switchPart As Boolean = True

    Public Sub New()
        MyBase.New()
    End Sub

    Private Shadows Sub KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        switchPart = True
        If e.KeyCode >= Keys.NumPad0 AndAlso e.KeyCode <= Keys.NumPad9 Then keyPressed = True
        If e.KeyCode = Keys.Left OrElse e.KeyCode = Keys.Right Then switchPart = False
    End Sub

    Public Shadows Sub ValueChanged(sender As Object, e As System.EventArgs) Handles MyBase.ValueChanged
        ' Setup variable to store last value chosen between changes
        Static lastValue As Date = Date.FromOADate(0)
        If (Value.Hour <> lastValue.Hour OrElse Value.Minute <> lastValue.Minute) AndAlso keyPressed AndAlso switchPart Then
            SendKeys.Send("{RIGHT}")
            keyPressed = False
        End If
        lastValue = Value
    End Sub

End Class

多年来我一直很开心。 但是最近,它开始拒绝编译使用以下代码的表单:

Private Sub dtpStartingTime_ValueChanged(sender As Object, e As EventArgs) Handles dtpStartingTime.ValueChanged
    dtpEndingTime.Value = New DateTime(Math.Max(dtpStartingTime.Value.Ticks, dtpEndingTime.Value.Ticks))
End Sub

Handles 部分的 ValueChanged 有红色下划线,消息是

找不到错误 BC30590 事件 'ValueChanged'。

但是如果我在带下划线的事件上单击 F12,它会将我带到自定义控件中定义的函数。所以肯定是找到了。

这是怎么回事?我已经清理了 10 次溶液,确保删除了 bin 文件夹。它不再起作用了。

有人可以帮我吗?

谢谢。

P.S.: 我用的是VS2019

你认为这意味着什么:

Public Shadows Sub ValueChanged

您是专门告诉您的 class 隐藏数据库 class 中同名的成员。用方法隐藏事件是很糟糕的。

这不是您改变事件行为的方式。在编写良好的代码中,每个事件都有一个专门用于引发该事件的相应方法。如需更多信息,read here。您应该像这样覆盖适当的方法:

Public Class TimePicker
    Inherits DateTimePicker

    '...

    Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
        'Code here is executed before any event handlers.

        MyBase.OnKeyDown(e)

        'Code here is executed after any event handlers.
    End Sub

    Protected Overrides Sub OnValueChanged(e As EventArgs)
        'Code here is executed before any event handlers.

        MyBase.OnValueChanged(e)

        'Code here is executed after any event handlers.
    End Sub

End Class