关于treeview问题,大家帮忙

shoutor 2007-02-25 05:04:20
我把某一目录的文件夹/文件绑定到treeview控件上,如下(已经实现),我同时设置了tv_Directory的CheckBoxes为true
:
/// <summary>
/// 填充数型目录
/// </summary>
private void FillTree(string sCurPath)
{
DirectoryInfo directory;

tv_Directory.Nodes.Clear();
try
{
directory = new DirectoryInfo(sCurPath);

if (directory.Exists == true )
{
TreeNode newNode = new TreeNode(directory.FullName);
tv_Directory.Nodes.Add(newNode);
FileList(newNode, directory);
}
else
{
MessageBox.Show("您要浏览的目录不存在,请重新选择目录!");
}
}
catch( Exception ex)
{
MessageBox.Show(ex.Message);
}
}

/// <summary>
/// 将文件目录或文件加到treeview的节点上
/// </summary>
private void FileList(TreeNode node, DirectoryInfo d)
{
//获取所有文件夹
foreach(DirectoryInfo di in d.GetDirectories())
{
TreeNode tn_folder = new TreeNode ();
tn_folder.Text = di.Name;
tn_folder.Tag = di.FullName;
tn_folder.ImageIndex = 0;
node.Nodes.Add(tn_folder);
FileList(tn_folder, di);
}
//获取目录中所有文件
foreach(FileInfo f in d.GetFiles())
{
TreeNode tn_files = new TreeNode ();
tn_files.Text = f.Name;
tn_files.Tag = f.FullName;
tn_files.ImageIndex = 2;
node.Nodes.Add(tn_files);
}
}


我想实现,当我选择文件旁边的复选框时,能打印出选择的文件夹/文件完整路径,下面是代码,这个代码不能正长运行,当我选择跟目录时,能显示跟目录的完整路径,但是其他的不能显示,这是什么原因,请各位帮助!

foreach(TreeNode node in tv_Directory.Nodes)
{
if(node.Checked)
{
MessageBox.Show(node.Tag.ToString());
}
}
...全文
302 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
vrhero 2007-02-26
  • 打赏
  • 举报
回复
应该考虑对性能的优化,递归文件夹对于大数量级的文件系统不是个好idea
比如只在 AfterExpand 事件中获取当前文件夹就可以提高性能,如果再缓存已读取的文件列表只在用户发出刷新指令时才重读取文件列表会大幅改善性能
Windows 资源管理器就是最好的例子
heartdevil 2007-02-26
  • 打赏
  • 举报
回复
mark
shoutor 2007-02-26
  • 打赏
  • 举报
回复
感谢wdy9927() 提醒,已经OK,还真是需要递归,foreach仅遍历根接点

public static void GetCheckedNode(TreeNodeCollection tnc)
{
foreach(TreeNode node in tnc)
{
if(node.Checked)
{
MessageBox.Show(node.Tag.ToString());
}
GetCheckedNode(node.Nodes);
}
}
lovvver 2007-02-26
  • 打赏
  • 举报
回复
你做的都没有问题,就是在判断folder或file是否被选中时,判断的不全。
lovvver 2007-02-26
  • 打赏
  • 举报
回复
foreach(TreeNode node in tv_Directory.Nodes)
{
if(node.Checked)
{
MessageBox.Show(node.Tag.ToString());
}
}
->
//invoke
foreach(TreeNode node in tv_Directory.Nodes)
{
ShowNode(node);
}

private void ShowNode(TreeNode tn)
{
foreach(TreeNode node in tn.Nodes)
{
if(node.Checked)
{
MessageBox.Show(node.Tag.ToString());
}
ShowNode(node);
}
}
shoutor 2007-02-26
  • 打赏
  • 举报
回复
to time_is_life(今夜太冷:http://time-is-life.cnblogs.com)
我把FullName赋给Tag,主要是想在选中时获得文件的全路径,没有什么其他的东西;
---------
to wmhnq()
我是想选择完毕后,再通过一个事件一次行的写入配置文件;
---------
to zswang(伴水清清)(专家门诊清洁工)
你说的不是问题的主要,我在AfterCheck事件中已经做了判断.
---------
to wdy9927() ( )
你说还比较有道理,试试看
王集鹄 2007-02-25
  • 打赏
  • 举报
回复
父点打勾,子节点并不会自动钩上
先确认子节点的Checked是true
wdy9927 2007-02-25
  • 打赏
  • 举报
回复
foreach(TreeNode node in tv_Directory.Nodes)

你的foreach只遍历了根节点,子节点没有遍历。

如果非要你这么做的话,需要递归遍历子节点
wmhnq 2007-02-25
  • 打赏
  • 举报
回复
private void tv_Directory_AfterCheck(object sender, TreeViewEventArgs e)
{
MessageBox.Show(e.Node.Tag.ToString());
}
弄到这个事件去不就好了吗,或者你要把所有选择的打印的话,当选择的时候就把他存到一个TABLE去,然后在统一打印北。
time_is_life 2007-02-25
  • 打赏
  • 举报
回复
TreeNode newNode = new TreeNode(directory.FullName);
这里的FullName是赋给Text的,怎么会在tag处显示出来,这其中必有猫腻
shoutor 2007-02-25
  • 打赏
  • 举报
回复
别沉下去啊

110,538

社区成员

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

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

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