VB中的“ WithEvents变量”是什么意思?

时间:2018-09-05 19:55:13

标签: vb.net

我使用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

1 个答案:

答案 0 :(得分:2)

在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)将添加到您的项目中。

enter image description here enter image description here

如果只有代码,则可以尝试手动一个接一个地添加对象。假设我像这样复制您的代码(参见图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一词。它说Handles Button1.Click。这意味着您需要一个名为Button1的按钮,并且需要为其Click事件创建一个句柄。您需要将Button1的Click事件连接到您的代码。

enter image description here

返回设计师。将按钮和文本框(请参见红色框)从工具箱拖到窗体中。将它们放在您喜欢的任何地方。

enter image description here

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

enter image description here

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

从代码来看,这是一个计算器示例。有16个名为Button1,Button2,Button3,...的按钮,直到Button16。还有一个名为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. 严格启用选项。阅读here了解更多信息。
  2. 将按钮的名称更改为更有意义的名称。示例:将Button1更改为ButtonNumber1,将Button11更改为ButtonDot,将Button12更改为ButtonAdd,将Button16更改为ButtonEqual。对16个按钮执行此操作。
  3. 将firstNumber,secondNumber和answerNumber类型更改为双精度。 Val()函数返回double值,因此与将double值转换为single值(double的范围大于single的范围)相比,更改变量类型更为安全。
  4. 为数字0-9和点的按钮使用单个事件处理程序。我设置这些按钮的text属性来保存数字和点。该代码将读取按钮的text属性,并将其附加到文本框的text属性。
  5. 对数学运算(+-* /)使用单个事件处理程序。数字4的技巧相同。我将按钮的text属性设置为保留数学运算符。
  6. 将answerNumber分配回文本框时,请使用ToString()方法。由于选项字符串为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

表单:

enter image description here