この記事では、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 コマンドによってカーソルがリセットされると空白になる」を参照してください。
動作を再現する手順
フォームを作成した後、
\VFP\SAMPLES\DATA
ディレクトリ内の CUSTOMER.DBF テーブルをデータ環境に追加します。フォームの Load イベントに次のコードを配置します。
CREATE CURSOR Compdisp (company c(40),city c(15),country c(15))
フォームの Destroy イベントに次のコードを配置します。
SELECT Compdisp USE
フォームにグリッドを作成し、グリッドに次のプロパティ設定を指定します。
ColumnCount=3 RecordSourceType=Alias RecordSource=Compdisp
フォームにテキスト ボックスを追加します。
Click
イベントに次のコードを含むコマンド ボタンを追加します。SELECT company,city,country; FROM customer; WHERE customer.country=thisform.text1.value; INTO CURSOR Compdisp THISFORM.GRID1.REFRESH
フォームを実行します。 テキスト ボックスに「 フランス 」と入力し、コマンド ボタンをクリックします。 グリッドには、
Customer.Country="France"
するすべてのレコードが表示されますが、表示されません。 グリッドが空白です。THISFROM.GRID1.REFRESH
グリッドを更新していないようです。 これは、フォームの読み込みイベントでカーソルが作成されていない場合でも発生します。
グリッドにデータが正しく表示されるようにするには、コマンド ボタンの Click
イベントの最後のコード行として次のコマンドを配置します。
ThisForm.Grid1.RecordSource =ThisForm.Grid1.RecordSource