Форум: "Базы";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
Вниз"Выбор" записей в 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.031 c