C# 根据树形结构创建多级文件夹的问题

gsli 2010-04-01 03:34:19
页面有个树形控件ASPXListTree,可以无限级的添加,也就是可以多层,还有个按钮。我想在按钮的Click事件中实现如下功能:
先选择树形结构的某行,比如我点击第一层“资产部”,点击按钮就生成资产部这个文件夹,我点击第二层“设备科”就在资产部下面生成设备科的文件夹.........无限级的。
那么在代码里应该怎样写呢?用遍历吗,还是有别的办法,现在没什么思路,请大家帮忙,谢谢!
...全文
468 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
vssvss 2010-04-02
  • 打赏
  • 举报
回复
我说下我的方法:
1.数据库的读取,还是建议一次性读取完比较好, 如果每次只读取一部分的话 后面很有可能会频繁连接数据库,这在设计上是不合理的。当然用递归读取树形的数据库效率是相当低的,你用多线程也不会很快。我曾经用的方法就是 在数据里面增加一个字段 这个字段就是路径字段 如:宇宙《银河系《太阳系《地球《中国《。。。。 这样你搜索的是就按照这个这段来搜,相当的快 如你要找地球下面的所有的:select * from tablename where path like '宇宙《银河系《太阳系《地球%'. 这里有参考
2.对于生成treeview问题 这里我建议不要一次生成完 这样数据量大的时候很容易造成界面假死的现象。我的思路是 最开始只显示节点下面的一层,当点击某个节点的时候在显示此节点的下一层。这样速度也很快,也不至于有死机的问题。
参考代码:

#region TreeView AfterSelect Event.
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
this.getCon();
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.showInfo(name); // Show the selected node's information.
this.odcConnection.Close();// Close the data connection.
}

最后附上我的联系方式, 以后有机会大家一起探讨一下
QQ:287072382
MSN:tbeck-zhang@hotmail.com
gsli 2010-04-02
  • 打赏
  • 举报
回复
怎么样再往上找呢,直到找到根节点,不能一个一个找吧,有什么办法?
gsli 2010-04-02
  • 打赏
  • 举报
回复
我现在能把父ID直接取出来了,然后怎么办呢
gsli 2010-04-02
  • 打赏
  • 举报
回复
是从数据库中读出来的,那怎么用sql查出来呢?谢谢指教
luxi0194 2010-04-02
  • 打赏
  • 举报
回复
如果你的TreeView的数据源是从数据库中读出来的话,那么理论上你只要知道了上级节点,那么路径就能用sql查出来,不用遍历整个树。。。。
gsli 2010-04-02
  • 打赏
  • 举报
回复
自己顶,高手们帮帮忙吧
gsli 2010-04-01
  • 打赏
  • 举报
回复
还有别的办法吗,要是有能直接绑定数据源的就好了,o(∩_∩)o...
2楼和4楼的办法我似懂非懂
lyonyf 2010-04-01
  • 打赏
  • 举报
回复
private void GetDirectoryPath(TreeViewNode node, ref string path)
{
if (node == null)
return;

if (path == null)
path = string.Empty;

path = node.Text + Path.DirectorySeparatorChar + path;
if (node.Parent != null)
GetDirectoryPath(node.Parent, ref path);
}

调用:
string path = string.Empty;
GetDirectoryPath(treeView.SelectedNode, ref path);
gsli 2010-04-01
  • 打赏
  • 举报
回复
呵呵
好像有点思路,那要是无限级的怎么找
wonsoft 2010-04-01
  • 打赏
  • 举报
回复
好像有一种可以直接绑定数据库的方案,不过我没有用过。你可以看看你所用的TreeView,有没有设置数据源的项目。
only_lonely 2010-04-01
  • 打赏
  • 举报
回复
你都已经把解决方案说出来了

用一个树嘛,

资产部门(路径 zc)
设备科(路径 sb)

在点击设备科的时候,往上寻找,直至根节点,然后依次把路径加起来就行了 sc+"\"+sb

p.s. 这里的sb没有任何其他意思...表误会. ..

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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