首页 > 解决方案 > VB中的“WithEvents变量”是什么意思?

问题描述

我使用 Visual Studio 使用语言:VB 在运行我的代码的情况下我想出了这个错误

  • (8:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (9:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (9:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (11:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (12:0) 'TextBox1' 未声明。由于其保护级别,它可能无法访问。
  • (12:0) 'TextBox1' 未声明。由于其保护级别,它可能无法访问。
  • (14:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (15:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (15:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (17:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (18:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (18:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (20:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (21:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (21:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (23:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (24:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (24:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (26:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (27:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (27:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (29:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (30:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (30:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (32:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (33:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (33:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (35:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (36:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (36:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (38:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (39:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (39:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (41:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (42:0) 未声明“Val”。由于其保护级别,它可能无法访问。
  • (42:0) 'TextBox1' 未声明。由于其保护级别,它可能无法访问。
  • (43:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (46:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (47:0) 未声明“Val”。由于其保护级别,它可能无法访问。
  • (47:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (48:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (51:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (52:0) 未声明“Val”。由于其保护级别,它可能无法访问。
  • (52:0) 'TextBox1' 未声明。由于其保护级别,它可能无法访问。
  • (53:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (56:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (57:0) 未声明“Val”。由于其保护级别,它可能无法访问。
  • (57:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (58:​​0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。
  • (61:0) Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • (62:0) 未声明“Val”。由于其保护级别,它可能无法访问。-(62:0) 'TextBox1' 未声明。由于其保护级别,它可能无法访问。
  • (75:0) 未声明“TextBox1”。由于其保护级别,它可能无法访问。

我试图运行这段代码:

Public Class Form1

    Dim firstNumber As Single
    Dim secondNumber As Single
    Dim answerNumber As Single
    Dim arithmeticprocess As String

    Private Sub button1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        TextBox1.Text = TextBox1.Text & 1
    End Sub
    Private Sub button2_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        TextBox1.Text = TextBox1.Text & 2
    End Sub
    Private Sub button3_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        TextBox1.Text = TextBox1.Text & 3
    End Sub
    Private Sub button4_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        TextBox1.Text = TextBox1.Text & 4
    End Sub
    Private Sub button5_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        TextBox1.Text = TextBox1.Text & 5
    End Sub
    Private Sub button6_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
        TextBox1.Text = TextBox1.Text & 6
    End Sub
    Private Sub button7_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
        TextBox1.Text = TextBox1.Text & 7
    End Sub
    Private Sub button8_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
        TextBox1.Text = TextBox1.Text & 8
    End Sub
    Private Sub button9_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
        TextBox1.Text = TextBox1.Text & 9
    End Sub
    Private Sub button10_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
        TextBox1.Text = TextBox1.Text & 0
    End Sub
    Private Sub button11_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click
        TextBox1.Text = TextBox1.Text & " . "
    End Sub
    Private Sub button12_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click
        firstNumber = Val(TextBox1.Text)
        TextBox1.Text = "0"
        arithmeticprocess = "+"
    End Sub
    Private Sub button13_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button13.Click
        firstNumber = Val(TextBox1.Text)
        TextBox1.Text = "0"
        arithmeticprocess = "-"
    End Sub
    Private Sub button14_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button14.Click
        firstNumber = Val(TextBox1.Text)
        TextBox1.Text = "0"
        arithmeticprocess = "*"
    End Sub
    Private Sub button15_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button15.Click
        firstNumber = Val(TextBox1.Text)
        TextBox1.Text = "0"
        arithmeticprocess = "/"
    End Sub
    Private Sub button16_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button16.Click
        secondNumber = Val(TextBox1.Text)
        If arithmeticprocess = "+" Then
            answerNumber = firstNumber + secondNumber
        End If
        If arithmeticprocess = "-" Then
            answerNumber = firstNumber + secondNumber
        End If
        If arithmeticprocess = "*" Then
            answerNumber = firstNumber + secondNumber
        End If
        If arithmeticprocess = "/" Then
            answerNumber = firstNumber + secondNumber
        End If
        TextBox1.Text = answerNumber
    End Sub
End Class

标签: vb.net

解决方案


在 Visual Basic WinForm 中,Form 对象至少有 2 个文件(有时是 3 个文件)。假设 Form 是 Form1,它有 Form1.vb 和 Form1.Designer.vb。Form1.vb 是您放置代码的地方。Form1.Designer.vb 是 Visual Studio(或其他 IDE)将生成的对象代码放入表单(按钮、文本框、组合框、网格等)的位置。每个对象/变量必须在 Form1.vb(由您编写)或 Form1.Designer.vb(由 IDE 生成)中声明。不要在 SomeFormName.Designer.vb 中编写任何代码,因为您不应该在其中编写任何代码,是 IDE 在其中编写。

如果您有完整的表单文件,只需从 Visual Studio 添加即可。右键单击您的项目,然后单击Add,然后单击Existing Item(见图 1)。选择表格名称(见图2),例如。Form2.vb 和表单(包括 Designer.vb)将被添加到您的项目中。

在此处输入图像描述 在此处输入图像描述

如果您只有代码,您可以尝试手动添加对象。假设我像这样复制您的代码(见图 3)。它显示 3 个错误,因为 IDE 找不到名为 TextBox1 和 Button1 的对象(请参见红框中的红线)。在绿色框中有一个按钮可以显示项目中的所有文件。默认情况下,Form1.Designer.vb 文件是隐藏的。一旦你点击它,Form1.Designer.vb 是可见的(见蓝色框)。

有 3 条错误消息(2 种,其中一种与前一种重复):

  • Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量。
  • 'TextBox1' 未声明。由于其保护级别,它可能无法访问。
  • 'TextBox1' 未声明。由于其保护级别,它可能无法访问。

'TextBox1' is not declared很清楚。您需要一个名为 TextBox1 的文本框。在Handles clause requires a WithEvents variable defined in the containing type or one of its base types.错误中,请参见句柄一词附近的代码。它说Handles Button1.Click。这意味着您需要一个名为 Button1 的按钮,并且您需要为其 Click 事件创建一个句柄。您需要将 Button1 的 Click 事件连接到您的代码。

在此处输入图像描述

回到设计师那里。将按钮和文本框(见红色框)从工具箱拖到表单中。把它们放在你喜欢的任何地方。

在此处输入图像描述

单击表单中的按钮,可以看到属性窗口(见红色框)。确保按钮的名称为 Button1(如代码中所示)。如果不同,请在属性窗口中进行更改。对文本框执行相同的操作。确保文本框的名称是 TextBox1。

在此处输入图像描述

现在红线消失了,您可以编译和运行代码。尝试运行代码并单击按钮。它将1在文本框中添加一个字符。当遇到错误时,您可以尝试添加其他行并添加更多对象。此方法不保证代码将正常运行,因为当您添加对象时,该对象具有默认属性。原始代码可能会对对象的属性进行一些更改。

从代码来看,这是一个计算器示例。有 16 个按钮,分别命名为 Button1、Button2、Button3、...,直到 Button 16。还有一个名为 Textbox1 的文本框。您可以更改 Button 的 text 属性,使其显示正确的文本。Button1 到 Button9 是 1 到 9,Button10 是 0,Button11 是 .,Button12 到 Button15 是 +-*/ 符号,Button16 是 = 符号。

小错误

按下等号按钮时有一个小的计算错误。无论算术过程值(符号)如何,原始代码始终添加 firstNumber 和 secondNumber。它应该是这样的:

Private Sub button16_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button16.Click
    secondNumber = Val(TextBox1.Text)
    If arithmeticprocess = "+" Then
        answerNumber = firstNumber + secondNumber
    End If
    If arithmeticprocess = "-" Then
        answerNumber = firstNumber - secondNumber
    End If
    If arithmeticprocess = "*" Then
        answerNumber = firstNumber * secondNumber
    End If
    If arithmeticprocess = "/" Then
        answerNumber = firstNumber / secondNumber
    End If
    TextBox1.Text = answerNumber
End Sub

改进

由于我注意到代码中有很多冗余,我试图简化它。这是我更改的内容:

  1. 添加 Option Strict On。阅读此处了解更多信息。
  2. 将按钮的名称更改为更有意义的名称。示例:Button1 更改为 ButtonNumber1,Button11 更改为 ButtonDot,Button12 更改为 ButtonAdd,Button16 更改为 ButtonEqual。对 16 个按钮执行此操作。
  3. 将 firstNumber、secondNumber 和 answerNumber 类型更改为 double。Val() 函数返回一个 double,因此更改变量类型比将 double 的值转换为 single 更安全(double 的范围比 single 更大)。
  4. 对编号为 0-9 和点的按钮使用单个事件处理程序。我将这些按钮的文本属性设置为保存数字和点。代码将读取按钮的 text 属性并将其附加到文本框的 text 属性中。
  5. 对数学运算使用单个事件处理程序 (+-*/)。数字 4 中的相同技巧。我将按钮的文本属性设置为保存数学运算符号。
  6. 将 answerNumber 分配回文本框时使用 ToString() 方法。由于 Option String On 是必需的。

编码:

Option Strict On

Public Class Form1

    Dim firstNumber As Double, secondNumber As Double, answerNumber As Double
    Dim arithmeticProcess As String

    Private Sub ButtonNumber_Click(sender As Object, e As EventArgs) Handles ButtonNumber1.Click,
        ButtonNumber2.Click, ButtonNumber3.Click, ButtonNumber4.Click, ButtonNumber5.Click,
        ButtonNumber6.Click, ButtonNumber7.Click, ButtonNumber8.Click, ButtonNumber9.Click,
        ButtonNumber0.Click, ButtonDot.Click

        Dim buttonSender = CType(sender, Button)
        TextBoxResult.Text += buttonSender.Text

    End Sub

    Private Sub ButtonOperation_Click(sender As Object, e As EventArgs) Handles ButtonAdd.Click,
            ButtonSubtract.Click, ButtonMultiply.Click, ButtonDivide.Click

        firstNumber = Val(TextBoxResult.Text)
        TextBoxResult.Text = "0"
        Dim buttonSender = CType(sender, Button)
        arithmeticProcess = buttonSender.Text

    End Sub

    Private Sub ButtonEqual_Click(sender As Object, e As EventArgs) Handles ButtonEqual.Click

        secondNumber = Val(TextBoxResult.Text)
        Select Case arithmeticProcess
            Case "+"
                answerNumber = firstNumber + secondNumber
            Case "-"
                answerNumber = firstNumber - secondNumber
            Case "*"
                answerNumber = firstNumber * secondNumber
            Case "/"
                answerNumber = firstNumber / secondNumber
        End Select
        TextBoxResult.Text = answerNumber.ToString()

    End Sub

End Class

表格:

在此处输入图像描述


推荐阅读