Форум: "Базы";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
ВнизВыделение в DBGrid Найти похожие ветки
← →
Belkova (2003-05-05 21:23) [0]Мастера delphi! Подскажите, как реализовать выделение нескольких строк в DBGrid? Заранее благодарна.
← →
-=Guest=- (2003-05-05 21:31) [1]TDBGrid.Options.dgMultiSelect := True
Выделенные записи добавляются Bookmark набора данных.
← →
MsGuns (2003-05-05 22:01) [2]Это метод не годится, если надо помечать записи не подряд и без промежуточных кликов в гриде. Для этого случая надо использовать некоторое неотображаемое в гриде поле для записи в него признака отметки и с помощью события грида OnDrawColumnCell окрашивать такие строки (записи которых содержат признак выбрано) в спец.цвет или рисовать иконку (чекбокс) в колонке, специально для этого добавленной.
← →
-=Guest=- (2003-05-05 22:06) [3]Есть удобный грид в EhLib. Возможно выделение строк не подряд, а также выделение ячеек, например в середине грида. Хорошая вещь.
← →
NAlexey (2003-05-06 09:08) [4]Я пользуюсь методом описанным на сайте "Королевство Делфи" и довольно успешно:
1) Необходимо иметь в наборе данных уникальное поле, типа RecNo или RecID по которому можно однозначно идентифицировать строку. Если такого поля нет, необходимо создать его искусственно, т.е добавить в набор даннх вычисляемое поле, и наOnCalcFields
повесить приблизительно такое:
procedure ADOQuery1CalcFields(DataSet: TDataSet);
begin
if DataSet.RecNo <= 0 then
DataSet.FieldByName("CLC").AsInteger := 1
else
DataSet.FieldByName("CLC").AsInteger := DataSet.RecNo;
end;
Теперь поле CLC в наборе данных будет уникальным.
2) В public объявляешьListSelect: TList;
3) В FormCreate(или в секции initialization) -ListSelect := TList.Create;
В FormDestroy(или в секции finalization) -ListSelect.Free;
4)На OnClick по сетке вешаешь примерно такое:
procedure TForm1.DBGrid1Click(Sender: TObject);
var
AValue: integer;
Grid: TDBGrid;
begin
Grid := Sender as TDBGrid;
with ListSelect do
begin
AValue := Grid.DataSource.DataSet.FieldByName("CLC").AsInteger;
if IndexOf(Pointer(AValue)) >= 0 Then
Delete(IndexOf(Pointer(AValue)));
else
Add(Pointer(AValue));
end;
end;
5) НаOnDrawColumnCell
сетки вешаешь примерно такое:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
AValue: integer;
begin
AValue := Column.Field.DataSet.FieldByName("CLC").AsInteger;
if (ListSelect.IndexOf(Pointer(AValue)) >= 0) and
not (ASelected and AFocused)
then begin
AColor := clInfoBk;
AFont.Color := clInfoText;
end;
end;
Кажется все. Приблизительно так должно работать.
← →
Belkova (2003-05-06 12:20) [5]Всем спасибо! Попробую.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c