徹底了解combobox和listbox的『脾氣』!
07-25
徹底了解combobox和listbox的『脾氣』! 許多朋友對這兩個控制項好象不太能掌握,我把我在使用中得出的一些經驗貼出來 1)為什麼在combobox中是空白,一定要用滑鼠下拉點擊後才能顯示某個數據?為什麼在listbox初始的時候,焦點移動到list卻沒有任何item被選中?答:這兩個問題其實是同一個問題,請關注controlsource這個屬性,就能解決了。 controlsource決定了它綁定的數據的變數或屬性,通常請將controlsource="this.comment"。首先你一定已經定義了rowsource和rowsourcetype. 假設數據源是個表(employee), 數據源列為name。那麼請在comment屬性中填寫:=employee.name 假設數據源是個數組(employee()), 而你要在初始的時候顯示(或選中)employee(1)中的值。那麼請在comment屬性中填寫:=employee(1)這樣定義後,你可以發現,不用用滑鼠選擇,combobox/listbox就會有一個值被選中了。而且你也不用新建屬性來定義當前值了。在接下來的時候.value永遠等於.comment中的值。另外你不用去管displayvalue這個屬性。使用controlsource來定向控制源還有一個好處,假如你要在這張表中查詢一條記錄(如name="John"),通常的做法是: select employee locate all for name="John" thisform.list1.refresh 其實不必,只要: thisform.list1.comment="John" thisform.list1.refresh 就可以了。 combo/list的value只受controlsource定向的變數/屬性所控制 2)有一張表作為combobox/listbox的數據源,為什麼我刪除了當前行後,用refresh沒有用,那條記錄仍然在?答:這個問題也很普遍。這其實是一個『何時用refersh,何時用requery』的問題。如果已經增加,或刪除,或數據源已經完全更新(比如視圖已經用requery()更新了),也就是說記錄的數量被改變了的話,應該用 requery屬性。比如上述這個問題(假設數據源表為goods), 如果是: del in goods thisform.list1.refresh 那麼當前選中的那條,仍然沒有反應,而下面一條卻沒有了(你的SET DELE ON)。然後你會發現如果隨便上下按一下,就會正常的。這是因為這個時候,你的controlsource所定向的變數/屬性仍然是被你刪除的那條記錄的值,而且當前記錄仍然是被刪除的那條記錄。如果改進為 del in goods skip -1 thisform.list1.refresh 真正的值已經發生變化了,但當前顯示的值卻還是原來的那個,原因與上述一樣。最致命的是顯示與用戶實際看到的不符,會造成操作失誤。 而且還有一個問題,如果當前記錄號已經bof()=.T.了呢?這個時候再用SKIP -1,程序就會出錯了。問題又衍生出來了,這個時候就要先判斷是否到了BOF(),甚至還要判斷表是否已經空了.... (注意:上述描述,在控制項內和控制項外的表象是有些不一樣的。比如用一個command.click來執行上述代碼,和在list.dbclick來執行,效果是不一樣的。這是因為list.dbclick執行後,list能獲得焦點,而command.click後不能使list獲得焦點。)如果這個時候改為: dele in goods thisform.list1.requery 那麼一切問題都解決了,這個時候如果你測試controlsource所定向的變數/屬性的話,也使是正確的。而且你不用為了檢測是否表到了頭,是否空表而發愁了。在下列情況下無須用requery方法:只修改了記錄內容;只是在表內移動記錄號。 3)學會使用Boundcolumn屬性。通常它應該指向的是具有唯一性的那一列(在預設的情況下是1)。如果它指向的那一列中有重複值的記錄,那麼在用requery的時候,requery事件會將記錄定在那些有重複值的記錄中的最前面那個記錄。比如下面這個情況如果boundcolumn= 1;當前記錄在第2個tube上,執行requery後: goods code ----- ---- flask 1 tube 2 <---它會將記錄定在此記錄上 pipette 3 funnel 4 tube 5 這個時候應該boundcolumn=2;由於第2列的code是唯一的,因此,記錄還是在5上面。 以上這些我都是假設數據源為表,其實也都適合與任何數據源的。看完這些後,大家自己用combo/list做一些不同情況下的試驗,注意觀察<當前記錄/.value值/controlsource所定向的變數/控制項中的值> 之間的關係,相信以後不會再為這2個控制項煩惱了。
推薦閱讀:
推薦閱讀: