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

Вниз

"Выбор" записей в DBGrid-е (CheckBox-ами)   Найти похожие ветки 

 
Max Zyuzin ©   (2005-06-28 10:38) [0]

Приветствую всех!

Вот возникла необходимость реализовать такой вот механизм - выбор (отмечание) некоторых записей в DBGrid (DBGridEh) для последующей их обработки, и задумался я как его красивее реализовать, на первый взгляд задача довольно часто встречающаяся..., но как-то не сталкивался. Заводить дополнительное поле в таблице нет никакого желания. Вариант с использованием "Memory Table" (и прочее) тоже кажется не очень элегантным, ибо придется сначала все в него закачивать, а потом назад что-то выкачивать

Т.е. хочется, что бы отображалось в Grid-е поле, в котором можно было поставить галочку, а потом, нажав какую нить кнопочку все это обработать...


 
Ega23 ©   (2005-06-28 10:44) [1]

MultiSelect не пойдёт?


 
Zacho ©   (2005-06-28 10:46) [2]

Max Zyuzin ©   (28.06.05 10:38)
Заводить дополнительное поле в таблице нет никакого желания.


Зачем в таблице ? Можно сделать "фальшивое" поле в запросе.


 
Max Zyuzin ©   (2005-06-28 10:54) [3]

>Ega23 ©   (28.06.05 10:44) [1]
Нет не подойдет, ибо случайно ткнул без Ctrl и усе труды по выбору пропали...


 
Zacho ©   (2005-06-28 10:56) [4]

Max Zyuzin ©   (28.06.05 10:54) [3]

Используй, например TDBGridEh из библиотеки EhLib. Там таких "проблем" нет.


 
evvcom ©   (2005-06-28 11:02) [5]

Calc-поле + массив флагов выбора. Пойдет и на стандартном DBGrid.


 
Max Zyuzin ©   (2005-06-28 11:04) [6]

>Zacho ©   (28.06.05 10:46) [2]
Эксперементирую... пока не пойму как :) Получается пока нифига не редактируемое поле...

>Zacho ©   (28.06.05 10:56) [4]
Я его и использую... Ты имеешь ввиду что то вроде OptionsEh.dghClearSelection?


 
Zacho ©   (2005-06-28 11:06) [7]

Max Zyuzin ©   (28.06.05 11:04) [6]
Получается пока нифига не редактируемое поле...


У меня -редактируемое. Опиши подробнее: укажи компоненты доступа и т.п.

> Ты имеешь ввиду что то вроде
> OptionsEh.dghClearSelection?

Не помню. Но по случайному тычку не очишается ;)


 
Max Zyuzin ©   (2005-06-28 11:15) [8]

>Zacho ©   (28.06.05 11:06) [7]
ADOQuery запрос типа "select 0, * from MyView"
DBGridEh, у колонки "0" стоит CheckBoxes - True.
Туплю я что то...


 
Max Zyuzin ©   (2005-06-28 11:27) [9]

>evvcom ©   (28.06.05 11:02) [5]
Можно меня послать к каому нить толковому ФАКу про вычисляемые поля в MSSQL что то я яндексе найти немогу ничего :(


 
evvcom ©   (2005-06-28 11:34) [10]

Вычисляемые поля не в MSSQL, а в TDataSet: TField.FieldKind = fkCalculated. В design-time добавляешь все поля из запроса в свой DataSet + вычисляемое поле.


 
Zacho ©   (2005-06-28 11:44) [11]

Max Zyuzin ©   (28.06.05 11:15) [8]

Я не работал с ADO, так что могу только подозревать, почему поле у тебя получается нередактируемым.
С BDE и IBX такой приём работает отлично.
Надеюсь, что кто-нибудь из знающих ADO подскажет.
Единственно, что могу посоветовать - явно приводить тип "фальшивого" поля. Например, select CAST (0 AS INTEGER), ...


 
Max Zyuzin ©   (2005-06-28 12:12) [12]

Гм... подытожу :)
Сделал запрос типа "select cast(0 as Bit) AS IsSelected, * from MyView".
Сделал у датасета вычисляемое поле IsSelected типа fkInternalCalc (в описании говорится что значения хранятся непосредственно в датасете). Сделал в дизайн-тайме колонку. Запустил поле появилось, редактируемое даже... но при выходе с записи все что ты там наставил сбрасывается...


 
evvcom ©   (2005-06-28 12:41) [13]

Если запрос возвращает поле IsSelected, то зачем его делать вычисляемым? С fkInternalCalc толком не разбирался, камней не знаю. Т.е. либо поле возвращать и делать его редактируемым, либо делать его вычисляемым, добавлять массив для хранения значений этого поля. В обоих случаях есть некоторые нюансы.


 
Max Zyuzin ©   (2005-06-28 12:51) [14]

>evvcom ©   (28.06.05 12:41) [13]
Я в общем уже и так и так попробовал, сделал вычисляемое поле, убрал его из запроса, не понял только куда затолкать массив значчений, ибо без него оно не редактируемое получается.


 
evvcom ©   (2005-06-28 13:20) [15]

Массив значений, чтобы помнить состояние чекбокса для каждой строки. Читается в OnCalcFields, только в некоторых случаях это событие еще надо возбудить. Писать в массив при клике по чекбоксу. Только клик этот надо еще отловить.


 
evvcom ©   (2005-06-28 13:28) [16]


> Читается в OnCalcFields

Точнее в OnCalcFields можно в Calc-поле писать.


 
stud ©   (2005-06-28 13:53) [17]


> Запустил поле появилось, редактируемое даже... но при
> выходе с записи все что ты там наставил сбрасывается...

судя по всему данные постятся и перечитываются с срвера. если набор перевести в режим кэшированых изменений?


 
evvcom ©   (2005-06-28 14:32) [18]


> постятся и перечитываются с срвера

Самопроизвольно они не перечитываются. Могут, если только программист сам постарался.


 
Max Zyuzin ©   (2005-06-28 15:38) [19]

>evvcom ©   (28.06.05 13:20) [15]
Ух... представил я себе что будет с этим массивом в случае сортировки... если учесть что у меня ключ - сразу из 6-и полей :(

>Zacho ©   (28.06.05 11:06) [7]
Нашел я с мультиселектом, все жутковато выходит, и работает только если выбрано RowSelect, а делать этого не хотелось...


 
evvcom ©   (2005-06-28 16:08) [20]


> представил я себе что будет с этим массивом в случае сортировки

Какая еще сортировка? Доступ к элементу массива по RowNum. Даже если у тебя Grid занимается сортировкой, RowNum не меняется. Grid синхронизируется с НД через Bookmark. Естественно речь не идет о соответствии RowNum между разными открытиями набора Close/Open.


 
atruhin ©   (2005-06-29 06:39) [21]

Я в подобных случаях использовал доп. поле в запросе. Чтобы оно не очищалось, нужно выставить кэширование изменений. плюс в некоторых компонентах (например ibx) необходимо создать модифицирующие запросы (можно ложные, главное чтобы были), иначе датасет нередактируемый, таким образом храню информацию привязанную к записи, которой нет в БД, т.е. существует только в рантайм.


 
evvcom ©   (2005-06-29 08:23) [22]


> можно ложные

Скорее не ложные, а ничего не сохраняющие, главное, чтобы что-то было написано. Например, для Oracle "begin null; end;"


 
Max Zyuzin ©   (2005-06-29 11:36) [23]

В общем упарился уже... Разными способами пробовал, добавляя поля в запрос, делаяя view, выставляя у ADOQuery.LockType в ltBatchOptimistic (Кэшированые обновления), если добавлять вычисляемое поле то оно стабильно недоступное, если ничего не выставлять то поле изменяется но как только выходишь с записи все обнуляется :(
Кто это делал через ADO ау?

>evvcom ©   (28.06.05 16:08) [20]
У меня датасет нифига не хочет редактироваться :( не пойму в чем секрет, прежде чем что нить прописывать в массив

Только что плюнул и сделал все вышеуказанное на BDE с парадокосовской табличкой, все работает :(


 
evvcom ©   (2005-06-29 12:45) [24]


> если добавлять вычисляемое поле то оно стабильно недоступное

Оно становится доступным для редактирования в режиме DataSet.State = dsCalcFields, а в этом состоянии DataSet уже находится в OnCalcFields. Правда с ADO я не экспериментировал, а реализация сего в различных DataSet различная, поэтому теоретически различия в поведении возможны.

> У меня датасет нифига не хочет редактироваться

См. выше, только учти, что в OnCalcFields из Calc-полей что-либо читать не имеет смысла, т.е. есть временный буфер под эти поля, который и заполняется посредством CalcField.Value := MyArray[DataSet.RowNum]; в OnCalcFields. Вот здесь ты и читаешь значения из своего массива MyArray, созданного для хранения значений выбора. А пишешь в массив после клика по чекбоксу и здесь же надо инициировать событие на пересчет вычисляемых полей, например так:

type
 TDataSetHack = class(TDataSet);

procedure TMyClass.OnStateCheckBoxClick(...);
begin
 MyStateArray[DataSet.RowNum] := not MyStateArray[DataSet.RowNum];
 TDataSetHack(Dataset).GetCalcFields(Dataset.ActiveBuffer);
 TDataSetHack(Dataset).DataEvent(deRecordChange, 0);
end;


 
sniknik ©   (2005-06-30 01:34) [25]

> не пойму в чем секрет
секрет похоже в MSSQL, он какойто "неправильный" рекордсет возвращает с константными значениями в вычисляемых полях/автоинкременте (тоже не меняется).
первоначально попробовал на access... прошло, а вот с MSSQL не получается...

вообще обойти довольно легко и для MSSQL, (если уже до ltBatchOptimistic дошол... ;)  осталось еще шажок вдобавок к этому,
поставь любое редактируемое поле (нормальное) в 2-х вариантах
SELECT Field1 AS Fl1, Field1, .....
одно из них например первое (Fl1) используй как информационное поле, и все. сохранять все одно так понял будеш нестандартными методами. UpdateBatch еше неизвестно как поведет себя в этом случае (надо смотреть).


 
msguns ©   (2005-06-30 09:42) [26]

1. Для "чекания" записей на клиенте никаких калк-филдов, а тем более редактируемых, не надо. Достаточно любой "свободной" колонки грида (т.е. колонки, поле которой отображать не требуется - лучше всего подходит ID).
2. При "чекании" ID текущей записи добавляется или удаляется из списка (не массива) указателей.
3. В событии OnDrawColumnCell грида поиск в списке по ID прорисовываемой записи и, если есть, в гриде рисуется либо картинка - птичка, либо чекнутый чекбокс, иначе - пусто или нечекнутый.
4. При пересортировке НД никаких манипуляций со списком не требуется.
5. При удалении "чекнутой" записи удалять и соотв-й ей элемент из списка.
6. Список делать отсортированный - в этом случае поиск существенно быстрее.


 
Draught   (2005-07-02 12:06) [27]

http://www.citforum.ru/programming/advice/advice04.shtml

http://www.delphikingdom.com/asp/viewitem.asp?UrlItem=/helloworld/dbgridcolor.htm#up


Хорошие примеры того, что можно сделать в гриде...



Страницы: 1 вся ветка

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.055 c
5-1092211388
segor
2004-08-11 12:03
2005.08.07
События свойства компонента


3-1119934973
evg00
2005-06-28 09:02
2005.08.07
Проблема с общим доступом к базе


1-1121436394
arhis
2005-07-15 18:06
2005.08.07
Инициализация фрейма


1-1121527656
Sania
2005-07-16 19:27
2005.08.07
обращение к другой форме


14-1120933199
lookin
2005-07-09 22:19
2005.08.07
Я атеист. Вы? (Да/Нет)