arrays - 如何在 VB.net 中的子例程之外声明一系列对象
问题描述
我写了一个代码来演示这个问题:
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
doSomething()
End Sub
Dim controlArr() As Object = {NumericUpDown1, NumericUpDown2, NumericUpDown3, NumericUpDown4, CheckBox1, CheckBox2, CheckBox3, CheckBox4}
Private Sub doSomething()
Dim testStr As String = ""
For Each control In controlArr
Select Case control.GetType
Case GetType(NumericUpDown)
control.value = 1
Case GetType(CheckBox)
control.checked = True
End Select
Next
End Sub
End Class
当我运行代码时,我收到空引用异常“对象引用未设置为对象的实例”,当我controlArr
在子例程中声明数组时,错误消失DoSomething
。无论如何,我宁愿在外面声明它,因为我在许多功能中使用它。我想更好地理解它,所以如果您向我提供一个我可以阅读的主题,我将非常感激。非常感谢您的帮助。
解决方案
问题是声明是在构造函数之前处理的。这意味着这一行:
Dim controlArr() As Object = {NumericUpDown1, NumericUpDown2, NumericUpDown3, NumericUpDown4, CheckBox1, CheckBox2, CheckBox3, CheckBox4}
在创建窗体上所有控件并将它们分配给这些字段的代码之前执行。因此,所有字段都Nothing
在执行代码时,因此您的数组包含大量内容。创建对象来初始化这样的字段没有问题,并且该代码确实成功地创建了一个数组。只是您隐式将该数组的每个元素设置为,Nothing
以便您稍后使用。
如果要引用任何控件,则必须等到创建表单控件之后。InitializeComponent
这意味着,最早,在构造函数中调用之后。更一般地说,您应该在Load
事件处理程序中执行此操作,例如
Dim controlArr As Object()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Form1.Load
controlArr = {NumericUpDown1, NumericUpDown2, NumericUpDown3, NumericUpDown4, CheckBox1, CheckBox2, CheckBox3, CheckBox4}
End Sub
推荐阅读
- django - ESP8266 与本地托管服务器的连接
- c# - 有没有办法阻止 Windows 缓存网络文件?
- swift - Swift REPL 中的变量声明必须有初始值
- java - 在 Java 中声明引用变量和初始化它有什么区别?
- google-sheets - 部分重复的条件格式
- javascript - 如何缩小二维码扫描仪的尺寸,定制二维码扫描仪
- rss - W3C RSS 验证器:无效的 URL
- marketo - 如何通过 URL 在 Marketo 中找到登录页面文件?
- c# - c#中的通用类型返回和参数顺序
- php - (1/1) Swift_TransportException 用于在 laravel 中重置密码