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

本文提供了这样一种问题的解决方案:在使用 ThisForm 或 ThisForm 命令时,将 RecordSource 属性设置为游标的网格不会刷新数据,即使您使用的是 "" 或 "GridName" 命令也是如此。

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

症状

在 Visual FoxPro 中,如果 RecordSource 将网格的属性设置为游标,然后在运行时使用命令更新光标 SQL Select Into Cursor CursorName ,则网格不会显示任何数据,即使您使用 ThisForm.Refresh 命令或命令刷新它也不会显示任何数据 ThisForm.GridName.Refresh

原因

当您执行 SQL Select 语句到在网格的属性中指定的同一游标时 RecordSource ,必须先销毁原始游标,然后才能创建新游标。 发生这种情况时,网格列和的列 RecordSource 也将被清除,然后重新创建。 将网格的记录源设置为新游标,网格将自动创建列。 新的网格从零开始工作。 因此,它不会从游标中加载数据。

解决方案

若要在这种情况下刷新网格,请将 RecordSource 网格的属性设置为其自身,如下例所示:

thisform.grid1.recordsource=thisform.grid1.recordsource

状态

此行为是设计使然。

更多信息

有关详细信息,请参阅 如果选择-SQL 命令在 Visual FoxPro 中重置光标,则基于游标的网格是空的。

再现行为的步骤

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

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

    CREATE CURSOR Compdisp (company c(40),city c(15),country c(15))
    
  3. 将以下代码放在表单的销毁事件中:

    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. 运行窗体。 在文本框中键入 华北 ,然后单击命令按钮。 网格应显示所有记录 Customer.Country="France" ,但不显示。 网格为空。 THISFROM.GRID1.REFRESH 似乎不更新网格。 即使在窗体的 Load 事件中不创建游标,也会发生这种情况。

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

ThisForm.Grid1.RecordSource =ThisForm.Grid1.RecordSource