从数据库读取数据绑定到TREEVIEW上
(下面是在别人的博客中取出来的数据)
有如下一张表解释:DEPT_ID是部门号,NAME_DEP是部门名称,ID_DEPT是所属的部门号,其意义是,如:DEPT_ID 为000000 NAME_DEP为北京检查院,ID_DEPT为000000表示这是根节点,也就是一级节点,又如:DEPT_ID为000004,NAME_DEP为成都检查院,ID_DEPT为000004也是指这是根节点,也是一级节点,又如DEPT_ID为000002,NAME_DEP为检查办,ID_DEPT为000000,表示这个部门是北京检查院的下级部门,也就是二级节点,DEPT_ID为000003这个部门是DEPT_ID为000001的子部门,是它的更下一级节点,程序运行后的效果如下图:
我就是想动态读取数据库中的数据,然后像上图所示的树形结构,大家都又什么好办法拿出来晒晒,我在博客上看到一个办法,但是觉得效率不高http://blog.csdn.net/jjx0224/archive/2010/01/15/5193834.aspx
这是能实现的代码,但觉得不好,大家看看还有什么好办法
(下面是在别人的博客中取出来的数据)
有如下一张表解释:DEPT_ID是部门号,NAME_DEP是部门名称,ID_DEPT是所属的部门号,其意义是,如:DEPT_ID 为000000 NAME_DEP为北京检查院,ID_DEPT为000000表示这是根节点,也就是一级节点,又如:DEPT_ID为000004,NAME_DEP为成都检查院,ID_DEPT为000004也是指这是根节点,也是一级节点,又如DEPT_ID为000002,NAME_DEP为检查办,ID_DEPT为000000,表示这个部门是北京检查院的下级部门,也就是二级节点,DEPT_ID为000003这个部门是DEPT_ID为000001的子部门,是它的更下一级节点,程序运行后的效果如下图:
我就是想动态读取数据库中的数据,然后像上图所示的树形结构,大家都又什么好办法拿出来晒晒,我在博客上看到一个办法,但是觉得效率不高http://blog.csdn.net/jjx0224/archive/2010/01/15/5193834.aspx
这是能实现的代码,但觉得不好,大家看看还有什么好办法
解决方案 »
- 定义与类名称相同的函数为什么不需要返回类型?
- SqlCommand中文参数的问题
- 关于结构体中带函数
- (高分求解)在编辑环境下如果屏蔽form的load事件(急...)
- 求一个算法,考考你的智力!!!!!!!
- 正则匹配的问题,希望高人指点(超急)
- 如何使用图表进行数据统计?
- Control.Refresh Control.Invalidate 和 Control.OnPaint之间的联系和区别
- 高手帮忙啊,我搞不定了。
- 为什么网上那么多的例程都不能运行??VS Beta2和Beta1的,有哪些地方不同??
- 【初学者求教】如何取出整张表中的行数?(不是取ID,是取真实行的总数)
- webservice 接口 同步调用 网络延时如何处理??
比你的表多加一个字段Level用于表示级次
DeptId DeptName ParentId Level
00000 北京检察院 null 1
00001 党委 00001 1
00002 检察办 00001 1
00003 政治部 00001 2
00004 成都检察院 null 1
然后这样查出来: select * from Dept order by Level
这样可以保证一次循环就可以加上所有节点,因为当前的节点的上一级必定已经加入树内,具体代码就不写了,很简单了.
TreeView
{
DataTable dt = new DataTable();
dt.Columns.Add("depart_id");
dt.Columns.Add("depart_name");
dt.Columns.Add("parent_id"); DataRow dr; dr = dt.NewRow();
dr[0] = "1";
dr[1] = "name1";
dr[2] = "";
dt.Rows.Add(dr); dr = dt.NewRow();
dr[0] = "2";
dr[1] = "name2";
dr[2] = "1";
dt.Rows.Add(dr); dr = dt.NewRow();
dr[0] = "3";
dr[1] = "name3";
dr[2] = "2";
dt.Rows.Add(dr); dr = dt.NewRow();
dr[0] = "4";
dr[1] = "name4";
dr[2] = "3";
dt.Rows.Add(dr); this.treeView1.Nodes.Clear(); DataRow[] drs = dt.Select("parent_id=''");
if (drs != null)
{
if (drs.Length > 0)
{
foreach (DataRow tempdr in drs)
{
TreeNode oTreeNode = new TreeNode();
oTreeNode.Text = tempdr["depart_name"].ToString();
fTreeNone(oTreeNode, dt, tempdr["depart_id"].ToString());
this.treeView1.Nodes.Add(oTreeNode);
}
}
}
} private void fTreeNone(TreeNode oTreeNode, DataTable dt, string parentid)
{
DataRow[] drs = dt.Select("parent_id='" + parentid + "'");
if (drs != null)
{
if (drs.Length > 0)
{
foreach (DataRow tempdr in drs)
{
TreeNode oTempTreeNode = new TreeNode();
oTempTreeNode.Text = tempdr["depart_name"].ToString();
oTreeNode.Nodes.Add(oTempTreeNode);
fTreeNone(oTempTreeNode, dt, tempdr["depart_id"].ToString()); }
}
}
}
成立:就可以一次循环把它们全加到树里
不成立:必须经过很多次的循环才能全加到树里,大概就跟LZ原来的解法是一样的.
然后表结构,name ,id,parent_id
首先通过ID的length可以知道ID的Leave,parent_Id知道父节点。这个表结构就可以支持无限极分类树了,级别限制跟Id字段数据类型相关。不需要递归。
这是我做的一个demo,含源码下载。
第一次加载就只是加载其下面的一层 这样不会出现假死现象。
下面的代码是年前我一个项目中用到的:希望对你有帮助
#region TreeView AfterSelect Event.
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
this.getCon(); // Connect the database
string name = this.treeView1.SelectedNode.Text.ToString();
this.treeView1.SelectedNode.Nodes.Clear(); // Clear the selected node's children nodes. SortedList<string, int> childern = findUnder(name); // Find the child nodes from the data. foreach (KeyValuePair<string, int> s in childern)
{
if (data.Contains(s.Key)) // Check the srearch contain the nodes.
{
TreeNode child = new TreeNode(s.Key.ToString());
this.treeView1.SelectedNode.Nodes.Add(child); // Add the found nodes into the selected node.
data.Remove(s.Key);
}
}
for (int k = 0; k < data.Count; k++)
{
TreeNode child = new TreeNode(data[k].ToString());
this.treeView1.Nodes.Add(child);
}
this.treeView1.SelectedNode.Expand();
this.odcConnection.Close();// Close the data connection.
}不懂可以和我聊聊
QQ:287072382
MSN:[email protected]