【问题标题】:[VB.NET]Object reference not set to an instance of an object[VB.NET]对象引用未设置为对象的实例
【发布时间】:2013-08-16 17:43:06
【问题描述】:

我正在尝试将我的 datagridview 上选定行的列值添加到 Collection(但如果我使用 List 或 Array 执行此操作,我会遇到同样的错误)

代码:

Dim zdgv = MyDataGridView

    For a = 0 To zdgv.SelectedRows.Count - 1

        MsgBox(zdgv.Rows(zdgv.SelectedRows(a).Index).Cells(0).Value.ToString)
        Try
            MyCollection.Add(zdgv.Rows(zdgv.SelectedRows(a).Index).Cells(0).Value.ToString)
        Catch ex As Exception
            MsgBox(ex.Message)
            MsgBox(ex.InnerException)
        End Try

    Next

ex.Message = 对象引用未设置为对象的实例

ex.InnerException =

ex.InnerException.Message = 使程序崩溃,进入代码屏幕, 突出显示 MsgBox(ex.InnerException) 行,并给出错误:Object 引用未设置为对象的实例

附加信息: 在 zdgv 上使用 QuickWatch 可以为我提供所有信息。在它(zdgv)之后在行上使用它说:'Rows'未声明。由于其保护级别,它可能无法访问。

附:是的,我用谷歌搜索过,但没有一个类似的问题。是的,我在这里搜索过,但没有信息。我也尝试过 r/visualbasic - 没有... 我什至尝试用这个错误搜索与 c# 相关的东西 - 什么都没有。 :/

提前致谢。

EDIT1:我已经尝试在新项目中创建非数据绑定数据网格视图,并将其中的一个值添加到集合中 - 同样的错误。我想我应该去google一下“将对象的引用设置为对象的实例”。

EDIT2:这个失败 - 新手错误。

EDIT3:

上使用快速观看
zdgv.Rows(zdgv.SelectedRows(a).Index).Cells(0).Value.ToString 

它显示正确的值(正确的,没有抛出错误)=“1”。

【问题讨论】:

  • 您引用的对象或属性之一是null。你知道错误发生在哪一行吗?
  • @valverij 你知道错误发生在哪一行吗?可能是TryCatch之间的单行;-)
  • 什么是 MyCollection? - 你忘了在上面做一个新的吗?
  • 在代码顶部 - 就在 public class classname 下方和第一个子上方我有这个:Public eilutesnumeriukas As Collection

标签: vb.net datagridview


【解决方案1】:

这段代码对我来说就像一个魅力。

您是否忘记了 MyCollection 中的新内容?

Dim zdgv = MyDataGridView
Dim MyCollection As New Collection
For a = 0 To zdgv.SelectedRows.Count - 1

    MsgBox(zdgv.Rows(zdgv.SelectedRows(a).Index).Cells(0).Value.ToString)
    Try
        MyCollection.Add(zdgv.Rows(zdgv.SelectedRows(a).Index).Cells(0).Value.ToString)
    Catch ex As Exception
        MsgBox(ex.Message)
        If ex.InnerException IsNot Nothing Then
            MsgBox(ex.InnerException)
        End If
    End Try
Next

【讨论】:

  • 谢谢。有效。太感谢了。我的城市是立陶宛游客中最受欢迎的城市之一 - 它是 Telsiai。如果你来过这里——我请你喝啤酒。真的很喜欢。
  • @ZebriukasDryžiukas 我会记住的:)
  • 你只邀请马特吗?
  • 人人免费啤酒!我们知道俄罗斯人是优秀的黑客,我们也知道他们喜欢伏特加。所以我可以假设 Beer 可以提高编程技能,对吧?
【解决方案2】:

ex.InnerException 为 null,而您尝试访问的是 Message 属性。这是正常的行为。 你应该尝试类似

        Try
            MyCollection.Add(zdgv.Rows(zdgv.SelectedRows(a).Index).Cells(0).Value.ToString)
        Catch ex As Exception
            MsgBox(ex.Message)
            If ex.InnerException IsNot Nothing Then
                 MsgBox(ex.InnerException)
            End if
        End Try

仅当子方法在其下抛出异常时,InnerException 才不是 null。

【讨论】:

  • CSharp Basic .NET? :D null 在 VB.NET 中是 Nothing!=<>
  • 顺便说一句,也许我错了,但应该是If Not ex.InnerException Is Nothing Then...
  • 我正在使用它来尝试查找错误,但仍然感谢两者。目前试图用简单的datagridview在新项目上做到这一点。看看是否重复错误。
  • @ZebriukasDryžiukas 如果您最初的问题与 ex.InnerException 无关,请告诉 debug 并向我们提供有关破坏部分的更多信息
  • @MatíasFidemraizer If Not (...) Is NothingIf (...) IsNot NothingVB.Net 中完全一样
【解决方案3】:

在代码顶部 - 就在公共类类名下方和第一个子类上方 我有这个:Public XXXXX As Collection

您没有创建collection 的实例,然后尝试向其中添加一些项目。

应该是:

Public XXXXX As New Collection

或者您需要在其他地方创建一个新实例才能访问它

XXXXX = New Collection

【讨论】:

  • 是的@Matt 已经回答了 - 仍然感谢。附言我在这个线程中使用了 MyCollection 名称,以减少与未知单词的混淆。
【解决方案4】:

我找到的最佳解决方案 基本上,错误在于您的代码正在使用不存在的行。

您只需将 datagridview AllowUserToAddRows 属性设置为 false。然后你所有的正常循环都会正常工作。

Dim zdgv = DataGridView1
For Each row As DataGridViewRow In zdgv.Rows
    ListBox2.Items.Add(row.Cells(1).Value.ToString) 
Next

For i as integer = 0 to datagridView1.rows.count - 2
    'enter code here

Next

MK :)

【讨论】:

    猜你喜欢
    • 2013-01-14
    • 2011-09-22
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2013-12-30
    • 1970-01-01
    相关资源
    最近更新 更多