【问题标题】:Object reference not set to an instance of an object [VB.NET]对象引用未设置为对象的实例 [VB.NET]
【发布时间】:2013-01-14 05:10:54
【问题描述】:
 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

bc.Enabled = b 处出现高亮错误 (对象引用未设置为对象的实例。)

但是当我使用checkbox1.enabled = b 而不是c.enabled = b 工作正常。

所以我认为b 的错误不是吗?

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

【问题讨论】:

  • 我猜这会在 i = 0 时倒下?你的表格上是否有 CheckBox0 - 我再次猜测没有。看看这行
    Dim c As CheckBox = CType(Me.Controls("CheckBox" & i.ToString), CheckBox) ... c 可能是 Nothing
  • 刚刚尝试为您调试它,但它在 Dim c as Checkbox 行对我来说失败了...您也可以发布您的 Web 表单的 asp 代码吗?
  • 没有 checkbox0 但我尝试使用 [for loop] 1 To 2 & 相同的结果
  • @markp3rry 这是整个代码
  • 我的意思是来自您网页的代码 - 具有您的控件的 html 标记。

标签: vb.net ctype


【解决方案1】:

两个可能的原因。您的 for 循环创建此控件名称:

  1. “复选框0”
  2. “复选框1”
  3. “复选框2”

也许你想要 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:我已经在我的代码 sn-p 中注释了它,ControlCollection.Find 返回一个控件数组。当没有找到以给定名称作为键的控件时,它是空的 (Length=0)。因为我假设只有一个具有该名称的复选框,所以我刚刚采用了第一个。 ctrl(0) 给了我控制数组中的第一个控件,因为数组在 .NET 中为零。
【解决方案2】:

试试这个:

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

【讨论】:

  • ops,它起作用的原因是复选框在组框中谢谢你! ^
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 2013-12-30
  • 1970-01-01
相关资源
最近更新 更多