Сетка на основе курсора пуста, если команда SELECT-SQL сбрасывает курсор в Visual FoxPro

Эта статья поможет устранить проблему, из-за которой сетка на основе курсоров пуста, если команда SELECT-SQL сбрасывает курсор в Visual FoxPro.

Исходная версия продукта: Visual FoxPro
Исходный номер базы знаний: 140653

Симптомы

В Microsoft Visual FoxPro, если RecordSource для свойства сетки задано значение курсора, а затем команда SELECT-SQL сбрасывает курсор, сетка появляется пустой, если свойство RecordSource не задано для себя.

Следующая команда будет правильно обновлять сетку, если для перестроения курсора выполняется SELECT-SQL, но если свойства столбца или заголовка сетки настроены, эти настраиваемые изменения будут потеряны, а свойства столбца и заголовка сетки будут изменены обратно на их параметры по умолчанию:

 THISFORM.GRID1.RECORDSOURCE=THISFORM.GRID1.RECORDSOURCE

Такая настройка может быть заголовками с разными именами, большей длиной столбцов и кодом, размещенным в событиях столбцов или заголовков. Дополнительные сведения см. в следующей статье базы знаний Майкрософт: 131836 PRB: таблица не обновляет отображение при применении курсора из запроса.

Причина

При перестроении курсора, основанного на сетке с помощью команды SELECT-SQL, исходный курсор должен быть уничтожен до создания нового курсора. В этом случае столбцы и заголовки сетки также очищаются, а затем повторно создаются. Даже когда свойство RecordSource сетки возвращается в исходное состояние, пользовательские настройки столбцов и заголовков сетки теряются.

Решение

Чтобы обновить сетку без потери настраиваемых свойств столбцов и заголовков, установите свойство RecordSource на фиктивный курсор, который уже создан с теми же полями, что и курсор, на котором основана сетка. После выполнения SELECT-SQL измените свойство RecordSource обратно на восстановленный курсор. Это позволяет свойствам столбцов и заголовков оставаться неизменными при перестроении курсора.

Состояние

Такое поведение предусмотрено программой.

Дополнительные сведения о шагах по воспроизведению поведения

  1. Откройте таблицу Customer.dbf, расположенную в каталоге \Vfp\Samples\Data, и создайте форму с именем GridForm.

  2. Поместите следующий код в событие загрузки формы:

     SELECT cust_id, city, country FROM customer INTO CURSOR Temp1
     SELECT cust_id, city, country FROM customer WHERE country = "" ;
     INTO CURSOR Temp2
    
  3. Поместите следующий код в событие формы Destroy:

     SELECT Temp1
     USE
     SELECT Temp2
     USE
    
  4. Поместите сетку в форму и присвойте сетке следующие параметры свойств:

     ColumnCount=3
     RecordSourceType=Alias
     RecordSource=Temp1
    
  5. Измените заголовок grid1.Column1.header1 на "Идентификатор клиента" и установите свойство ширины Column1 равным 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
    

После запуска формы введите имя страны в текстовом поле и нажмите кнопку команды, обратите внимание, что имя столбца изменяется и ширина меньше.