树型控件请高手帮忙

usernamezero 2009-04-16 12:55:53
2 001001 管理局机关 001001
3 001001012 处室 001001
4 001001026 直属 001001
5 001003 渤海钻井总公司 001003
6 001003001 机关 001003
7 001003002 机关直属 001003
8 001003003 钻井一公司 001003
9 001003004 钻井二公司 001003
10 001003005 钻前公司 001003
11 001003006 固井公司 001003
12 001003007 管具公司 001003
13 001003008 物资配送中心 001003
14 001003009 钻井设备维修中心001003
15 001003010 海胜集团 001003
16 001003011 待分配 001003
17 001003014 综合服务大队 001003
18 001003018 工程运输一公司 001003
19 001003019 工程运输二公司 001003
20 001003020 华龙实业公司 001003
21 001004 黄河钻井总公司 001004
22 001004001 机关 001004
23 001004002 机关直属 001004
24 001004003 钻井三公司 001004
25 001004004 钻井四公司 001004
26 001004005 钻井五公司 001004
27 001004006 钻前公司 001004
28 001004007 管具公司 001004

如果是这样的结构,谁能给个方法形成一个树型.
...全文
221 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mykelly6 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 usernamezero 的回复:]
3楼的这个用法怎么用啊
FindNode(treeView1.?, "001");
这个?的地方不知道写什么啊
[/Quote]
?这里把根节点也就是最高级的一个结点放上去。从这个节点开始一个个的找需要的节点。先在子结点找,再在孙节点找,直到找到为止。
楼上很多大神都写了阿,应该是没问题的。如果lz还是有点晕的话,我就去写完整代码。
wuyq11 2009-04-16
  • 打赏
  • 举报
回复
递归获取数据
if (!IsPostBack)
{
BindJG();
}
private void BindJG()
{
DataSet ds = new DataSet();
..
DataTable dtb = ds.Tables[0];
TreeNode root = new TreeNode();
root.Value = "0";
root.Text = "";
root.ImageUrl = "../images/folder.gif";
root.Expanded = true;
this.TreeView1.Nodes.Add(root);
initTree(dtb, "", root);
this.TreeView1.ExpandAll();
}
protected void initTree(DataTable dt, string nFatherid, TreeNode fatherNode)
{
DataView dv = new DataView(dt);

if (nFatherid == "")
dv.RowFilter = "depth='1'";
else
dv.RowFilter = "shangjjgbh='"+nFatherid+"'";
foreach (DataRowView Row in dv)
{
TreeNode node = new TreeNode();
if (fatherNode.Value == "0")//根节点
{
node.Value = Row["XTBH"].ToString();
node.Text = Row["mc"].ToString();
node.NavigateUrl = "";
node.ImageUrl = "../images/folder.gif";
fatherNode.ChildNodes.Add(node);
initTree(dt, Row["XTBH"].ToString(), node);//递归
}
else
{
node.Text = Row["mc"].ToString();
node.Value = Row["XTBH"].ToString();
node.ImageUrl = "../images/jg.gif";
fatherNode.ChildNodes.Add(node);

}
}

}
快40的码农 2009-04-16
  • 打赏
  • 举报
回复

id name parentid
001001 管理局机关 001001

private void TreeDataBind()
{
this.TreeView1.Nodes.Add(new TreeNode("根目录", FirstCode));
TreeDataBind(this.TreeView1.Nodes[0]);
}

private void TreeDataBind(TreeNode node)
{
if (node.Depth == 0)
node.Expand();// = true;
else
node.Collapse();// = false;
string sql = "";
TreeNodeCollection nodes = null;
if (node == null)
{
sql = "select * from table where parent='" + id + "'";
nodes = this.TreeView1.Nodes;
}
DataSet ds = DataFunction.DataFunction.FillDataSet(sql);
foreach (DataRow r in ds.Tables[0].Rows)
{
TreeNode newNode = new TreeNode(r["description"].ToString(), r["code"].ToString());
nodes.Add(newNode);
TreeDataBind(newNode);
}
}
tsp860901 2009-04-16
  • 打赏
  • 举报
回复
学习 学习
usernamezero 2009-04-16
  • 打赏
  • 举报
回复
3楼的这个用法怎么用啊
FindNode(treeView1.?, "001");
这个?的地方不知道写什么啊
usernamezero 2009-04-16
  • 打赏
  • 举报
回复
楼上的可真是个强人,单位层集关系有6层 到6级单位加起来有8050行,写8050行吗?
zgke 2009-04-16
  • 打赏
  • 举报
回复
DataTable _Talbe = new DataTable();
_Talbe.Columns.Add("ID");
_Talbe.Columns.Add("IdText");
_Talbe.Columns.Add("Name");
_Talbe.Columns.Add("Pid");


_Talbe.Rows.Add(new object[] { "2", "001001", "管理局机关", "001001" });
_Talbe.Rows.Add(new object[] { "3", "001001012", "处室", "001001" });
_Talbe.Rows.Add(new object[] { "4", "001001026", "直属", "001001" });
_Talbe.Rows.Add(new object[] { "5", "001003", "渤海钻井总公司", "001003" });
_Talbe.Rows.Add(new object[] { "6", "001003001", "机关", "001003" });
_Talbe.Rows.Add(new object[] { "7", "001003002", "机关直属", "001003" });
_Talbe.Rows.Add(new object[] { "8", "001003003", "钻井一公司", "001003" });
_Talbe.Rows.Add(new object[] { "9", "001003004", "钻井二公司", "001003" });
_Talbe.Rows.Add(new object[] { "10", "001003005", "钻前公司", "001003" });
_Talbe.Rows.Add(new object[] { "11", "001003006", "固井公司", "001003" });
_Talbe.Rows.Add(new object[] { "12", "001003007", "管具公司", "001003" });
_Talbe.Rows.Add(new object[] { "13", "001003008", "物资配送中心", "001003" });
_Talbe.Rows.Add(new object[] { "14", "001003009", "钻井设备维修中心","001003" });
_Talbe.Rows.Add(new object[] { "15", "001003010", "海胜集团", "001003" });
_Talbe.Rows.Add(new object[] { "16", "001003011", "待分配", "001003" });
_Talbe.Rows.Add(new object[] { "17", "001003014", "综合服务大队", "001003" });
_Talbe.Rows.Add(new object[] { "18", "001003018", "工程运输一公司", "001003" });
_Talbe.Rows.Add(new object[] { "19", "001003019", "工程运输二公司", "001003" });
_Talbe.Rows.Add(new object[] { "20", "001003020", "华龙实业公司", "001003" });
_Talbe.Rows.Add(new object[] { "21", "001004", "黄河钻井总公司", "001004" });
_Talbe.Rows.Add(new object[] { "22", "001004001", "机关", "001004" });
_Talbe.Rows.Add(new object[] { "23", "001004002", "机关直属", "001004" });
_Talbe.Rows.Add(new object[] { "24", "001004003", "钻井三公司", "001004" });
_Talbe.Rows.Add(new object[] { "25", "001004004", "钻井四公司", "001004" });
_Talbe.Rows.Add(new object[] { "26", "001004005", "钻井五公司", "001004" });
_Talbe.Rows.Add(new object[] { "27", "001004006", "钻前公司", "001004" });
_Talbe.Rows.Add(new object[] { "28", "001004007", "管具公司", "001004" });


treeView1.Nodes.Clear();
for (int i = 0; i != _Talbe.Rows.Count; i++)
{
string _Key =_Talbe.Rows[i][1].ToString();

string _Type = _Key.Substring(0,6);
TreeNode[] _TypeNodeList =treeView1.Nodes.Find(_Type,true);

if (_TypeNodeList.Length != 0)
{
_TypeNodeList[0].Nodes.Add(_Key, _Talbe.Rows[i][2].ToString());
}
else
{
treeView1.Nodes.Add(_Key, _Talbe.Rows[i][2].ToString());
}
}
mykelly6 2009-04-16
  • 打赏
  • 举报
回复
关键在于要找到父结点在树上的位置,就是说要通过父结点的name/id这样唯一的属性得到父结点的对象parentNode。
然后新建一个子节点对象,parentNode.add(childNode)

要注意的是node.Nodes得到的节点是他的下一级的所有子节点,而他子节点的子节点不在里面的
usernamezero 2009-04-16
  • 打赏
  • 举报
回复
你们我的这个方法行不
public void InitTree(TreeNodeCollection Nds, string parentId) //, string flag
{
TreeNode tmpNd; //建立一个节点
DataRow[] rows = ds.Tables[0].Select("c='" + parentId + "'");

foreach (DataRow row in rows)
{
//通过查询得到父节点,依次循环
tmpNd = new TreeNode(); //声明一个新的节点
tmpNd.Name = row["a"].ToString();//节的名字是a.ToString()
tmpNd.Text = row["b"].ToString();//节点的内容是b.ToString()
tmpNd.Collapse();
Nds.Add(tmpNd);//把节点加入到节点集合中
InitTree(tmpNd.Nodes, tmpNd.Name);//, flag//把加入的节点作为新的节点集合再次调用 名字是a.ToString()
}
}
没用是这么调用的InitTree(treeView1.Nodes, "001001");
mykelly6 2009-04-16
  • 打赏
  • 举报
回复
递归在树上寻找父结点

private TreeNode FindNode(TreeNode tnParent, string strValue)//tnParent根节点,strValue父结点id
{
if (tnParent == null) return null;
if (tnParent.Tag.ToString() == strValue) return tnParent;//找到父结点

TreeNode tnRet = null;
foreach (TreeNode tn in tnParent.Nodes)//根节点下有有子节点,继续遍历
{
tnRet = FindNode(tn, strValue);
if (tnRet != null) break;
}
return tnRet;
}


调用findnode

TreeNode node = FindNode(treeViewFolder.Nodes[0],fatherName);//找父结点
if (node != null)
{
node.Nodes.Add(childNode);//把该子节点加到树上
node.Collapse();
}
jiguixin 2009-04-16
  • 打赏
  • 举报
回复
其实可以这样看,id name pid 其实这就是一个表的树形结构。你先001001 管理局机关 001001 这其实就是一个根结点因为他的PID也是他自己。你看如果 PID 和 一个结点的ID相同,那么就说明,他是他的子级这样就可以形成一个树了。
mykelly6 2009-04-16
  • 打赏
  • 举报
回复
第4列是fatherid吧?
第2列本身的id作为tag属性,逐个加载上去啊,读一条记录就去找他的父结点xxx(fatherid==xxx.tag.tostring())

111,097

社区成员

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

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

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