在 Visual FoxPro 中运行时更新光标时,刷新的网格不会显示任何数据

本文提供了以下问题的解决方法:即使使用 ThisForm.Refresh 或 ThisForm.GridName.Refresh 命令,将 RecordSource 属性设置为游标的网格也不会使用数据刷新。

原始产品版本: 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 中重置游标,则基于游标的网格为空

重现行为的步骤

  1. 创建窗体,然后添加 CUSTOMER。) 到数据环境的目录中的 DBF 表 \VFP\SAMPLES\DATA (。

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

    CREATE CURSOR Compdisp (company c(40),city c(15),country c(15))
    
  3. 将以下代码放在窗体的 Destroy 事件中:

    SELECT Compdisp
    USE
    
  4. 在窗体上创建网格,并为网格提供以下属性设置:

    ColumnCount=3
    RecordSourceType=Alias
    RecordSource=Compdisp
    
  5. 向窗体添加文本框。

  6. 在其事件中添加包含以下代码的 Click 命令按钮:

    SELECT company,city,country;
    FROM customer;
    WHERE customer.country=thisform.text1.value;
    INTO CURSOR Compdisp
    THISFORM.GRID1.REFRESH
    
  7. 运行窗体。 在文本框中键入 France ,然后单击命令按钮。 网格应显示 的所有记录, Customer.Country="France"但不会。 网格为空。 THISFROM.GRID1.REFRESH 似乎不会更新网格。 即使未在窗体的 Load 事件中创建光标,也会发生这种情况。

若要让网格正确显示数据,请将以下命令作为命令按钮事件的最后一行代码 Click

ThisForm.Grid1.RecordSource =ThisForm.Grid1.RecordSource