[VB.NET]对象引用未将对象实例化

4

我正在尝试将我的 datagridview 中选择行的列值添加到集合中(但如果我使用列表或数组也会遇到相同的错误)。

代码:

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)行,并给出错误:对象引用未设置为对象的实例

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

P.S.是的,我已经谷歌过了,但没有一个类似的问题。是的,我在这里搜索,但没有信息。我也尝试了r/visualbasic - 什么都没有......

提前致谢。

编辑1:我尝试在新项目中制作非数据绑定datagridview,并将其中一个值添加到集合中 - 出现相同的错误。我想我应该去谷歌关于"将对象的引用设置为对象的实例"的内容。

编辑2:这个失败了 - 新手错误。

编辑3:在快速监视中使用

zdgv.Rows(zdgv.SelectedRows(a).Index).Cells(0).Value.ToString 

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

1
你正在引用其中一个对象或属性为 null。你知道错误发生在哪一行吗? - valverij
1
@valverij 你知道错误出现在哪一行吗? 可能是 TryCatch 之间的单独一行;-) - Chris
1
什么是MyCollection?- 你忘记对它进行New操作了吗? - Matt B-L
在代码顶部 - 在 public class classname 下面,第一个子程序之前,我有这个:Public eilutesnumeriukas As Collection - Zebriukas Dryžiukas
4个回答

3
这段代码在我的端上完美运行。
你是否忘记在 MyCollection 上使用 New 关键字?
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

2
谢谢。它起作用了。非常感谢你。我的城市是立陶宛最受游客欢迎的城市之一 - 特尔西艾。如果你来这里 - 我请你喝啤酒。说真的。 - Zebriukas Dryžiukas
1
@ZebriukasDryžiukas 我会记住的 :) - Matt B-L
1
你只邀请了Matt吗? - logixologist
1
每个人都可以免费喝啤酒!正如我们所知,俄罗斯人是卓越的黑客,我们也知道他们热爱伏特加。因此,我可以假设啤酒可以提高编程技能,对吧? - Zebriukas Dryžiukas

1

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。


2
CSharp Basic .NET?:D VB.NET 中的 nullNothing,而 != 则是 <> - Matías Fidemraizer
1
顺便说一句,也许我错了,但应该是 If Not ex.InnerException Is Nothing Then... - Matías Fidemraizer
我曾试图使用它来查找错误,但仍然感谢你们两个。目前正在尝试在新项目中使用简单的DataGridView来完成此操作。看看是否会重复出现错误。 - Zebriukas Dryžiukas
1
@ZebriukasDryžiukas 如果您的初始问题不是关于ex.InnerException,请告诉我们进行调试并提供有关中断部分的更多信息。 - Matt B-L
1
@MatíasFidemraizer 在 VB.Net 中,If Not (...) Is NothingIf (...) IsNot Nothing 是完全相同的。 - Chris
@Matt - 我只想将 datagridview 中单元格的值插入到集合中。使用我在帖子中展示的代码会导致“对象引用未设置为对象实例”的错误。我使用了 Try Catch 只是为了更容易地进行调试。 - Zebriukas Dryžiukas

1
在代码的顶部 - 就在公共类类名下面和第一个子程序上面,我有这个:Public XXXXX As Collection
您不需要创建collection的实例,然后尝试向其中添加一些项目。
应该是:
Public XXXXX As New Collection
或者您需要在其他地方创建一个新实例,然后再访问它
XXXXX = New Collection

是的,@Matt已经回答了这个问题 - 还是谢谢。附言:我在这个帖子中使用MyCollection名称,以避免出现未知单词的混淆。 - Zebriukas Dryžiukas

0

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

您只需要将 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 :)


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