這篇文章提供了解決方案,針對具有將 RecordSource 屬性設置為游標的網格,即使使用 ThisForm.Refresh 或 ThisForm.GridName.Refresh 命令,數據也不會刷新的問題。
原始產品版本: Visual FoxPro
原始 KB 編號: 131836
癥狀
在 Visual FoxPro 中,如果將網格的 RecordSource
屬性設定為游標,然後在執行時使用 SQL Select Into Cursor CursorName
命令更新該游標,即使使用 ThisForm.Refresh
或 ThisForm.GridName.Refresh
命令刷新,網格也不會顯示任何數據。
原因
當您在網格的RecordSource
屬性中執行 SQL Select 語句到相同的遊標時,必須先銷毀原始遊標才能創建新的遊標。 發生這種情況時,也會清除方格欄位和 RecordSource
,然後重新建立。 網格的記錄來源設置為新游標,網格會自動創建欄位。 全新的系統從頭開始運作。 因此,它不會從游標載入數據。
解析度
在這種情況下,要刷新網格,將網格的 RecordSource
屬性設置為自身,如這個例子所示:
thisform.grid1.recordsource=thisform.grid1.recordsource
地位
這種行為是設計使然。
更多資訊
如需詳細資訊,請參閱 如果 SELECT-SQL 命令在 Visual FoxPro 中重設游標,則以游標為基礎的網格將為空白。
重現此行為的步驟
創建一個表單,然後將 CUSTOMER.DBF 資料表(位於
\VFP\SAMPLES\DATA
目錄中)新增至資料環境。將以下代碼放在表單的載入事件中:
CREATE CURSOR Compdisp (company c(40),city c(15),country c(15))
將以下程式碼放入表單的銷毀事件中:
SELECT Compdisp USE
在表單上建立一個網格,並為該網格設置以下屬性。
ColumnCount=3 RecordSourceType=Alias RecordSource=Compdisp
將文字框新增至表單。
在其
Click
事件中添加一個帶有以下代碼的命令按鈕:SELECT company,city,country; FROM customer; WHERE customer.country=thisform.text1.value; INTO CURSOR Compdisp THISFORM.GRID1.REFRESH
執行表單。 在文字框中輸入法國,然後點擊命令按鈕。 網格應顯示所有符合
Customer.Country="France"
的記錄,但它沒有。 網格是空的。THISFROM.GRID1.REFRESH
似乎没有更新网格。 即使在「表單」的載入事件中未建立游標,也會發生此情況。
為了讓網格正確顯示數據,請將以下命令放在命令按鈕Click
事件的程式碼的最後一行。
ThisForm.Grid1.RecordSource =ThisForm.Grid1.RecordSource