帮忙看一下treeview的递归节点问题,我已经快晕了

wildboat 2004-09-01 03:32:05
数据结构(数据库:部门)
部门编号 部门名称 父级编号
000 公司
001 财务部 000
002 办公室 000
003 市场部 000
003001 市场一部 003
003002 市场二部 003

代码:
Dim myview As DataView
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then
Dim mycommand As New SqlCommand("select * from 部门", SqlConnection1)
Dim myadapter As New SqlDataAdapter(mycommand)
Dim myset As New DataSet()
SqlConnection1.Open()
myadapter.Fill(myset, "all")
SqlConnection1.Close()
myview = myset.Tables(0).DefaultView
myview.RowFilter = ""
Session("view") = myview
treeload(TreeView1.Nodes, "000")
End If
End Sub

Sub treeload(ByVal snodes As TreeNodeCollection, ByVal sparentid As String)
myview.RowFilter = "父级编号 =" & sparentid
Dim i As Integer
For i = 0 To myview.Count - 1
Dim mynode As TreeNode
mynode = New TreeNode()
mynode.ID = myview(i)(0)
mynode.Text = myview(i)(1)
snodes.Add(mynode)
treeload(mynode.Nodes, myview(i)(0))
Next
End Sub
运行出错:mynode.ID = myview(i)(0) 索引 1 不是非负数且小于总行数

如果将treeload里的treeload(mynode.Nodes, myview(i)(0))去掉,遍历一边是可以将二级目录:财务部,办公室,市场部,显示出来,可当递归时就出错
帮我看一下是什么原因,我真的已经晕了
...全文
197 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wildboat 2004-09-01
  • 打赏
  • 举报
回复
xiangzionest(祥子) 说的对
可能是dataview在传值时导致的吧
但并没有提交啊
dataview怎么会没有直了呢
goody9807 2004-09-01
  • 打赏
  • 举报
回复
我的方法和你的不一样 你用的是2维数组

你换我的方法式式

我以前式过的
xiangzionest 2004-09-01
  • 打赏
  • 举报
回复
搂主,我当时也碰见你这种情况,我个人认为是DataView的原因,你可以把DataView用其他办法代替,比如DataTabel 就可以了,我当时就是这样解决的。
wildboat 2004-09-01
  • 打赏
  • 举报
回复
判断什么
pnode==null
是这个吗
不需要吧
codeangel 2004-09-01
  • 打赏
  • 举报
回复
每次递归前加上判段。
wildboat 2004-09-01
  • 打赏
  • 举报
回复
这个和我那个一样啊
就是加了判断是否有根节点
wu621 2004-09-01
  • 打赏
  • 举报
回复
慢满来给你一个VB的
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If DbOpen() = True Then
Dim MainRoot As New TreeNode()
TtreeView.Nodes.Clear()
MainRoot.ID = 0
MainRoot.Text = "MyTable"
MainRoot.Target = "right form"
MainRoot.NavigateUrl = "www.sina.com.cn"
TtreeView.Nodes.Add(MainRoot)
TtreeView.ToolTip = " mytreeview "
Dim ds As New DataSet()
Dim Tloop As Integer
Dim TTloop As Integer
ds = GetSource(Status)
For Tloop = 0 To ds.Tables.Item(0).Columns.Count - 1
Dim Root As New TreeNode()
Root.ID = Tloop
Root.Text = ds.Tables.Item(0).Columns(Tloop).Caption
Root.Target = "right form"
Root.NavigateUrl = "WebForm_right.aspx"
MainRoot.Nodes.Add(Root)
For TTloop = 0 To ds.Tables.Item(0).Rows.Count - 1
Dim Child_Root As New TreeNode()
Child_Root.ID = TTloop
Child_Root.Text = ds.Tables(0).Rows(TTloop).Item(Tloop)
Child_Root.Target = "right form"
Child_Root.NavigateUrl = "WebForm_right.aspx"
Root.Nodes.Add(Child_Root)
Next
Next
End If
End Sub
Public Function GetSource(ByVal Status As String) As DataSet
Dim strsql As String
strsql = ""
strsql = strsql & "SELECT Orders, Region,"
strsql = strsql & "[Order Details], Employees,"
strsql = strsql & "Customers, Shippers, Supplies"
strsql = strsql & " FROM mytable"
Try
Dim da As New OleDbDataAdapter(strsql, dbConn)
Dim ds As New DataSet()
da.Fill(ds, "MyTable")
Return ds
Catch err As System.Exception
Status = err.Message.ToString
End Try
End Function
codeangel 2004-09-01
  • 打赏
  • 举报
回复
楼主别急,慢慢来,我刚开始也是这样的。给你发个C#的吧。
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
BindTree(0, (Microsoft.Web.UI.WebControls.TreeNode)null);
}
btnClick.Attributes.Add("onclick","");
}
public void BindTree(int ParentID,Microsoft.Web.UI.WebControls.TreeNode pNode)
{
DataSet ds=Super.GetDs("SELECT * FROM HR_Function_Dir");
DataView dvTree = new DataView(ds.Tables[0]);
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "[PARENTID] = " + ParentID;


foreach(DataRowView Row in dvTree)
{
Microsoft.Web.UI.WebControls.TreeNode Node=new Microsoft.Web.UI.WebControls.TreeNode() ;
if(pNode == null)
{ //'?添加根节点
Node.Target=Row["HRID"].ToString();
Node.Text = Row["DirName"].ToString()+" "+"<a title=新建子目录 href=HR_Function_AddDir.aspx?ParentID="+Node.Target+">N</a>"+" "+"<a title=修改该目录 href=HR_Function_EditDir.aspx?ParentID="+Node.Target+">M</a>"+" "+"<a title=删除该目录 href=# OnClick=DelNode("+Node.Target+")>D</a>";
tv.Nodes.Add(Node);
Node.Expanded=true;//初始化时是否列出根节点的所有子节点
BindTree(Int32.Parse(Row["HRID"].ToString()), Node); //再次递归
}
else
{ //添加当前节点的子节点
Node.Target=Row["HRID"].ToString();
Node.Text = Row["DirName"].ToString()+" "+"<a title=新建子目录 href=HR_Function_AddDir.aspx?ParentID="+Node.Target+">N</a>"+" "+"<a title=修改该目录 href=HR_Function_EditDir.aspx?ParentID="+Node.Target+">M</a>"+" "+"<a title=删除该目录 href=# OnClick=DelNode("+Node.Target+")>D</a>";
pNode.Nodes.Add(Node);

Node.Expanded = true;//初始化时是否列出子节点的所有子节点
BindTree(Int32.Parse(Row["HRID"].ToString()),Node); //再次递归
}
}
}
wildboat 2004-09-01
  • 打赏
  • 举报
回复
可否说清楚一点
我急啊
goody9807 2004-09-01
  • 打赏
  • 举报
回复
transfer treeload Method to AddTree Method
goody9807 2004-09-01
  • 打赏
  • 举报
回复
'递归添加树的节点
Private Sub AddTree(ByVal ParentID As Integer, ByVal pNode As TreeNode)
Dim ds As DataSet
ds = Me.ViewState("ds")
Dim dvTree As New DataView()
dvTree = New DataView(ds.Tables(0))
'过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "PARENTID = " + ParentID.ToString

Dim Row As DataRowView
For Each Row In dvTree
Dim Node As New TreeNode()
If pNode Is Nothing Then '判断是否根节点
'添加根节点
Node.Text = Row("ConText").ToString()
TreeView1.Nodes.Add(Node)
Node.Expanded = True
'再次递归
AddTree(Int32.Parse(Row("ID").ToString()), Node)
Else
'̀添加当前节点的子节点
Node.Text = Row("ConText").ToString()
pNode.Nodes.Add(Node)
Node.Expanded = True
'再次递归
AddTree(Int32.Parse(Row("ID").ToString()), Node)
End If
Next
End Sub

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧