Поиск текущей строки в Delphi TDBGrid

Есть ли способ узнать, какая строка является текущей в TDBGrid?


person BubbaT    schedule 23.03.2009    source источник
comment
Я думаю, вам нужно немного пояснить свой вопрос, вы имеете в виду строку в запросе или строку в DBGrid?   -  person Toby Allen    schedule 24.03.2009


Ответы (3)


Я не уверен, понимаю ли я ваш вопрос, но я попытаюсь ответить, и, возможно, вы сможете уточнить, если это не то, о чем вы спрашиваете.

Поскольку TDBGrid привязан к источнику данных, текущая строка совпадает с текущей строкой в ​​источнике данных. Вы можете запросить DataSource либо по значению первичного ключа, либо по свойству RecNo, чтобы определить, какая запись является текущей.

person Kluge    schedule 23.03.2009

Вы можете сделать это следующим образом:

1 — Определите локальный класс, который является копией TDBGrid (это позволит вам получить доступ к закрытым методам):

type
  THackDBGrid = class(TDBGrid);

2 - Затем вы можете привести свой локально определенный класс и извлечь из частных методов, как в:

function TfrmMain.GetFieldValue(colnum : integer): string;
begin
  Result := THackDBGrid(grdMain).GetFieldValue(colnum);
end;

Или, чтобы получить строку #:

function CurrentRowNumber: integer;
  Result := THackDBGrid(grdMain).Row;
end;

Этот метод полезен и в других ситуациях, но я не могу претендовать на это. Я взял это отсюда.

person JosephStyons    schedule 23.03.2009
comment
Это отличный способ обойти правило иметь все в одном файле для доступа к личным элементам из классов-предков. - person Joseph Poirier; 23.03.2020

Если вы не хотите, чтобы источник данных предоставлял количество записей и текущую запись (например, потому что вы используете однонаправленный курсор на удаленном сервере), тогда метод доступа к свойствам базового элемента управления сеткой может использоваться.

См. этот ответ на аналогичный вопрос StackOverflow.

person mghie    schedule 23.03.2009
comment
Вы начали говорить правильную вещь, но указанная вами ссылка показывает только как получить количество записей, а самое главное (RecNo или Row или CurrentRow и т.д.) нельзя получить напрямую из сетки. Прости - person Carlos B. Feitoza Filho; 02.03.2013
comment
@Carlos: Что мешает тебе написать Row := TDummyGrid(MyDBGrid).Row вместо RowCount := TDummyGrid(MyDBGrid).RowCount? Знаешь, нужно немного подумать... - person mghie; 03.03.2013
comment
Ну... Я хочу показать альтернативные цвета в моей сетке, но свойство ROW не сохраняется между изменениями курсора, т. е. если вы перемещаете курсор вверх или вниз по сетке, изменяя выделение, свойство ROW изменяется для ВСЕ видимые строки одновременно. Мне нужен способ идентифицировать каждую строку отдельно, независимо от текущей выбранной строки. Теперь я использую RecNo связанного набора данных, но для однонаправленных наборов данных это свойство бесполезно. Как видите, ТРЕБУЕТСЯ ЧУТЬ-ЧУТЬ ДУМАТЬ, но ВЫ были ленивы. Прости... - person Carlos B. Feitoza Filho; 06.03.2013
comment
@Carlos: Вы демонстрируете непонимание поведения сетки, вот и все. Альтернативные цвета можно просто реализовать с помощью параметров события сетки, которые включают строку и столбец ячейки, которую нужно закрасить. Это не имеет ничего общего с текущей строкой или столбцом. Проголосовать за ответ, потому что он не соответствует вашей собственной проблеме (которая отличается от исходного вопроса), просто великолепно. - person mghie; 06.03.2013