哪位给解释一下这段代码
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()是怎么赋值的?是按你给的数据库表的顺序吗?
[解决办法]
我所做的测试:
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)) 主要看看你的树里有没有这个节点
[解决办法]
呵呵
数据库结构少个排序的字段