对象引用没有设置为对象的实例 [VB.NET]

4
 Public Class Form1
    Private Function AllEnabled(ByVal b As Boolean) As Boolean
        For i As Integer = 0 To 2
            Dim c As CheckBox = CType(Me.Controls("CheckBox" & i.ToString), CheckBox)
            c.Enabled = b
        Next
    End Function

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Call AllEnabled(False)
     End Sub
    End Class

c.Enabled = b处高亮显示出现错误(Object reference not set to an instance of an object.)

但是当我使用checkbox1.enabled = b代替c.enabled = b时,运行正常。

所以我认为问题不在于b,对吗?

& 我该如何解决这个问题?


我猜当 i = 0 时会出问题?你的表单上有 CheckBox0 - 我猜没有。看一下这行代码 <br> Dim c As CheckBox = CType(Me.Controls("CheckBox" & i.ToString), CheckBox) ... 可能 c 是空值。 - CHill60
我刚试着为你调试了一下,但在 Dim c as Checkbox 这行出错了... 你能把你的 ASP 网页表单代码也发一下吗? - markp3rry
没有复选框0,但我尝试使用[for循环]1到2,结果相同。 - Zaid
我指的是您网页上的代码 - 包含控件的HTML标记。 - markp3rry
没有网页,这是一个简单的Visual Basic应用程序。 - Zaid
显示剩余3条评论
2个回答

2

试试这个:

For Each ctl In Me.Controls
  If TypeOf ctl Is CheckBox Then
   ctl.Enabled = b
  End If
Next

操作,它可以工作的原因是复选框在组框中。谢谢!^ - Zaid

1
有两个可能的原因。你的for循环创建了这些控件名:
  1. "CheckBox0"
  2. "CheckBox1"
  3. "CheckBox2"
也许你想要1-3或者0-1。
也许你想要递归查找你的复选框,那么你可以使用Find
For i As Integer = 0 To 2
    Dim ctrl = Me.Controls.Find("CheckBox" & i.ToString, True)
    If ctrl.Length <> 0 Then
        ctrl(0).Enabled = b 'Find returns an aray' 
    End If
Next

注:2013年我不再使用这种VB6风格了:

Call AllEnabled(False)

但只是
AllEnabled(False)

可以了!谢谢你。但是,你能解释一下 ctrl(0) 是什么意思吗?为什么要用零? - Zaid
@Zaid: 我在代码片段中加了注释,ControlCollection.Find 会返回一个控件数组。如果没有找到给定名称的控件,则为空(Length=0)。由于我假设只有一个名为该名称的复选框,因此我只取了第一个。 ctrl(0) 给我控件数组中的第一个控件,因为 .NET 中的数组是从零开始的。 - Tim Schmelter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接