次の方法で共有


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 コマンドを使用して更新しても、グリッドにデータは表示されません。

原因

SQL Select ステートメントを、グリッドの RecordSource プロパティで指定されたのと同じカーソルに実行する場合は、新しいカーソルを作成する前に元のカーソルを破棄する必要があります。 この場合、グリッド列と RecordSource もクリアされ、再作成されます。 グリッドのレコード ソースが新しいカーソルに設定され、グリッドによって列が自動的に作成されます。 新しいグリッドは一から作動し始めています。 そのため、カーソルからデータを読み込むことはありません。

解決方法

このような状況でグリッドを更新するには、次の例のように、グリッドの RecordSource プロパティをそれ自体に設定します。

thisform.grid1.recordsource=thisform.grid1.recordsource

状態

この動作は仕様によるものです。

詳細

詳細については、「カーソルベースのグリッドは、Visual FoxPro で SELECT-SQL コマンドによってカーソルがリセットされると空白になる」を参照してください。

動作を再現する手順

  1. フォームを作成した後、\VFP\SAMPLES\DATA ディレクトリ内の CUSTOMER.DBF テーブルをデータ環境に追加します。

  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. フォームを実行します。 テキスト ボックスに「 フランス 」と入力し、コマンド ボタンをクリックします。 グリッドには、 Customer.Country="France"するすべてのレコードが表示されますが、表示されません。 グリッドが空白です。 THISFROM.GRID1.REFRESH グリッドを更新していないようです。 これは、フォームの読み込みイベントでカーソルが作成されていない場合でも発生します。

グリッドにデータが正しく表示されるようにするには、コマンド ボタンの Click イベントの最後のコード行として次のコマンドを配置します。

ThisForm.Grid1.RecordSource =ThisForm.Grid1.RecordSource