发信人: minerva (cheng), 信区: DotNET
标 题: TreeView使用的一些心得
发信站: BBS 水木清华站 (Sun Sep 7 10:33:31 2003), 转信
(1)动态生成TreeView
假设数据库中有两个表,一个为班级表,有班号和班名两个属性,班号ccode为主键,一
个为学生表,有学号和姓名两个属性,学号scode为主键,根节点为学院。又假设在db类
中已经写好了从数据源中选择数据的Select方法。树控件ID为TREE。
Void InTree()
{
Tree.Nodes.Clear();
TreeNode Root = New TreeNode();
Root.Text = "学院";
Root.Type = "0";
Tree.Node.Add(Root);
string strSql="SELECT * FROM CLASS";
DataTable dt = New DataTable();
dt = this.db.Select(strSql);
for(int i=0;i<dt.Rows.Count;i++)
{
TreeNode tmpnode = new TreeNode();
Root.Nodes.Add(tmpnode);
tmpnode.ID = dt.Rows[i][0].Tostring();
tmpnode.Text = dt.Rows[i][1].Tostring();
tmpnode.type = "1";
string strSql1 = "SELECT * FROM STUDENT";
DataTable dt1 = new DataTable();
dt1 = this.db.Select(strSql1);
for(int j = 0; j<dt1.Rows.Count;j++)
{
TreeNode tmpNd = New TreeNode();
tmpnode.Nodes.Add(tmpNd);
tmpNd.ID = dt1.Rows[i][0].Tostring();
tmpNd.Text = dt1.Rows[i][1].Tostring();
tmpNd.Type ="2";
}
}
}
(2)遍历树
一般是递归算法,网上的算法一般是酱紫的
public void GetAllNodeText(TreeNodeCollection tnc)
{
foreach (TreeNode node in tnc)
{
if( node.Nodes.Count != 0 )
GetAllNodeText(node.Nodes);
}
}
但是在做项目时我发现一个问题,用foreach循环,在对treeview节点的checkbox属性为
true多个节点进行遍历删除时,会出现枚举错误,所以我采用了for循环写法.
代码如下:
Void GetRoot()
{
TreeNode Root = TREE.GetNodeFromIndex("0");
DELET(Root);
}
Void DELEt(TeeNode node)
{
for(int i =0;i<node.Nodes.Count;i++)
{
TreeNode Tnode = new TreeNode();
Tnode = node.Nodes[i];
if(node.Checked == true)
{ Tnode.ReMove();
i--;
}
else
{
DELET(Tnode);
}
}
}
另外,网上在做删除操作时,总是先用TreeNode NdSel = (TreeNode)Tnode.Parent.得到父
节点,然后用NdSel.Remove(Tnode);实践证明,不需要如此.
今天线写道这里,因为写的时候没有.net编译器,程序可能有错,希望大家原谅,晚些时候再
补充一些.
时间匆忙,没写注释,晚些时候一起补上.
标 题: TreeView使用的一些心得
发信站: BBS 水木清华站 (Sun Sep 7 10:33:31 2003), 转信
(1)动态生成TreeView
假设数据库中有两个表,一个为班级表,有班号和班名两个属性,班号ccode为主键,一
个为学生表,有学号和姓名两个属性,学号scode为主键,根节点为学院。又假设在db类
中已经写好了从数据源中选择数据的Select方法。树控件ID为TREE。
Void InTree()
{
Tree.Nodes.Clear();
TreeNode Root = New TreeNode();
Root.Text = "学院";
Root.Type = "0";
Tree.Node.Add(Root);
string strSql="SELECT * FROM CLASS";
DataTable dt = New DataTable();
dt = this.db.Select(strSql);
for(int i=0;i<dt.Rows.Count;i++)
{
TreeNode tmpnode = new TreeNode();
Root.Nodes.Add(tmpnode);
tmpnode.ID = dt.Rows[i][0].Tostring();
tmpnode.Text = dt.Rows[i][1].Tostring();
tmpnode.type = "1";
string strSql1 = "SELECT * FROM STUDENT";
DataTable dt1 = new DataTable();
dt1 = this.db.Select(strSql1);
for(int j = 0; j<dt1.Rows.Count;j++)
{
TreeNode tmpNd = New TreeNode();
tmpnode.Nodes.Add(tmpNd);
tmpNd.ID = dt1.Rows[i][0].Tostring();
tmpNd.Text = dt1.Rows[i][1].Tostring();
tmpNd.Type ="2";
}
}
}
(2)遍历树
一般是递归算法,网上的算法一般是酱紫的
public void GetAllNodeText(TreeNodeCollection tnc)
{
foreach (TreeNode node in tnc)
{
if( node.Nodes.Count != 0 )
GetAllNodeText(node.Nodes);
}
}
但是在做项目时我发现一个问题,用foreach循环,在对treeview节点的checkbox属性为
true多个节点进行遍历删除时,会出现枚举错误,所以我采用了for循环写法.
代码如下:
Void GetRoot()
{
TreeNode Root = TREE.GetNodeFromIndex("0");
DELET(Root);
}
Void DELEt(TeeNode node)
{
for(int i =0;i<node.Nodes.Count;i++)
{
TreeNode Tnode = new TreeNode();
Tnode = node.Nodes[i];
if(node.Checked == true)
{ Tnode.ReMove();
i--;
}
else
{
DELET(Tnode);
}
}
}
另外,网上在做删除操作时,总是先用TreeNode NdSel = (TreeNode)Tnode.Parent.得到父
节点,然后用NdSel.Remove(Tnode);实践证明,不需要如此.
今天线写道这里,因为写的时候没有.net编译器,程序可能有错,希望大家原谅,晚些时候再
补充一些.
时间匆忙,没写注释,晚些时候一起补上.