[Решено] Обновление только одной строки в DBGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

[Решено] Обновление только одной строки в DBGrid

Сообщение Ism »

Привет
Задача появилась, обновить только одну строку в DBGrid , но чтоб визуально позиция курсора не изменилась.
last_id:=DataSet.FieldByName('id')
DataSet.Close
DataSet.Open
DataSet.Locate('id',last_id,[]);

не подходит, так как делает найденную строку первой в DBGrid , даже если она была пятой до закрытия

Пробовал в датасете делать тип поля Lookup, чтоб изменения сразу отображались (при изменении id показывалось содержимое из подтаблицы), но не заработало
Последний раз редактировалось Ism 15.06.2012 21:11:37, всего редактировалось 1 раз.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Код: Выделить всё

DataSet.Refresh

Обычно все уважающие себя компоненты доступа к данным содержат данный метод.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Здесь есть решение, но оно очень громоздко
http://www.sql.ru/forum/actualthread.aspx?tid=244793

Добавлено спустя 3 минуты 39 секунд:
DataSet.Refresh

Обновляет, но делает строку первой , визуально строка подскакивает в DBGrid
Работает , но неустойчиво

Есть ли способы правильно обновить данные только одной строки в DBGrid ?
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

А так вроде грид не дёргается?

Код: Выделить всё

var
  r: Integer;
begin
  with Dataset do
  begin
    r := RecNo;
    DisableControls;
    try
      Close;
      Open;
      RecNo := r;
    finally
      EnableControls;
    end;
  end;
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

Ism писал(а):Есть ли способы правильно обновить данные только одной строки в DBGrid ?

Вопрос некорректный. Корректный будет : "Как обновить только одну строку датасета."

Добавлено спустя 9 минут 5 секунд:
Ism писал(а):Обновляет, но делает строку первой , визуально строка подскакивает в DBGrid

У датасета не реализован RecNo?
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

У датасета не реализован RecNo

это ZeosDbo , да , есть
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Ism писал(а):Обновляет, но делает строку первой , визуально строка подскакивает в DBGrid

Какие компоненты доступа?
Если ZEOS - то попробуй ZQuery1.RefreshCurrentRow();
А вообще - такое поведение - это баг. Всё должно быть без перескоков.
Это самый правильный путь. Полное переоткрытие запроса - лишний трафик и черевато скрытыми багами...
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

RefreshCurrentRow не срабатывает
The refreshrow method is only supported with in update object
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Ну естественно - подложи компоненту UpdateSQL и напиши в ней запрос на обновление одной строки. И всё станет замечательно.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Да , действительно

ZUpdateSQL1.ModifySQL:='update new_table1 set id=:id, field_str=:field_str'

ZUpdateSQL1.RefreshSQL:='select id, field_str from new_table1 where id=:id'


Только нюанс, нужно делать

ZQuery1.RefreshCurrentRow(false);
DBGrid1.Refresh;
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Ism писал(а):Только нюанс, нужно делать


Вторая строка излишняя...
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Не совсем, без нее почемуто не отображалось полученное RefreshCurrentRow (после перескока на другую строку все появлялось) , наверное проблема в прорисовке в Lazarus DBGrid

Или zeos не вызывает перерисовку после получения строки
Ответить