Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"Выбор" записей в DBGrid-е (CheckBox-ами) [D7, MSSQL]


Страницы:   1 2

Max Zyuzin ©   (2005-06-28 10:38:00) 

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

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

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


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

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

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


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


msguns   (2005-06-30 09:42:00) [2]

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


sniknik   (2005-06-30 01:34:00) [3]

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

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


evvcom   (2005-06-29 12:45:00) [4]


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

Оно становится доступным для редактирования в режиме 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;


Max Zyuzin   (2005-06-29 11:36:00) [5]

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

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

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


evvcom   (2005-06-29 08:23:00) [6]


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

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


atruhin   (2005-06-29 06:39:00) [7]

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


evvcom   (2005-06-28 16:08:00) [8]


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

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


Max Zyuzin   (2005-06-28 15:38:00) [9]

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

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


evvcom   (2005-06-28 14:32:00) [10]


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

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


stud   (2005-06-28 13:53:00) [11]


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

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


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


> Читается в OnCalcFields

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


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

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


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

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


evvcom   (2005-06-28 12:41:00) [15]

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


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

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


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

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

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


evvcom   (2005-06-28 11:34:00) [18]

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


Max Zyuzin   (2005-06-28 11:27:00) [19]

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


Max Zyuzin   (2005-06-28 11:15:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо