treeview隐藏还原节点
先简单说下需求,就是两个treeview控件,一个左边一个右边,均支持移入移出功能,右边树的任意节点移动到左边树之后,再移动回来,必须跟初始位置保持一致且还原该节点及子节点移除时的状态,注意是移除时的状态,这个状态会变。简单看下效果吧,我录制了一张gif图片。
接着简单说下我这边的处理思路吧,其实在刚接到这个需求的时候,我还是比较淡定的,不慌,为啥呢?因为当时心里有两套方案。1.treeview节点的隐藏功能,这是最简单的,2.如果不支持隐藏,重绘它的节点实现隐藏功能。想的挺美好啊,真的小看treeview控件了。写起代码来,没一个省油的灯,第一种隐藏节点,它压根不支持,没这个属性,第二种就奇葩了,为啥奇葩呢?它有个属性叫drawmodel,可以指定绘制所有,我的理解是treeview节点的所有信息都可以随意绘制吧,可偏偏就是节点坐标不能指定,简单来说,它底层已经帮你计算好了每个节点在treeview里面的坐标位置,如果你改了,不但绘制显示有问题,还会出现张冠李戴的情况,完全错乱了,最后由于时间问题也就没纠结了,放弃了,个人猜测应该是可以通过windows消息处理这个问题。那咋办,工作还的做啊,其实还有一个简单的方案,dotnetbar里面的treeview支持节点隐藏,可惜我命苦啊,dotnetbar里面的控件只要加载到窗体上面,我的vs马上罢工,无响应。眼看捷径是没有了,终极解决办法,上必应搜啊,一圈搜下来毫无收获,那就硬着头皮写吧。
代码就不贴了,说下思路也算是给有需要的朋友一个参考吧,上图看到的效果其实不是隐藏,是先删除后添加操作。删除操作,具体逻辑是,右边treeview移除节点时,备份该节点及该节点的父节点,为啥要备份到它的父节点呢?一般情况下不应该就备份该节点就可以了吗?这里主要是完整性,也就是该节点的上下左右信息都有了,如果不备份到父节点,节点会丢失,注意不是把该节点父节点的所有子节点备份下来,其他兄弟节点只备份这一层数据,也可以直接在右边树初始化时,完整备份一份。还原操作,1.从备份信息里面检索该节点,其中会包含父节点,2.创建它的父节点(如果也被移除了),创建父节点是一个递归的过程,有这么一种情况,先删除它,再把它爷爷节点删了,在我先还原它时,它的爷爷节点也要在原始位置被创建出来,并且它爷爷节点下面只有一个父亲节点,父亲节点下面就只有它。3.还原该节点,这也有两种情况,可能它被其他还原创建了,不管它有没有被创建,它的子节点肯定是没有的,接着递归创建它的子节点(如果有)。
4.节点排序,通过移除时的备份节点排序,还原位置信息。当然真的实现起来还是有很多细节的,就到这吧。