![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"Выбор" записей в DBGrid-е (CheckBox-ами) [D7, MSSQL]
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.
Туплю я что то...