如何让treeview重新加载后保持原样

qqhahazxxqq 2008-11-13 11:01:04
数据库结构:
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);
}


可这代码说得不够详细呀,不知道具体放到哪个位置。
...全文
387 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
smr163 2011-03-31
  • 打赏
  • 举报
回复
guan zhu
qqhahazxxqq 2008-11-14
  • 打赏
  • 举报
回复
又沉了 我晕 再顶上去求高手
toomee 2008-11-14
  • 打赏
  • 举报
回复
treeview里有个path,是不是你需要的?或者你可以保存节点的node到参数,然后selectednode=younode;不就可以定位到你刚才选择的吗?
qqhahazxxqq 2008-11-14
  • 打赏
  • 举报
回复
这么昨天的帖子今天都还没有答案 高手都到哪去了?今天再顶下,再等等结贴去
criedshy 2008-11-14
  • 打赏
  • 举报
回复
根据传来的记录ID再用递归遍历的话,速度会很慢的

这个问题我也没有解决,因为太慢了,客户肯定接受不了

给你代码参考一个:

 #region 根据传来的ID和层次,展开到指定的节点
/// <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
criedshy 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dahai99007 的回复:]
引用楼主 qqhahazxxqq 的帖子:
数据库结构:
id pid beizhu
1 0 aaa
2 1 aaa1
3 1 aaa2
4 2 aaa1-1
5 4 aaa1-1-1


部分代码如下(实现了递归加载好树)

C# code
#region 实现添加节点的方法
public void addnodes()//添加树的根节点
{
ds = this.DBAdataset();//获取数据库的数据
if (ds.Tables[0].Rows.Count > 0)
{
TreeN…
[/Quote]

他的是保持原样
浮生若梦丶 2008-11-13
  • 打赏
  • 举报
回复
up
dahai99007 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qqhahazxxqq 的回复:]
问题就在这里了 我不知道把这断代码放哪个位置呀 具体放到哪个事件里能详细说一下么? 谢谢
[/Quote]
页面上放一提交按钮,根据ID和PID插入添加的节点到数据库后然后重新加载树
在你提交后写入数据库,然后查询重新加载树的后边啊!
qqhahazxxqq 2008-11-13
  • 打赏
  • 举报
回复
问题就在这里了 我不知道把这断代码放哪个位置呀 具体放到哪个事件里能详细说一下么? 谢谢
dahai99007 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qqhahazxxqq 的回复:]
我要的不是全部展开 比如根节点下又两个支节点 两个支节点下都有叶节点 我操作第一个支节点是展开了它 没有动第二个支节点 现在添加成功过后 重新加载后第二个支节不能是展开 只有我上次展开的节点才展开
[/Quote]
//用来存储选中节点
TreeNode ChecedkNode=new TreeNode();
//当前选中节点传给它
CheckedNode=treeView1.SelectedNode;
//递归函数遍历所有节点,找出并选中,展开

foreach (TreeNode node in 该Node的上级.Nodes)
{
if(node.Text==CheckedNode.Text)
{
this.treeView1.SelectedNode = node;
treeView1.SelectedNode.Expand();
}
test(node);
}

你贴出来的这段代码就可以实现了啊,先把你点击的node记下来,提交后在这个node上级node里边循环找,找到text相同的就把node赋给treeview1.SelectedNode,然后展开这个Node。
qqhahazxxqq 2008-11-13
  • 打赏
  • 举报
回复
高手快出现啊 帖子快沉了
qqhahazxxqq 2008-11-13
  • 打赏
  • 举报
回复
我要的不是全部展开 比如根节点下又两个支节点 两个支节点下都有叶节点 我操作第一个支节点是展开了它 没有动第二个支节点 现在添加成功过后 重新加载后第二个支节不能是展开 只有我上次展开的节点才展开
xsunday888 2008-11-13
  • 打赏
  • 举报
回复
放入根节点下就可以了

public void addnodes()//添加树的根节点
dahai99007 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 qqhahazxxqq 的帖子:]
数据库结构:
id pid beizhu
1 0 aaa
2 1 aaa1
3 1 aaa2
4 2 aaa1-1
5 4 aaa1-1-1



部分代码如下(实现了递归加载好树)

C# code
#region 实现添加节点的方法
public void addnodes()//添加树的根节点
{
ds = this.DBAdataset();//获取数据库的数据
if (ds.Tables[0].Rows.Count > 0)
{
TreeNode n = null;
for (in…
[/Quote]
重新加载的时候:
treeView1.ExpandAll();
这样不就全部展开了吗?
dahai99007 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 qqhahazxxqq 的帖子:]
数据库结构:
id pid beizhu
1 0 aaa
2 1 aaa1
3 1 aaa2
4 2 aaa1-1
5 4 aaa1-1-1



部分代码如下(实现了递归加载好树)

C# code
#region 实现添加节点的方法
public void addnodes()//添加树的根节点
{
ds = this.DBAdataset();//获取数据库的数据
if (ds.Tables[0].Rows.Count > 0)
{
TreeNode n = null;
for (in…
[/Quote]
重新加载的时候:
treeView1.ExpandAll();
这样不就全部展开了吗?
rbpgold 2008-11-13
  • 打赏
  • 举报
回复
你试试吧treeview 放在updatepanel里,
然后把treeview添加到updatepanel的PostBackTrigger属性里。
qqhahazxxqq 2008-11-13
  • 打赏
  • 举报
回复
来人啊 先把上边的代码放一边 谁能给点详细的代码呀?
qqhahazxxqq 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dahai99007 的回复:]
引用 8 楼 qqhahazxxqq 的回复:
问题就在这里了 我不知道把这断代码放哪个位置呀 具体放到哪个事件里能详细说一下么? 谢谢

页面上放一提交按钮,根据ID和PID插入添加的节点到数据库后然后重新加载树
在你提交后写入数据库,然后查询重新加载树的后边啊!
[/Quote]
我试过 不行啊 foreach (TreeNode node in 该Node的上级.Nodes)
的。nodes点不出来

//用来存储选中节点
TreeNode ChecedkNode=new TreeNode();这句的位置也是个问题 定义成全局也要报错

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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