求教winform里面treeview动态添加节点的问题!!

av168659700 2009-09-25 03:38:26
如题!
节点信息存在数据库内,请教如何实现动态加载和添加treeview节点????????
...全文
799 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
av168659700 2009-09-26
  • 打赏
  • 举报
回复
问题解决!!给分
tel84689334 2009-09-25
  • 打赏
  • 举报
回复
你先找出没有父节点的节点,然后再找出这个父节点的子节点,再找出子节点的子节点。。。以此类推就可以了,添加节点的代码都是一样的。希望对你有所帮忙
av168659700 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 cadtian 的回复:]
C# codeprivatevoid FillTree(TreeNode node, DataTable dt)
{if (dt.Rows.Count>0)
{for (int i=0; i< dt.Rows.Count; i++)
{string NodeID= dt.Rows[i]["NodeID"].ToString();string NodeName= dt.Rows[i]["NodeText"].ToString();
TreeNode deptNode=new TreeNode(NodeName);
deptNode.Tag= NodeID;//可以得到id,根据此ID得到类别名称显示在title上 node.Nodes.Add(deptNode);
FillTree(deptNode, GetSubType(string.Format("ParentTypeID = '{0}'", NodeID), dt));
}
}
}private DataTable GetSubType(string filter, DataTable dt)
{
DataView dv= dt.DefaultView;
dv.RowFilter= filter;
dv.Sort="NodeParent";return dv.ToTable();
}

试试这个。你的根节点是不是也在datatable里?

to xingxuejiao:在你的代码上做了修改不好意思
[/Quote]
我第一次调用FillTree()方法的时候应该如何传值呢?
cadtian 2009-09-25
  • 打赏
  • 举报
回复

private void FillTree(TreeNode node, DataTable dt)
{
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
string NodeID = dt.Rows[i]["NodeID"].ToString();
string NodeName = dt.Rows[i]["NodeText"].ToString();
TreeNode deptNode = new TreeNode(NodeName);
deptNode.Tag = NodeID;//可以得到id,根据此ID得到类别名称显示在title上
node.Nodes.Add(deptNode);
FillTree(deptNode, GetSubType(string.Format("ParentTypeID = '{0}' ", NodeID), dt));
}
}
}

private DataTable GetSubType(string filter, DataTable dt)
{
DataView dv = dt.DefaultView;
dv.RowFilter = filter;
dv.Sort = "NodeParent";
return dv.ToTable();
}


试试这个。你的根节点是不是也在datatable里?

to xingxuejiao:在你的代码上做了修改不好意思
舞时尚 2009-09-25
  • 打赏
  • 举报
回复
不是可以用递归算法???
av168659700 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cadtian 的回复:]
思路过程都是对的,有几个地方稍微要改改
[/Quote]
具体是什么地方需要改啊?
xingn 2009-09-25
  • 打赏
  • 举报
回复
public static bool tree(TreeView treeview)
{
TreeNode root;

Database db = DatabaseFactory.CreateDatabase();
{


using (IDataReader dr = db.ExecuteReader(CommandType.Text, "select name from regist where ID=9999"))
{
if (dr.Read())
{
treeview.Nodes.Clear();
root = treeview.Nodes.Add(dr.GetString(0).Trim());
root.Tag = "0";
dr.Close();
AddSubNode(root);
return true;
}
else
{
dr.Close();
return false;
}

}

}


}

public static int AddSubNode(TreeNode root)
{


List<TreeNode> allchild = new List<TreeNode>();


String id = root.Tag.ToString();
String sql = "select 部门名称, ID from 组织机构表 where 上级部门ID=" + id;

Database db = DatabaseFactory.CreateDatabase();
{


using (IDataReader dr = db.ExecuteReader(CommandType.Text, sql))
{
if (dr == null)
{
dr.Close();
return 0;
}
else
{
while (dr.Read())
{
allchild.Add(new TreeNode(dr.GetString(0).Trim()));
allchild[allchild.Count - 1].Tag = dr.GetInt64(1);
root.Nodes.Add(allchild[allchild.Count - 1]);
}
dr.Close();
}


}
}

for (int i = 0; i < allchild.Count; i++)
{
AddSubNode(allchild[i]);
}
return allchild.Count;

}
cadtian 2009-09-25
  • 打赏
  • 举报
回复

思路过程都是对的,有几个地方稍微要改改
av168659700 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cadtian 的回复:]
[Quote=引用 10 楼 av168659700 的回复:

这个代码好像不行
[/Quote]

6楼代码可行啊,有什么问题?
[/Quote]
用了,没效果
cadtian 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 av168659700 的回复:

这个代码好像不行
[/Quote]

6楼代码可行啊,有什么问题?
liujintaozyc 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xingxuejiao 的回复:]
private void FillTree(TreeNodeCollection nodes, DataTable dt)
{
if (dt.Rows.Count > 0)
        {
          for (int i = 0; i < dt.Rows.Count; i++)
          {
          string typeID = dt.Rows[i]["NodeID"].ToString();
                string typeName = dt.Rows[i]["NodeText"].ToString();
                TreeNode deptNode = new TreeNode(typeName);
                deptNode.Tag = NodeID;//可以得到id,根据此ID得到类别名称显示在title上
                  nodes.Add(deptNode);
                FillTree(deptNode.Nodes, GetSubType(string.Format
                ("ParentTypeID = '{0}' ", NodeID)));
            }
        }
}
private DataTable GetSubType(string filter)
{
    DataView dv = dataSet.Tables["NodeTable"].DefaultView;
    dv.RowFilter = filter;
    dv.Sort = "NodeParent";
    return dv.ToTable();
}
[/Quote]
循环
然后添加this.treeView1.Nodes.Add("node01");
就可以 和web差不多
av168659700 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xingxuejiao 的回复:]
private void FillTree(TreeNodeCollection nodes, DataTable dt)
{
if (dt.Rows.Count > 0)
        {
          for (int i = 0; i < dt.Rows.Count; i++)
          {
          string typeID = dt.Rows[i]["NodeID"].ToString();
                string typeName = dt.Rows[i]["NodeText"].ToString();
                TreeNode deptNode = new TreeNode(typeName);
                deptNode.Tag = NodeID;//可以得到id,根据此ID得到类别名称显示在title上
                  nodes.Add(deptNode);
                FillTree(deptNode.Nodes, GetSubType(string.Format
                ("ParentTypeID = '{0}' ", NodeID)));
            }
        }
}
private DataTable GetSubType(string filter)
{
    DataView dv = dataSet.Tables["NodeTable"].DefaultView;
    dv.RowFilter = filter;
    dv.Sort = "NodeParent";
    return dv.ToTable();
}
[/Quote]
这个代码好像不行
mingxingxia 2009-09-25
  • 打赏
  • 举报
回复
用嵌套for循环同样可以达到目的
外层循环父节点
内层匹配子节点
cadtian 2009-09-25
  • 打赏
  • 举报
回复
如果没必要一下把整棵树加载,实际上可以一层一层展开
av168659700 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xingxuejiao 的回复:]
private void FillTree(TreeNodeCollection nodes, DataTable dt)
{
if (dt.Rows.Count > 0)
        {
          for (int i = 0; i < dt.Rows.Count; i++)
          {
          string typeID = dt.Rows[i]["NodeID"].ToString();
                string typeName = dt.Rows[i]["NodeText"].ToString();
                TreeNode deptNode = new TreeNode(typeName);
                deptNode.Tag = NodeID;//可以得到id,根据此ID得到类别名称显示在title上
                  nodes.Add(deptNode);
                FillTree(deptNode.Nodes, GetSubType(string.Format
                ("ParentTypeID = '{0}' ", NodeID)));
            }
        }
}
private DataTable GetSubType(string filter)
{
    DataView dv = dataSet.Tables["NodeTable"].DefaultView;
    dv.RowFilter = filter;
    dv.Sort = "NodeParent";
    return dv.ToTable();
}
[/Quote]
好,我去试一下
xingxuejiao 2009-09-25
  • 打赏
  • 举报
回复
private void FillTree(TreeNodeCollection nodes, DataTable dt)
{
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
string typeID = dt.Rows[i]["NodeID"].ToString();
string typeName = dt.Rows[i]["NodeText"].ToString();
TreeNode deptNode = new TreeNode(typeName);
deptNode.Tag = NodeID;//可以得到id,根据此ID得到类别名称显示在title上
nodes.Add(deptNode);
FillTree(deptNode.Nodes, GetSubType(string.Format
("ParentTypeID = '{0}' ", NodeID)));
}
}
}
private DataTable GetSubType(string filter)
{
DataView dv = dataSet.Tables["NodeTable"].DefaultView;
dv.RowFilter = filter;
dv.Sort = "NodeParent";
return dv.ToTable();
}
happy398182130 2009-09-25
  • 打赏
  • 举报
回复
不懂!还没接触数据库呢~应该也快了,学习!!帮顶!!!!!
cadtian 2009-09-25
  • 打赏
  • 举报
回复
先从表中找出第一级的节点
加到根节点下,每加一个接电视,判断是否有下级节点,如果有从表里面找出来加进去。。。。这样逐一加进去
av168659700 2009-09-25
  • 打赏
  • 举报
回复
可能我没说清楚,举个例子吧:
假设我有这样一张表,里面包含了节点信息:NodeID(ID号),NodeText(节点的内容),NodeLeavl(节点等级),NodeParent(父节点Leavel)。
怎么做能在界面加载的时候,把节点信息按数据库里面标识的加载到treeview
av168659700 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cadtian 的回复:]
  this.treeView1.Nodes.Add("node01");
[/Quote]
我的意思是:从数据库里面读取数据,然后动态加载到treeview里面
加载更多回复(1)

110,572

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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