数据库结构:
id pid beizhu
1 0 aaa
2 1 aaa1
3 1 aaa2
4 2 aaa1-1
5 4 aaa1-1-1 部分代码如下(实现了递归加载好树) #region 实现添加节点的方法
public void addnodes()//添加树的根节点
{
ds = this.DBAdataset();//获取数据库的数据
if (ds.Tables[0].Rows.Count > 0)
{
TreeNode n = null;
for (int i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
{
//string[] pic = (string[])arr[i];
if (ds.Tables[0].Rows[i][1].ToString().Equals("0"))//当上级id是0为根节点
{ n = new TreeNode();
n.Text = ds.Tables[0].Rows[i][2].ToString();
treeView1.Nodes.Add(n);
n.Value = ds.Tables[0].Rows[i][0].ToString();//存储当前节点ID
n.ShowCheckBox = true;
//n.Checked = aTreeNode.DefaultStatus;
n.Expanded = n.Checked;
//n.Tag = pic[0];
//n.ImageIndex = 0;
//n.SelectedImageIndex = 0;
this.addnode1(n); //添加子节点
}
}
}
}
public void addnode1(TreeNode N)//添加树的所有子节点
{
TreeNode n = null;
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
if (N.Value.Equals(ds.Tables[0].Rows[i][1].ToString()))
{
n = new TreeNode();
n.Text = ds.Tables[0].Rows[i][2].ToString();
N.ChildNodes.Add(n);
n.Value = ds.Tables[0].Rows[i][0].ToString();//存储当前节点ID
n.ShowCheckBox = true;
//n.Checked = aTreeNode.DefaultStatus;
n.Expanded = n.Checked;
this.addnode1(n);
} }
}
#endregion 我单击树节点的时候获得了树的ID和PID,页面上放一提交按钮,根据ID和PID插入添加的节点到数据库后然后重新加载树,都没有问题,唯一不爽的就是树会回到初始状态,需要从新点击“+”才能看见,我现在想让树重新加载后保持原来的展开样子(当然新加的节点一定要显示出来)因为我的TREEVIEW控件是放在UpdatePanel里的,所以页面上不会看出刷新效果,请各位大虾给点详细代码,谢谢。
基本原来我在网上看见了是这样
1、把当前树中选中节点记录下来
2、重新加载树后,遍历所有节点,找到记录下来的节点
3、找到后,设为选中,展开节点即可。
代码如下//用来存储选中节点
TreeNode ChecedkNode=new TreeNode();//当前选中节点传给它
CheckedNode=treeView1.SelectedNode;//递归函数遍历所有节点,找出并选中,展开
void test(TreeNode node1)
{
foreach (TreeNode node in node1.Nodes)
{
if(node.Text==CheckedNode.Text)
{
this.treeView1.SelectedNode = node;
treeView1.SelectedNode.Expand();
}
test(node);
}
}//调用刚才递归并传参,保证所有节点被遍历
foreach (TreeNode node in this.treeView1.Nodes)
{
test(node);
}
可这代码说得不够详细呀,不知道具体放到哪个位置。
id pid beizhu
1 0 aaa
2 1 aaa1
3 1 aaa2
4 2 aaa1-1
5 4 aaa1-1-1 部分代码如下(实现了递归加载好树) #region 实现添加节点的方法
public void addnodes()//添加树的根节点
{
ds = this.DBAdataset();//获取数据库的数据
if (ds.Tables[0].Rows.Count > 0)
{
TreeNode n = null;
for (int i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
{
//string[] pic = (string[])arr[i];
if (ds.Tables[0].Rows[i][1].ToString().Equals("0"))//当上级id是0为根节点
{ n = new TreeNode();
n.Text = ds.Tables[0].Rows[i][2].ToString();
treeView1.Nodes.Add(n);
n.Value = ds.Tables[0].Rows[i][0].ToString();//存储当前节点ID
n.ShowCheckBox = true;
//n.Checked = aTreeNode.DefaultStatus;
n.Expanded = n.Checked;
//n.Tag = pic[0];
//n.ImageIndex = 0;
//n.SelectedImageIndex = 0;
this.addnode1(n); //添加子节点
}
}
}
}
public void addnode1(TreeNode N)//添加树的所有子节点
{
TreeNode n = null;
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
if (N.Value.Equals(ds.Tables[0].Rows[i][1].ToString()))
{
n = new TreeNode();
n.Text = ds.Tables[0].Rows[i][2].ToString();
N.ChildNodes.Add(n);
n.Value = ds.Tables[0].Rows[i][0].ToString();//存储当前节点ID
n.ShowCheckBox = true;
//n.Checked = aTreeNode.DefaultStatus;
n.Expanded = n.Checked;
this.addnode1(n);
} }
}
#endregion 我单击树节点的时候获得了树的ID和PID,页面上放一提交按钮,根据ID和PID插入添加的节点到数据库后然后重新加载树,都没有问题,唯一不爽的就是树会回到初始状态,需要从新点击“+”才能看见,我现在想让树重新加载后保持原来的展开样子(当然新加的节点一定要显示出来)因为我的TREEVIEW控件是放在UpdatePanel里的,所以页面上不会看出刷新效果,请各位大虾给点详细代码,谢谢。
基本原来我在网上看见了是这样
1、把当前树中选中节点记录下来
2、重新加载树后,遍历所有节点,找到记录下来的节点
3、找到后,设为选中,展开节点即可。
代码如下//用来存储选中节点
TreeNode ChecedkNode=new TreeNode();//当前选中节点传给它
CheckedNode=treeView1.SelectedNode;//递归函数遍历所有节点,找出并选中,展开
void test(TreeNode node1)
{
foreach (TreeNode node in node1.Nodes)
{
if(node.Text==CheckedNode.Text)
{
this.treeView1.SelectedNode = node;
treeView1.SelectedNode.Expand();
}
test(node);
}
}//调用刚才递归并传参,保证所有节点被遍历
foreach (TreeNode node in this.treeView1.Nodes)
{
test(node);
}
可这代码说得不够详细呀,不知道具体放到哪个位置。
然后把treeview添加到updatepanel的PostBackTrigger属性里。
treeView1.ExpandAll();这样不就全部展开了吗?
treeView1.ExpandAll();这样不就全部展开了吗?
TreeNode ChecedkNode=new TreeNode();
//当前选中节点传给它
CheckedNode=treeView1.SelectedNode;
//递归函数遍历所有节点,找出并选中,展开 [align=left] foreach (TreeNode node in 该Node的上级.Nodes)
{
if(node.Text==CheckedNode.Text)
{
this.treeView1.SelectedNode = node;
treeView1.SelectedNode.Expand();
}
test(node);
} [/align]
你贴出来的这段代码就可以实现了啊,先把你点击的node记下来,提交后在这个node上级node里边循环找,找到text相同的就把node赋给treeview1.SelectedNode,然后展开这个Node。
在你提交后写入数据库,然后查询重新加载树的后边啊!
的。nodes点不出来//用来存储选中节点
TreeNode ChecedkNode=new TreeNode();这句的位置也是个问题 定义成全局也要报错
/// <summary>
/// 根据传来的ID和层次,展开到指定的节点
/// Author:liuqj
/// DATE:2008-5-12
/// </summary>
/// <param name="tnc">节点集合</param>
/// <param name="id">节点的value</param>
/// <param name="depth">节点的深度</param>
private void FondNode(TreeNodeCollection tnc, string id, int depth)
{
foreach (TreeNode tn in tnc)
{
if (tn.Value == id && tn.Depth == depth - 1)
{
tn.Select();
//this.ExpandNode(tn);
ExpandNode(tn);
break;
}
else
this.FondNode(tn.ChildNodes, id, depth);
}
}
/// <summary>
/// 将选择的节点的所有父节点展开
/// </summary>
/// <param name="tn"></param>
private void ExpandNode(TreeNode tn)
{
while (tn.Parent is TreeNode) //将选择的节点的所有父节点展开
{
tn.Parent.Expanded = true;
tn = tn.Parent;
}
}
#endregion