TreeView控件與數據窗結合控件原理
2024-07-21 02:09:14
供稿:網友
國內最大的酷站演示中心!
在某系統的實現中,遇到了物料清單的編輯及顯示問題,要求能夠按照樹形結構顯示某產品的詳細構成情況。例如,產品分為幾個大總成,各總成下有若干裝置、部件,各部件下可能有小總成、部件、零件等等,這樣就可能形成一棵很復雜的樹結構。
而且要求能夠進行復雜的查找,過濾等操作,因此與數據窗的查找(find)及過濾(filter)、排序(sort)等結合起來是非常理想的控件構建方式。在pb中,通過樹與數據窗一起運行,是可以滿足這樣要求的。甚至可以做成通用的控件用來滿足所有的樹結構類型的數據的編輯。
以下講述主要實現原理:
1、數據窗中,包含用來處理成樹節(jié)點treeviewitem的各個列,如 代碼、名稱、父代碼、層次、排序、其他等等;
?。病?chuàng)建數據窗時,在sql語法中建立一個計算列(偽列):item_handle,用來存放該行數據對應的樹句柄;
3、從標準treeview繼承,建立userobject,取名:pfc_treeview,對該控件建立如下函數:
·uf_init_tree(as_data_store,as_id_col,as_name_col,as_parent_col,as_level_col,as_sort_string) // datastore同步
·uf_init_tree(as_data_window,as_id_col,as_name_col,as_parent_col,as_level_col,as_sort_string) // 數據窗同步
·uf_find_id(string as_id_value) return long //按照id進行查找(實際上在數據窗中查找并返回item_handle值);
·uf_find_name(string as_name_value) return long //按照 name_column 來查找;
·uf_get_all_handle(ref al_handles[]) return long//返回所有的句柄;
·uf_get_current_handle() return long //返回當前句柄;
·uf_get_current_item() return treeviewitem //返回當前節(jié)點;
·uf_get_current_id() // 返回當前 節(jié)點的id值
·uf_get_current_name() // 返回當前節(jié)點的 label 值
·uf_get_current_data() // 返回當前節(jié)點的 data 值,any類型,可以擴充為 structure以存放其它數據
·uf_get_child_handle(ref al_child_handle[]) //返回當前節(jié)點的所有子節(jié)點句柄
·uf_get_parent_handle(ref al_parent_handle[]) //返回當前節(jié)點的父節(jié)點句柄,一直到最頂層;
·……
·uf_update_item(al_handle) //更新節(jié)點;
·uf_insert_item(al_parent_handle,atvi_item) //增加節(jié)點
4、在應用中,將這個控件直接放入窗口中,然后調用 uf_init_tree()函數來初始化;
?。?、如果是常用的樹,則將初始化函數在 pfc_treeview的construct事件中寫入,這樣就可以直接用了。
?。?、對數據窗的的修改,需要更新樹的變化
?。?、在樹的 endlabeledit事件中,更新數窗信息;
8、如果支持拖放,則dragdrop,dragenter,dragwithing,dragleave等事件都需要處理;
9、……
關于這個控件,可以寫的函數非常多,甚至可以完成數據窗的所有功能,這樣,對于經常使用treeview的應用而言,就可以極大地簡化代碼復雜性,界面一致,高效。