前言:这是我没有什么经验的情况下用TreeView控件,不足之处请谅解
一:从数据库里读取数据,添加到TreeView里,数据库的设计是这样的
ID ParentID Name
自增值(是唯一的) 上级的ID号(与ID相关) 用于在TreeView显示的名称
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{InitRootTree(this.TreeView1.Nodes);}
}
private void InitRootTree(TreeNodeCollection TNC)
{
DataView dataView=new DataView();//实例化个视图
//ds是DataSet,已经从数据库里读取所有的数据了
dataView=ds.Tables[0].Copy().DefaultView;//将ds填充到视图里
//ParentID是上级节点,由于第一个节点是没有上级节点的,所以我在数据库里把他的上级节点设置为0
dataView.RowFilter = "ParentID = '0'";//读取数据库里ParentID为0的行
foreach(DataRowView drv in dataView)
{
TreeNode tn=new TreeNode();
tn.ID=drv["ID"].ToString();
tn.Text=drv["Name"].ToString();
TNC.Add(tn);//添加节点
//添加子节点
InitChildNodeTree(tn.Nodes,tn.ID);
}
ds=null;
}
private void InitChildNodeTree(TreeNodeCollection TNC,string ParentId)
{
DataView dataView=new DataView();
dataView=ds.Tables[0].Copy().DefaultView;
dataView.RowFilter="ParentID=" + ParentId + "";
foreach(DataRowView drv in dataView)
{
TreeNode tn=new TreeNode();
tn.ID=drv["ID"].ToString();
tn.Text=drv["Name"].ToString();
TNC.Add(tn);
//递归
InitChildNodeTree(tn.Nodes,tn.ID);
}
}
二:添加节点
//获得选中节点对应的ID号
string NodesID = TreeView1.GetNodeFromIndex(TreeView1.SelectedNodeIndex).ID;
//把得到的ID号做为上级节点的ID号,然后执行一个简单的插入操作.
string insert = "Insert Into 表名(ParentID,Name)Values(NodesID,新节点)";
SqlCommand sqlcmd = new SqlCommand(insert,sqlcon);
sqlcmd.ExecuteNonQuery();
TreeView1.Nodes.Clear();//清空所有的TreeView节点
InitRootTree(this.TreeView1.Nodes);//调用InitRootTree方法重新加栽所有数据
三:删除节点
方法和添加节点方法基本相同,这里就不重复写了.
提示:在用户删除节点时应先判断用户所选中的节点是否有子节点,如果有就应该个用户相应的提示
1:提示用户先把该节点下的子节点先删除
2:提示后,把用户所选中的节点下的所有子节点都删除(需要用递归法)
最后记得调用以下方法,否则显示时可能会出错
TreeView1.Nodes.Clear();//清空所有的TreeView节点
InitRootTree(this.TreeView1.Nodes);//调用InitRootTree方法重新加栽所有数据
四:保持选中节点展开状态
//str是用户所选中的节点,TreeView1.SelectedNodeIndex这样获得
private void openNodes(string str)
{
string src = null;
string len = str.Replace(".",null);
for(int i = 0; i < len.Length; i++)
{
if(i == 0)
{
src = str.Substring(0,1);
}
else
{
src = src + str.Substring(src.Length,2);
}
TreeView1.GetNodeFromIndex(src).Expanded = true;
}
}
由于比较简单就没有每一行都加注释了...如果每一行都注释反而觉得罗嗦,而且让大家自己看看、多想想会记得更牢.所谓一样精,百样通
好了就先说到这里,希望大家多多支持,有不懂的地方或者有更好的建议就提出来,大家一起研究研究,一起学习一起进步...