0

(新手 VB.NET 问题)

winforms这是我不完全理解的简单背后的特定代码:

Private Sub okButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles okButton.Click
    'do something
End Sub

Private Sub MainForm_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Enter
    okButton_Click(Me, e) '<=== argumanets must be wrong 
End Sub

我想要实现的目标:如果用户Enter在他们有winforms活动时点击,那么我希望触发的Click事件处理程序okButton

显然,从上面我对我需要提供给被event调用者的论点的理解okButton_Click是缺乏的;什么是正确的论点,为什么?

4

2 回答 2

4

我想你可能会使用AcceptButton表单的属性。只需将其设置为所需的按钮,它就可以解决问题。请注意,还有一个CancelButton属性。

回答您的事件问题:sender参数标记事件的发送者。大多数情况下,这是Me类的实例。在我看来,Me似乎是绝对正确的。e参数包含EventArgs特定事件的。如果您没有在函数体中使用此参数,则此变量的内容无关紧要。您可以使用Nothing或只是路由EventArgs(这就是您所做的)。

参考您的评论: EventArgs是特定于事件的数据的基类。例如,如果您要订阅鼠标事件,e则将是MouseEventArgs. 该类MouseEventArg为您提供已按下的鼠标按钮以及触发事件时指针的坐标。

在您的情况下,事件仅具有EventArgs仅提供有关事件的基本信息。似乎没有关于它的特殊信息。

注意:如果您想将多个事件组合到一个回调中,您可以使用e类型EventArgs,因为每个事件都e应该继承自EventArgsMicrosoft 指南。因此,您可以将 Button-Click 与 Mouse-Move 组合成一个回调,因为委托的签名匹配。

比仅仅传递给目标 Sub 更好的方法Nothing是将两个回调合并为一个。您可以在 VB.NET 中使用多个Handles这样的方法来执行此操作:

Private Sub SomeSub(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles okButton.Click, MyBase.Enter
    'this is getting called on a okButton.Click and MyBase.Enter
End Sub

(向右滚动查看手柄)

请注意,您不需要调用第一个 Sub 的第二个 Sub。一切都在一个潜艇中。

于 2012-10-25T09:20:35.067 回答
1

试试这个:

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, keyData As System.Windows.Forms.Keys) As Boolean
    If (keyData And Keys.KeyCode) = Keys.Enter Then
        okButton.PerformClick()
        Return True
    End If
    Return MyBase.ProcessCmdKey(msg, keyData)
End Function

如果要将回车键与其他控件一起使用,则可能需要在检查中排除某些控件,即:

If (keyData And Keys.KeyCode) = Keys.Enter AndAlso Not Textbox1.Focused Then
于 2012-10-25T07:43:41.623 回答