Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-83331
-=DeMoH=-
2003-05-05 00:27
2003.05.26
Как осуществить динамическую фильтрацию?


1-83593
phantom2040
2003-05-14 14:53
2003.05.26
Вопрос по OpenDialog


14-83675
pasha_golub
2003-05-05 20:29
2003.05.26
Встреча Мастаков в Москве


1-83525
Лана Розанова
2003-05-13 09:00
2003.05.26
Service


14-83695
sapsi
2003-05-05 09:55
2003.05.26
Язык программирования для носителя английского языка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский