2009-10-25 3 views
5

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

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

ответ

4

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

+0

Yup, похоже, что это работает. Спасибо! – Vlad

+1

Не могли бы вы дать нам пример кода? – truthseeker

-1
RecKey:=DmFRM.ViewTBL.RecNo; 
      with DmFRM.ViewTBL do 
       begin 
        Active:=false; 
        Active:=True; 
        RecNo:=RecKey; 
       end; 
+0

Я вижу, что у этого уже есть -1, поэтому я не буду добавлять свой. Причина -1 заключается в том, что не все потомки TDataSet реализуют RecNo полезными или в некоторых случаях вообще. Итак, это не полезно в качестве общего ответа на вопрос Op, я боюсь, – MartynA

+0

@MartynA: «GetBookmark использует защищенный метод для получения значения закладки. Потомки TDataSet реализуют этот метод, чтобы обеспечить поддержку своего типа в виде закладки . Однонаправленные наборы данных не поддерживают закладки, и поэтому не возвращают значимого значения ». –

+0

@Mahmood_M: Я не уверен, почему вы цитируете это мне. Однонаправленные наборы данных могут не поддерживать закладки, но по той же причине они не могут быть напрямую связаны с TDBGrid, а именно, что сетка зависит от того, какой набор данных является судоходным в обоих направлениях. Таким образом, чтобы использовать однонаправленный набор данных для TDBGrid, вам необходимо подключить сетку к TClientDataset и загрузить ее из однонаправленного. – MartynA

4

Этот ответ предназначен как незначительное дополнение к Мейсону, а не альтернатива. Я добавил его только потому, что появился другой ответ, предполагающий неправильное использование свойства 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; 
+0

Boomark работает как RecNo? или нет ? , например: если я получаю закладку, а затем удаляю некоторые записи перед выбранной записью, а затем я иду в закладку, теперь выбранная запись такая же, как и выбранная до удаления? , другими словами: Закладка хранит только RecNo или Позиция записи или хранит другую информацию о выбранной записи? –

+0

Я думаю, что это зависит от того, как закладки реализованы в конкретном descendanf или TDataset, но я был бы удивлен, если бы кто-то из них использовал только номер записи. Из тех немногих, кого я изучил, они обычно используют буфер, который содержит данные, специфичные для реализации. Если вы сомневаетесь в том, что данный тип набора данных реализует закладки, вызовите функцию BookmarkValid (см. OLH). – MartynA

+0

спасибо, я попробовал GetBookmark и GotoBookmark для удаленной записи: GetBookmark -> Удалить выбранный (закладок) Запись -> GotoBookmark, и у меня есть ошибка: «Запись не найдена», у меня есть таблица, которая должна обновляться каждую секунду, и я хочу чтобы пользователи прокручивали, в этой ситуации я думаю, что я должен использовать RecNo, я попробовал RecNo и отлично работал –

Смежные вопросы