2009年11月13日 星期五

在 SingleLineEdit 輸入時動態過濾 datawindow 中的資料

假設有個 Window :: w_main
裡面有兩個物件 SingleLineEdit :: sle_id 和 DataWindow :: dw_1
dw_1裡面有 兩個欄位 id 和 name

先對 sle_id 新增自訂事件: ue_keyup,event id請選 pbm_keyup 。
然後在 ue_keyup 中加入

String ls_id ,ls_filter

ls_id = This.Text
ls_filter = 'id like ~'' + ls_id + '%~''
dw_1.SetFilter(ls_filter)
dw_1.Filter()


這樣你就可以即時過濾 dw_1 裡面的資料了。

簡單吧?

說明:
SingleLineEdit本身只有對 text 欄位變更的事件反應,也就是 modified 事件,如果你需要對 keyboard 進行偵測,那有兩個事件適合使用 pbm_keydown、pbm_keyup,但不幸的是SingleLineEdit 找不到此事件,因此必須自訂增加。

鍵盤的按鍵 按下 、放開 對應的就是 pbm_keydown、pbm_keyup

至於為何不選 pbm_keydown 而使用 pbm_keyup 的原因在於 keyboard 觸發 keydown 時並未將字元放到 text 屬性中,因此你僅能從 keydown 事件的參數 key 中取得使用者按下的 key鈕,更不幸的是,該 key 參數使用的是 Enumerated 列舉無法直接轉字元,所以判斷寫起來會太複雜。
然而 keyup 事件則是在字元被寫入 text 屬性後觸發的事件,因此你可以輕易的從 SingleLineEdit 的 text 屬性中取得輸入的字串。

利用此字串你就可以製作過濾條件,然後就可以對 dw_1 進行過濾了。

1 個回應:

WILDOX 提到...

當然 pbm_enchang 也可以用,只是它偵測不到變更的按鍵,比較適用於文章內容發生的偵測(大量文字變更)。