如果 SELECT-SQL 命令在 Visual FoxPro 中重置游标,则基于游标的网格为空
本文可帮助你解决以下问题:如果 SELECT-SQL 命令重置 Visual FoxPro 中的游标,则基于游标的网格为空。
原始产品版本: Visual FoxPro
原始 KB 编号: 140653
症状
在 Microsoft Visual FoxPro 中 RecordSource
,如果网格的属性设置为游标,然后 SELECT-SQL 命令重置游标,则如果未将 RecordSource 属性设置回自身,则网格显示为空白。
如果运行 SELECT-SQL 重新生成游标,以下命令将正确刷新网格,但如果已自定义网格的列或标头属性,这些自定义更改将丢失,并且网格的列和标头属性将更改回其默认设置:
THISFORM.GRID1.RECORDSOURCE=THISFORM.GRID1.RECORDSOURCE
此类自定义可以是名称不同、列长度较长的标头,以及列或标题的事件中放置的代码。 有关详细信息,请参阅 Microsoft 知识库中的以下文章: 131836 PRB:网格未刷新 显示查询中的游标
原因
使用 SELECT-SQL 命令重新生成网格所基于的游标时,必须先销毁原始游标,然后才能创建新游标。 发生这种情况时,也会清除网格列和标题,然后重新创建。 RecordSource
即使网格的 属性设置为自身,网格的列和标题的自定义设置也会丢失。
解决方案
若要在不丢失列和标题的自定义属性的情况下刷新网格,请将 属性 RecordSource
设置为已使用与网格所基于的游标相同的字段创建的虚拟游标。 运行 SELECT-SQL 后,将 RecordSource
属性更改回重新生成的游标。 这允许在重新生成游标时,列和标头的属性保持不变。
状态
此行为是设计使然。
有关重现行为的步骤的详细信息
打开位于 \Vfp\Samples\Data 目录中的 Customer.dbf 表,然后创建名为 GridForm 的窗体。
将以下代码放在窗体的 Load 事件中:
SELECT cust_id, city, country FROM customer INTO CURSOR Temp1 SELECT cust_id, city, country FROM customer WHERE country = "" ; INTO CURSOR Temp2
将以下代码放在窗体的 Destroy 事件中:
SELECT Temp1 USE SELECT Temp2 USE
在窗体上放置网格,并为网格提供以下属性设置:
ColumnCount=3 RecordSourceType=Alias RecordSource=Temp1
更改 grid1 的描述文字。Column1.header1 到客户 ID,Column1 Width 属性设置为 100。
向窗体添加文本框。
添加命令按钮,并将以下代码置于其 Click 事件中:
THISFORM.GRID1.RECORDSOURCE = "Temp2" SELECT cust_id, city, country FROM customer ; WHERE country = Thisform.text1.value ; INTO CURSOR Temp1 THISFORM.GRID1.RECORDSOURCE = "Temp1"
运行窗体。 在文本框中键入“西班牙”,然后单击命令按钮。 网格应显示国家/地区字段等于西班牙的所有记录。 列 1 的标题名称保持不变,并且列的宽度不会更改。 通过将网格的 RecordSource 更改为名为 Temp2 的游标,在重新生成 Temp1 游标时不会重置列和标题的属性。
将命令按钮的 Click 事件中的两
THISFORM.GRID1.RECORDSOURCE
行更改为注释,并将以下内容添加为最后一行代码:THISFORM.GRID1.RECORDSOURCE = THISFORM.GRID1.RECORDSOURCE
运行窗体后,在文本框中键入国家/地区名称,然后单击命令按钮,请注意,列名称会更改,并且宽度较小。