读书人

哪位给解释一下这段代码,该如何解决

发布时间: 2012-01-07 21:41:55 作者: rapoo

哪位给解释一下这段代码
Public Class Form1

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
For i As Int32 = 0 To 4
If objStru(i).parentid = 0 Then ' 加入根节点
TreeView1.Nodes.Add(CStr(objStru(i).id), CStr(objstru(i).name))
Else ' 加入子节点
TreeView1.Nodes(CStr(objStru(i).parentid)).Nodes.Add(CStr(objStru(i).id), CStr(objstru(i).name))
End If
Next
End Sub

End Class


加入子节点部分先通过objStru(i).parentid找出正确的父节点(通过节点的Key来找出,为了区别类型为Int32的Index,必须保证Key是String,所以用Cstr函数强制转换),再加入子节点。


这段代码是magicbacon 大哥的一段无限级treeview绑定数据库的代码。俺的数据裤结构是ID PRAENTID NAME
为啥子俺每次加载的时候老出现“未将对象引用设置到对象的实例”的错误呢?就是
红色那句(添加子节点的)老出错!俺检查了数据裤没错阿,PRAENTID除了0就是对应的ID值了,是不是
TreeView1.Nodes(CStr(objStru(i).parentid)).Nodes.Add(CStr(objStru(i).id), CStr(objstru(i).name)) 的(CStr(objStru(i).parentid))这里出错了?麻烦各位老大给解决一下。谢谢!!!


[解决办法]
没看出来哪里是实现"无限级"的
[解决办法]
objStru(i).parentid 不为 0的节点的父结点都肯定在树上了?
[解决办法]
如果子节点在其父结点加入之前加入树就会出错
[解决办法]
“未将对象引用设置到对象的实例”说明你操作的对象为Nothing。可以断点调试一下哪些对象为Nothing
[解决办法]
你的objstru()是怎么赋值的?是按你给的数据库表的顺序吗?
[解决办法]
我所做的测试:

VB.NET code
        Dim tbl As New DataTable        tbl.Columns.Add("id", GetType(System.Int16))        tbl.Columns.Add("pid", GetType(System.Int16))        tbl.Columns.Add("name", GetType(System.String))        Dim dr As DataRow = tbl.NewRow()        dr(0) = 1        dr(1) = 0        dr(2) = "aa"        tbl.Rows.Add(dr)        dr = tbl.NewRow()        dr(0) = 2        dr(1) = 0        dr(2) = "bb"        tbl.Rows.Add(dr)        dr = tbl.NewRow()        dr(0) = 3        dr(1) = 0        dr(2) = "cc"        tbl.Rows.Add(dr)        dr = tbl.NewRow()        dr(0) = 4        dr(1) = 0        dr(2) = "dd"        tbl.Rows.Add(dr)        dr = tbl.NewRow()        dr(0) = 5        dr(1) = 1        dr(2) = "ee"        tbl.Rows.Add(dr)        dr = tbl.NewRow()        dr(0) = 6        dr(1) = 1        dr(2) = "ff"        tbl.Rows.Add(dr)        dr = tbl.NewRow()        dr(0) = 7        dr(1) = 1        dr(2) = "gg"        tbl.Rows.Add(dr)        For i As Int16 = 0 To tbl.Rows.Count - 1            If tbl.Rows(i)(1) = 0 Then                TreeView1.Nodes.Add(tbl.Rows(i)(0).ToString, tbl.Rows(i)(2).ToString)            Else                TreeView1.Nodes(tbl.Rows(i)(1).ToString).Nodes.Add(tbl.Rows(i)(0).ToString, tbl.Rows(i)(2).ToString)            End If        Next
[解决办法]
你在调试的时候设置一下监视
把那些变量都监视起来

或者这么更改一下

dim pid as string =CStr(objStru(i).parentid)

dim tid as string =CStr(objStru(i).id)
dim name as string =CStr(objstru(i).name)
TreeView1.Nodes(pid).Nodes.Add(tid, name )

然后你在看看调试里面说什么
------解决方案--------------------


Private list As DataView

Dim ds As New DataSet
'把数据装入ds
list = ds.Tables(0).DefaultView
InitTree(TreeView1.Nodes, 0)

Private Sub InitTree(ByRef nodes As TreeNodeCollection, ByVal ids As String)
Try
Dim tmpnode As TreeNode
Dim idd As String
Dim dvtemp As DataView = list.Table.DefaultView
Dim datarows() As DataRow = list.Table.Select("praentid='" + ids + "'")
For Each dr As DataRow In datarows
tmpnode = New TreeNode
tmpnode.Text = dr("name")
tmpnode.Tag = CType(dr("id"), Object)
idd = dr("id")
nodes.Add(tmpnode)
InitTree(nodes(nodes.Count - 1).Nodes, idd)
Next
Catch ex As Exception
MessageBox.Show("初始化TreeView失败!")
End Try

End Sub
[解决办法]
学习

[解决办法]
i得到的值不对吧.这个之前我也试过
[解决办法]
7楼
“未将对象引用设置到对象的实例”说明你操作的对象为Nothing。可以断点调试一下哪些对象为Nothing
[解决办法]
应该很简单
做之前凡是这样的加入这样一句话
if isdbnull(dateset.Tables("temp").Rows(i)(1))=true then
exit sub
end if
出现这个问题就是你的对象是nothing
[解决办法]

测试的时候怎么还死机了? (我几天早上打开显示器,发现,黑屏,不亮了))


比较简单的方法,你就是用鼠标选定一部分,然后再将鼠标放上悬停,就会出现调试工具
如果不出现,可以选定, 然后 右键,添加快速监视 ,也可以
另外,你也查看一下,那些索引 ,很有可能索引越界而出现的~
[解决办法]
hoho
[解决办法]
冒个泡,学习一下
[解决办法]
For i As Int32 = 0 To 4
If objStru(i).parentid = 0 Then ' 加入根节点
TreeView1.Nodes.Add(CStr(objStru(i).id), CStr(objstru(i).name))
Else ' 加入子节点
TreeView1.Nodes(CStr(objStru(i).parentid)).Nodes.Add(CStr(objStru(i).id), CStr(objstru(i).name))
End If
Next
----------------------------------------------
你的objStru(i)是什么?给出你的objStru对象!你通过objStru(i).parentid = 0 来判断是什么意思?我觉得你这样也不能实现treeview绑定数据!
[解决办法]
学习
[解决办法]
TreeView1.Nodes(CStr(objStru(i).parentid)).Nodes.Add(CStr(objStru(i).id), CStr(objstru(i).name))
TreeView1.Nodes(CStr(objStru(i).parentid)) 主要看看你的树里有没有这个节点
[解决办法]
呵呵
数据库结构少个排序的字段

读书人网 >VB Dotnet

热点推荐