对CTreeCtrl数据加载方式的改进,实现代码的重用

    我在MFC的程序中通过CTreeCtrlEx显示数据库中的数据,为了简化操作,开始只加载一个节点hRoot,然后在新添加的节点中增加一个虚节点,则在hRoot展开时,判断是否有虚节点,如果有虚节点,则自动删除虚节点,并且动态计算hRoot的子节点所需要的Sql语句,然后根据这个Sql语句,从数据库中读取所有子节点的数据,添加到hRoot下面,并且,每个新的子节点hChild下自动添加一个虚节点,等到将来展开这个hChild时自动计算hChild下属子节点sql,并且从数据库中加载。
    这种方式很好,效率很高。最近遇到一个问题,哪就是我们希望些一个WEB版的程序,在网页上显示一个TreeCtrl,使用相同的算法从数据库中加载数据到树中。由于MFC中已经实现了从数据库中加载数据的功能,那么,如何重用MFC程序中的代码?
    实际上,在MFC的CTreeCtrlEx显示数据时,每次总是通过一个自动计算的sql语句从数据库中得到一个子节点的列表,然后将这个列表添加到具有虚节点的hItem中,因此我只需要在CTreeCtrlEx中增加一个静态函数:
    CMdcDataTable * GetNodeChildDataTable(CNodeInfo * pNodeInfo)
    然后由网页中的WebTreeCtrl提供pNodeInfo的信息,并且调用GetNodeChildDataTable函数即可得到WebTreeCtrl中某个节点的下属子节点列表。
    这样,我只需要将CTreeCtrlEx封装在DLL中即可。但是由于CTreeCtrlEx是一个MFC类,因此,网页无法直接调用,网页是用.NET开发的,为此,我必须将CTreeCtrlEx中的GetNodeChildDataTable函数通过C ++ .NET封装一次,则.NET可以直接调用了。当然是在服务端调用。
    现在的CTreeCtrlEx中的所有数据加载的操作都与控件本身有关,在加载子节点的过程中不断的扫描CTreeCtrlEx上的有关节点,以读取当前节点的有关信息,而GetNodeChildDataTable函数的参数就是pNodeInfo,因此,GetNodeChildDataTable函数在从数据库中加载数据时不再依赖CTreeCtrlEx本身,也就是说GetNodeChildDataTable()通过pNodeInfo参数和CMdcDataTable *隔离了数据的访问与数据的显示之间的紧密耦合,使得GetNodeChildDataTable()函数可以在网页中被重用。
    将GetNodeChildDataTable(CNodeInfo * pNodeInfo)设置为静态函数的目的时调用该函数时可以不创建CTreeCtrlEx实例。实际上这个函数完全可以从CTreeCtrlEx中独立出来。因为它本身与CTreeCtrlEx一点关系都没有。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值