发信人: edison()
整理人: edison(1999-10-20 16:23:01), 站内信件
|
PFC 中 u_tvs 是一个非常好的 treeview 使用它可以轻松的将数据库中的数据显示到
tree 中, 同时还省去很多工作, 但是里面却有好多 BUG, 现总结如下,
望各路 PFC 好手多多提意见!!!
1. help 中说 deletestyle 的默认值是 Discard_Rows ( 只从内存中删除数据 ), 而事
实上 Delete_Rows ( 同时从内存中与数据库中删除数据 )
2. 你不能使用一个数剧源注册两层数据源而采用不同的 labelcolumn 。这样做根本无 效。两层的 labelcolumn 最终都是层号较低的那一层注册的 labelcolumn 。这是
pfc_n_cst_tvsrv_levelsource 的 of_getlevel ( nds ads_obj ) 函数的 BUG 造成的。 要解决这个问题不是不可以只是比较麻烦。通常这种情况我们都可以想想其他办法从而避
免。函数 of_getlevel 的意思是确定 DS 对应的层号。而他判断一个 DS 是不是属于这 层是通过判断这个 DS 的 DataObject 是否与这层注册时一样,因此,显然如果你将两层
的数据源注册成一样,那肯定只能返回最低的那个层号。
3. pfc_n_cst_tvsrv_levelsource 的 Event pfc_undodelete 的第 59 行没有检查 数组上限
原始脚本: lds_undo = inv_attrib[li_undolevel].ids_obj
纠正如下: // 检查该层是否为递归层 if li_undolevel > UpperBound ( inv_attrib ) Then & li_undolevel = UpperBound ( inv_attrib ) // 该层为递归层 lds_undo = inv_attrib[li_undolevel].ids_obj
4. pfc_n_cst_tvsrv_levelsource 的 Event pfc_undodelete 的第 66 行
原始脚本。 // Compare the keys to see if we really have the right row ll_deleterowid = lds_undo.GetRowIDFromRow(ll_row, Delete!)
由于 GetRowIDFromRow 函数当 Filter 缓冲区中没有数据的时候,始终返回 -1 ,这是
PB 的一个 BUG。使得 ll_deleterowid 总是返回 -1,不能得到正确的结果。因此,改成 如下代码。 // 首先将数据暂时移到 Filter 缓冲区 li_rc = lds_undo.RowsMove ( ll_row, ll_row, Delete!, lds_undo, 1, Primary! ) // 获取被删除纪录的 ID ll_deleterowid = lds_undo.GetRowIDFromRow(1, Primary!) // 再将数据移回 Delete 缓冲区 li_rc = lds_undo.RowsMove ( 1, 1, Primary!, lds_undo, ll_row, Delete! )
5. pfc_n_cst_tvsrv_levelsource 的 Event pfc_undodelete 的第 78 行
原始代码,ll_undoafterhandle 会出现 <= 0 的情况, 即被删除的节点是父节点第一个 子节点。 //ll_newhandle = itv_requestor.InsertItem(ll_undoparenthandle, & ll_undoafterhandle, ltvi_undo)
// 修改如下: if ll_undoafterhandle <= 0 Then ll_newhandle = itv_requestor.insertItemFirst (ll_undoparenthandle, & ltvi_undo) Else ll_newhandle = itv_requestor.InsertItem(ll_undoparenthandle, & ll_undoafterhandle, ltvi_undo) End IF
6. pfc_n_cst_tvsrv_levelsource 的 function of_convertrow
aa_columnvalues[] 参数类型错了应该是 any 而不是 string!
7. pfc_n_cst_tvsrv_levelsource 的 function of_convertrow 在函数的最后几行里的如下这行代码:
ads_obj.object.data[al_row, li_cnt] = aa_columnvalues[li_cnt]
//由于 aa_columnvalues 可能会出现 null 或 "" 的情况,因此上面的代码就会出问题 // 现改为如下: If Not IsNull ( aa_columnvalues[li_cnt] ) Then If trim ( String ( aa_columnvalues[li_cnt] ) ) <> "" Then ads_obj.object.data[al_row, li_cnt] = aa_columnvalues[li_cnt] End If End If
可能其他的 object 里还有 BUG,我一下子忘了在哪,所以只能待续...
-- 谢谢没有在 "将本文章寄一份给原作者" 处打勾, 再次感谢!
※ 来源:.网易 BBS bbs.netease.com.[FROM: bbs.szptt.net.cn]
|
|