如何改进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一点关系都没有。
本文地址:http://www.45fan.com/bcdm/73236.html