Выберите строку после обновления DBGrid

Ну и какой-то n00b вопрос от меня. Я порылся в сети и подобные вопросы здесь, но не нашел правильных ответов для такой простой (как я думал) проблемы.

У меня есть DBGrid. Я выбираю одну строку и делаю какие-то действия с другими данными, связанными с этой строкой. После того, как я закончил, моя DBGrid обновляется, и выбранная строка сбрасывается на первую. Я хочу, чтобы была выбрана та же строка, которая была выбрана до обновления данных DBGrid. Какие-либо предложения?


person Vlad    schedule 25.10.2009    source источник


Ответы (3)


Перед обновлением сохраните текущую выборку связанного набора данных в качестве закладки, а затем восстановите закладку.

person Mason Wheeler    schedule 25.10.2009

Этот ответ задуман как незначительное дополнение к ответу Мейсона, а не как альтернатива. Я добавил его только потому, что появился другой ответ, ошибочно предлагающий использование свойства RecNo набора данных. Не все потомки TDataSet надежно или вообще реализуют RecNo. Некоторые потомки просто возвращают постоянное значение, например. 0 для RecNo текущей строки и ничего не делать, когда вы присваиваете ему значение.

procedure TMyForm.DoSomethingWithDataSet(ADataSet : TDataSet);
var
  Bookmark : TBookmark;
begin
  Bookmark := ADataSet.GetBookmark; // Save your place in ADataSet

  try
    Screen.Cursor := crSqlWait;  // Show the user that something is happening
    Update;  // update the form to make sure screen cursor updates
    ADataSet.DisableControls;
    // do something with ADataSet here  e.g.
    ADataSet.First;
    while not ADataSet.Eof do begin
      // do something with current row here, then
      ADataSet.Next;
    end;
  finally
    ADataSet.GotoBookmark(Bookmark);  // Return to where you were at outset
    ADataSet.FreeBookmark(Bookmark);
    ADataSet.EnableControls;
    Screen.Cursor := crDefault;  // Let the user see you're done
  end;
end;
person MartynA    schedule 27.07.2014
comment
Boomark работает как RecNo? или нет ? , например: если я получаю закладку, затем удаляю некоторые записи перед выбранной записью, а затем я перехожу к закладке, теперь выбранная запись такая же, как и выбранная перед удалением? , другими словами: закладка хранит только RecNo или Position записи или хранит другую информацию о выбранной записи? - person G3ntle_Man; 02.10.2015
comment
Я думаю, это зависит от того, как закладки реализованы в конкретном потомке или наборе данных TDataset, но я был бы удивлен, если бы какой-либо из обычных закладок использовал просто номер записи. Из тех немногих, которые я рассматривал, они обычно используют буфер, который содержит данные, специфичные для реализации. Если вы сомневаетесь, реализует ли данный тип набора данных закладки, вызовите функцию BookmarkValid (см. OLH). - person MartynA; 03.10.2015
comment
спасибо, я попробовал GetBookmark и GotoBookmark для удаленной записи: GetBookmark -> Удалить выбранную (закладку) запись -> GotoBookmark, и я получил ошибку: запись не найдена, у меня есть таблица, которая должна обновляться каждую секунду, и я хочу сохранить пользователей прокрутка, в этой ситуации я думаю, что мне следует использовать RecNo, я попробовал RecNo и отлично работает - person G3ntle_Man; 04.10.2015

person    schedule
comment
Я вижу, что у этого уже есть -1, поэтому я не буду добавлять свой. Причина для -1, вероятно, заключается в том, что не все потомки TDataSet реализуют RecNo с пользой или в некоторых случаях вообще. Так что, боюсь, это бесполезно в качестве общего ответа на вопрос Опа, - person MartynA; 27.07.2014
comment
@MartynA: GetBookmark использует защищенный метод для получения значения закладки. Потомки TDataSet реализуют этот метод, чтобы обеспечить собственный тип поддержки закладок. Однонаправленные наборы данных не поддерживают закладки и поэтому не возвращают значимого значения. - person G3ntle_Man; 02.10.2015
comment
@Mahmood_M: Я не понимаю, почему ты мне это цитируешь. Однонаправленные наборы данных могут не поддерживать закладки, но по той же причине, по которой они не могут быть подключены напрямую к TDBGrid, а именно потому, что сетка основана на навигации по набору данных в обоих направлениях. Таким образом, чтобы использовать однонаправленный набор данных для TDBGrid, вы должны подключить сетку к TClientDataset и загрузить его из однонаправленного. - person MartynA; 02.10.2015