1.按照节点名称排序
2.文件夹必须排在文件前面
对于第一点,SortChildren默认是支持的。
对于第二点,SortChildrenCB似乎可以考虑。使用SortChildrenCB要求每个节点已被SetItemData绑定自己的HTREEITEM
而我的树的每个节点已经绑定了其他重要数据,不可修改。
那么如何实现自定义排序呢?
另外尝试过载insertItem的时候就设置hInsertAfter,然而还是不能很好的排列文件和文件夹。
希望各位前辈指教。。。
14 个解决方案
#1
先排序文件夹,再排序文件,用SortChildrenCB排序文件夹,再用SortChildren排序文件夹里的文件。
#2
重要的数据是数据结构吧?
自己再定义一个结构,包括原来你的重要数据,再加上一个节点类型,统一作为一个Data绑定到节点上,然后自己写响应的排序函数,首先判断节点类型。
自己再定义一个结构,包括原来你的重要数据,再加上一个节点类型,统一作为一个Data绑定到节点上,然后自己写响应的排序函数,首先判断节点类型。
#3
如果同一层不仅有文件还有文件夹,你这样的方法还是不能把文件夹排在文件前面
#4
用SetItemData标识一下文件夹和普通文件。
#5
哎。。。搞定了,是这样弄的,给大家分享下:
其中FindInsertAfterItem用于对文件夹的排序,确保排列在该层最前面即可
if(ff.IsDirectory())
{
// 简单的插入排序:文件夹排在文件前面
HTREEITEM itemAfter = FindInsertAfterItem(itemParent, enuNodeDirectory, strTitle);
// 创建文件节点
itemCur = m_poTreeControl->InsertItem(
uTreeNodeMask, strTitle,
enuIconDirectory, enuIconDirectory, GetStateImageIndex(SvnExcluded), TVIS_STATEIMAGEMASK, 0,
itemParent, itemAfter);
// 递归生成子节点
AddTreeNodeRecursive(strPath, itemCur);
}
else
{
itemCur = m_poTreeControl->InsertItem(
uTreeNodeMask, strFileName,
enuIconJob, enuIconJob, GetStateImageIndex(SvnExcluded), TVIS_STATEIMAGEMASK, 0,
itemParent, TVI_LAST);
}
其中FindInsertAfterItem用于对文件夹的排序,确保排列在该层最前面即可
#6
恭喜了!
#7
JF
#8
接分!
#9
多谢楼主分享、、、、、
#10
里面的文件夹 和 文件 分别缓存起来,
把缓存的文件夹和文件排序以后,再分别加进树控件里面
不缓存直接进树。
丢一个记录 第一个文件在什么地方的变量
看到目录,就插入排序丢进去
看到文件就 从记录的位置开始插入。
把缓存的文件夹和文件排序以后,再分别加进树控件里面
不缓存直接进树。
丢一个记录 第一个文件在什么地方的变量
看到目录,就插入排序丢进去
看到文件就 从记录的位置开始插入。
#11
学习咯·~~~
#12
楼主是强人!!~~BOSS L
#13
自己慢慢排序,并修改Tree的节点,这并不困难,只不过速度慢。
#14
#1
先排序文件夹,再排序文件,用SortChildrenCB排序文件夹,再用SortChildren排序文件夹里的文件。
#2
重要的数据是数据结构吧?
自己再定义一个结构,包括原来你的重要数据,再加上一个节点类型,统一作为一个Data绑定到节点上,然后自己写响应的排序函数,首先判断节点类型。
自己再定义一个结构,包括原来你的重要数据,再加上一个节点类型,统一作为一个Data绑定到节点上,然后自己写响应的排序函数,首先判断节点类型。
#3
如果同一层不仅有文件还有文件夹,你这样的方法还是不能把文件夹排在文件前面
#4
用SetItemData标识一下文件夹和普通文件。
#5
哎。。。搞定了,是这样弄的,给大家分享下:
其中FindInsertAfterItem用于对文件夹的排序,确保排列在该层最前面即可
if(ff.IsDirectory())
{
// 简单的插入排序:文件夹排在文件前面
HTREEITEM itemAfter = FindInsertAfterItem(itemParent, enuNodeDirectory, strTitle);
// 创建文件节点
itemCur = m_poTreeControl->InsertItem(
uTreeNodeMask, strTitle,
enuIconDirectory, enuIconDirectory, GetStateImageIndex(SvnExcluded), TVIS_STATEIMAGEMASK, 0,
itemParent, itemAfter);
// 递归生成子节点
AddTreeNodeRecursive(strPath, itemCur);
}
else
{
itemCur = m_poTreeControl->InsertItem(
uTreeNodeMask, strFileName,
enuIconJob, enuIconJob, GetStateImageIndex(SvnExcluded), TVIS_STATEIMAGEMASK, 0,
itemParent, TVI_LAST);
}
其中FindInsertAfterItem用于对文件夹的排序,确保排列在该层最前面即可
#6
恭喜了!
#7
JF
#8
接分!
#9
多谢楼主分享、、、、、
#10
里面的文件夹 和 文件 分别缓存起来,
把缓存的文件夹和文件排序以后,再分别加进树控件里面
不缓存直接进树。
丢一个记录 第一个文件在什么地方的变量
看到目录,就插入排序丢进去
看到文件就 从记录的位置开始插入。
把缓存的文件夹和文件排序以后,再分别加进树控件里面
不缓存直接进树。
丢一个记录 第一个文件在什么地方的变量
看到目录,就插入排序丢进去
看到文件就 从记录的位置开始插入。
#11
学习咯·~~~
#12
楼主是强人!!~~BOSS L
#13
自己慢慢排序,并修改Tree的节点,这并不困难,只不过速度慢。