如果选择-SQL 命令在 Visual FoxPro 中重置光标,则基于游标的网格是空的。

如果选择-SQL 命令在 Visual FoxPro 中重置了光标,本文将帮助您解决基于游标的网格为空的问题。

原始产品版本:   Visual FoxPro
原始 KB 数:   140653

症状

在 Microsoft Visual FoxPro 中,如果 RecordSource 将网格的属性设置为游标,然后选择-SQL 命令重置光标,如果 RecordSource 属性未设置回其自身,则网格显示为空白。

如果运行 SELECT-SQL 以重建游标,下面的命令将正确刷新网格,但如果自定义了网格的列或标题属性,则这些自定义更改将丢失,并且网格的 column 和 header 属性将更改回其默认设置:

 THISFORM.GRID1.RECORDSOURCE=THISFORM.GRID1.RECORDSOURCE

此类自定义可以是标头不同的标头、列长度较长的标头以及列或标题事件中的代码。 有关详细信息,请参阅 Microsoft 知识库中的以下文章: 131836 PRB:不刷新显示查询中的游标的网格

原因

当您使用 SELECT-SQL 命令重新生成网格时,必须先销毁原始游标,然后才能创建新游标。 发生这种情况时,也会清除网格列和标题,然后再重新创建它们。 即使将 RecordSource 网格的属性重新设置为其自身,网格的列和标题的自定义设置也会丢失。

解决方案

若要刷新网格,而不丢失列和标题的自定义属性,请将该 RecordSource 属性设置为已创建的虚拟游标,该游标已创建时使用的字段与网格所基于的游标相同。 在选择-SQL 运行后,将属性更改 RecordSource 回重建的游标。 这样,在重新生成游标时,列和标题的属性就可以保持不变。

状态

此行为是设计使然。

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

  1. 打开位于 \Vfp\Samples\Data 目录中的 "Customer" 表,创建名为 "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. 将以下代码放在表单的销毁事件中:

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

     ColumnCount=3
     RecordSourceType=Alias
     RecordSource=Temp1
    
  5. 更改 grid1 的标题。Column1 header1 to Customer 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的标题名称保持不变,并且该列的宽度不变。 通过将网格的记录源更改为 "Temp2",在重建 Temp1 游标时,不会重置列和标题的属性。

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

     THISFORM.GRID1.RECORDSOURCE = THISFORM.GRID1.RECORDSOURCE
    

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