本文可帮助你解决以下问题:如果 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 问题:网格未刷新,无法显示查询的游标。
原因
使用 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 的宽度属性设置为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
运行窗体后,在文本框中键入国家/地区名称,然后单击命令按钮,请注意列名更改,宽度较小。