如果 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 属性更改回重新生成的游标。 这允许在重新生成游标时,列和标头的属性保持不变。

状态

此行为是设计使然。

有关重现行为的步骤的详细信息

  1. 打开位于 \Vfp\Samples\Data 目录中的 Customer.dbf 表,然后创建名为 GridForm 的窗体。

  2. 将以下代码放在窗体的 Load 事件中:

     SELECT cust_id, city, country FROM customer INTO CURSOR Temp1
     SELECT cust_id, city, country FROM customer WHERE country = "" ;
     INTO CURSOR Temp2
    
  3. 将以下代码放在窗体的 Destroy 事件中:

     SELECT Temp1
     USE
     SELECT Temp2
     USE
    
  4. 在窗体上放置网格,并为网格提供以下属性设置:

     ColumnCount=3
     RecordSourceType=Alias
     RecordSource=Temp1
    
  5. 更改 grid1 的描述文字。Column1.header1 到客户 ID,Column1 Width 属性设置为 100。

  6. 向窗体添加文本框。

  7. 添加命令按钮,并将以下代码置于其 Click 事件中:

     THISFORM.GRID1.RECORDSOURCE = "Temp2"
     SELECT cust_id, city, country FROM customer ;
     WHERE country = Thisform.text1.value ;
     INTO CURSOR Temp1
     THISFORM.GRID1.RECORDSOURCE = "Temp1"
    
  8. 运行窗体。 在文本框中键入“西班牙”,然后单击命令按钮。 网格应显示国家/地区字段等于西班牙的所有记录。 列 1 的标题名称保持不变,并且列的宽度不会更改。 通过将网格的 RecordSource 更改为名为 Temp2 的游标,在重新生成 Temp1 游标时不会重置列和标题的属性。

  9. 将命令按钮的 Click 事件中的两 THISFORM.GRID1.RECORDSOURCE 行更改为注释,并将以下内容添加为最后一行代码:

     THISFORM.GRID1.RECORDSOURCE = THISFORM.GRID1.RECORDSOURCE
    

运行窗体后,在文本框中键入国家/地区名称,然后单击命令按钮,请注意,列名称会更改,并且宽度较小。