Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.26;
Скачать: CL | DM;

Вниз

Выделение в 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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.015 c
14-83714
Michael
2003-05-04 17:58
2003.05.26
Опрос: Кто какую


14-83742
k2
2003-05-07 12:51
2003.05.26
Лечение наркомании


3-83388
Юрий
2003-05-06 14:31
2003.05.26
DBgrid


1-83524
stkatch
2003-05-13 15:44
2003.05.26
Копирование open array массива в динамический массив


6-83637
Andrey Terekhov
2003-03-29 13:58
2003.05.26
Окон загрузки файла из Инета