Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.037 c
1-1121719168
sybrex
2005-07-19 00:39
2005.08.07
За что отвечает свойство объекта owner, а за что parent?


11-1104677621
Boguslaw
2005-01-02 17:53
2005.08.07
Is it a thead-safe operation ?


1-1121533517
TStas
2005-07-16 21:05
2005.08.07
Как зависит скорость выполнения потока от его приоритета?


10-1098875056
Николай
2004-10-27 15:04
2005.08.07
Проблема MS Access


1-1121867379
Dust
2005-07-20 17:49
2005.08.07
Опять вопрос про качественный код:





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский