【问题标题】:What are the event arguments "sender" and "e"什么是事件参数“sender”和“e”
【发布时间】:2017-03-21 22:48:54
【问题描述】:

我很难理解这些论点。
它们是自动生成的,我不需要考虑太多,但是如果我想从表单的其他部分调用这些事件之一,那么我需要为这些参数提供值 - 这并不容易,因为我仍然不确定他们的意思。

这是我想Call的活动:

Private Sub stringButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles stringButton.Click
    Dim outString As String
    Select Case stringTextBox.Text
        Case ""
            outString = "You entered an empty string"
        Case "10"
            outString = "10"
        Case Else
            outString = "Your string is not covered by the cases"
    End Select
    strResultTextBox.Text = outString
End Sub

调用方法如下:

Private Sub stringTextBox_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles stringTextBox.KeyDown
    If e.KeyCode = Keys.Enter Then
        Call stringButton_Click(Me, Me) '<<(Me,Me) is my incorrect attempt
    End If
End Sub

我应该使用哪些参数以及为什么?

【问题讨论】:

标签: vb.net


【解决方案1】:

不要从代码的其他部分调用事件处理程序!这是非常草率的编码。使用您需要的参数创建一个单独的方法来满足您的需要,并从事件处理程序和表单的任何其他部分调用它,例如

Private Function String GetResponseMessage(ByVal input as String)
    Select Case input
        Case ""
            Return "You entered an empty string"
        Case "10"
            Return "10"
        Case Else
            Return "Your string is not covered by the cases"
    End Select
End Function

Private Sub stringButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles stringButton.Click
    Dim outString As String=GetResponseMessage(stringTextBox.Text)
    strResultTextBox.Text = outString
End Sub

sendere 参数是事件处理程序的标准签名。 Sender 是引发事件的对象,e 包含事件的数据。 .NET 中的所有事件都包含此类参数。

EventArgs 是所有事件参数的基类,对事件没有多说。一些事件使用派生类来提供更多数据,例如。 KeyPress 事件使用 KeyEventArgs 类,该类在其 KeyChar 属性中包含实际按下的键。

这是基本的 .NET 编程内容,您应该花一些时间了解 .NET 事件和 Windows 窗体,而不是相信自动生成的代码

【讨论】:

  • 谢谢 - 感觉可能需要单独的私有方法。将来可能仍然会出现需要从代码中的其他位置调用事件处理程序的情况,或者是否可以 100% 避免?
  • ...在接下来的几年里,我正在学习VB.NET 以获得本科资格,因此这个问题(以及很多未来的问题)。感谢您的帮助。
【解决方案2】:

Sender 用于指定哪个对象产生了事件,e 是事件数据本身。 例如,通常当您单击表单中的按钮时,“发送者”将是按钮,而 e 将是鼠标事件。

在你的情况下,你可以简单地改变

Call stringButton_Click(Me, Me)

Call stringButton_Click(Nothing, EventArgs.Empty)

【讨论】:

    【解决方案3】:

    您可以通过创建一个新方法来做到这一点。不要调用事件处理程序。

    Public sub abcd()
    Dim outString As String
    Select Case stringTextBox.Text
        Case ""
            outString = "You entered an empty string"
        Case "10"
            outString = "10"
        Case Else
            outString = "Your string is not covered by the cases"
    End Select
    strResultTextBox.Text = outString
    end sub
    

    从你想要的地方调用这个方法

    Private Sub stringButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles stringButton.Click
    abcd()
    End Sub
    

    从这里

    Private Sub stringTextBox_KeyDown(ByVal sender As System.Object, ByVal e As 
     System.Windows.Forms.KeyEventArgs) Handles stringTextBox.KeyDown
    If e.KeyCode = Keys.Enter Then
        abcd()
    End If
    End Sub
    

    【讨论】:

      【解决方案4】:

      如上所述,最好将您的代码移动到一个单独的函数中,但这里有一个解决方法: call stringButton_Click(Nothing,Nothing)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        • 2010-11-21
        相关资源
        最近更新 更多