vb.net - 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
解决方案
在 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
改进
由于我注意到代码中有很多冗余,我试图简化它。这是我更改的内容:
- 添加 Option Strict On。阅读此处了解更多信息。
- 将按钮的名称更改为更有意义的名称。示例:Button1 更改为 ButtonNumber1,Button11 更改为 ButtonDot,Button12 更改为 ButtonAdd,Button16 更改为 ButtonEqual。对 16 个按钮执行此操作。
- 将 firstNumber、secondNumber 和 answerNumber 类型更改为 double。Val() 函数返回一个 double,因此更改变量类型比将 double 的值转换为 single 更安全(double 的范围比 single 更大)。
- 对编号为 0-9 和点的按钮使用单个事件处理程序。我将这些按钮的文本属性设置为保存数字和点。代码将读取按钮的 text 属性并将其附加到文本框的 text 属性中。
- 对数学运算使用单个事件处理程序 (+-*/)。数字 4 中的相同技巧。我将按钮的文本属性设置为保存数学运算符号。
- 将 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
表格:
推荐阅读
- r - data.table - 使用返回矩阵的自定义函数分组
- asp.net - 即使我没有包含外键的一些数据也会自动加载
- android - 如何使应用程序示例 linux 编写命令
- redirect - 如何在我的服务器上阻止网址或重定向它?
- google-maps - 有没有办法隐藏街道名称(google_maps_flutter)?
- javascript - indexOf 不适用于我在 JavaScript 中的列表
- html - 如何在不模糊禁用项目的情况下制作带有禁用选项的 Select 元素(HTML 电子邮件)
- swift - 不同 IBActions 中未解析的标识符(变量)
- android-studio-3.1 - 如何修复“找不到任何与 com.android.support:appcompat-v7:29.+ 匹配的版本
- javascript - EJS 中未定义的变量