![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DevExpress cxGrid [D7]
shadow_hawk © (2013-05-23 19:05:00)Добрый день!
Помогите плизз справиться с задачкой:
Для ускорения навигации в cxGrid включил:
DataController.DataModeController.GridMode := True;
Что получил:
Плюс:
Скорость увеличилась (это и понятно - сколько надо отобразить строк столько и грузится, а не вся таблица целиком, а в ней около 33000 записей)
Минус:
Фильтр больше не работает. В Footer не показывается количество строк (соответствующих фильтру), просто 0.
По фильтру:
У разработчиков увидел намек на то, что надо обрабатывать событие для фильтра - OnBeforeChange, но что там писать??? не пойму :(
Попытался хотя бы количество и номер строки выяснить:
procedure TFormMain.DBTableViewDataControllerFilterBeforeChange(
Sender: TcxDBDataFilterCriteria; ADataSet: TDataSet;
const AFilterText: String);
var
ARecNo, ARecordCount : integer;
begin
if NOT ( FormMain.DBTableView.DataController.FilteredRecordCount = 0 ) then
begin
with DBTableView.DataController do
begin
if IsGridMode then
begin
ARecNo := DataSet.RecNo;
ARecordCount := DataSet.RecordCount;
end;
end;
Caption := ' ARecNo= "' + IntToStr(ARecNo)+
'" ARecordCount= "' + IntToStr(ARecordCount) + '"';
end;
DBTableView.DataController.Summary.FooterSummaryValues[1] := IntToStr(ARecNo);
end;
В заголовке окна вижу - считается правильно - и общее кол-во видно и номер строки. Только общее количество постоянно - фильтр не работает, хотя в области фильтра я вижу строку активного фильтра:
(firma = Тест)
Как было до включения GridMode (и работало):
По правой кнопке выбираю значение ячейки и вызываю процедуры построения и активации фильтра:
procedure TFormMain. MenuItem1Click(Sender: TObject);
begin
if NOT ( FormMain.DBTableView.DataController.FilteredRecordCount = 0 ) then
begin
FilterLike(( DBTableView.Controller.FocusedColumn as TcxGridDBColumn ),
( DBTableView.Controller.FocusedColumn as TcxGridDBColumn ).DataBinding.Field.Text, False );
end;
end;
procedure FilterLike(Col: TcxGridDBColumn; Text: Variant; FlagAddFiltr: Boolean );
begin
Screen.Cursor := crHourGlass;
with FormMain.DBTableView.DataController.Filter do
begin
if NOT FlagAddFiltr then Clear;
AddItem( Root, Col, foLike, Text, Text );
Active := true;
end;
Screen.Cursor := crDefault;
end;
shadow_hawk (2013-05-27 17:33:00) [1]
> Очень странно.
> Фильтр там организован в DataController.Filter.AutoDataSetFilter
> + tvDataControllerFilterGetValueList
> Остальное в tvOrdersDataControllerSummaryAfterSummary
А вот это надо поковырять. В любом случае это уже лучше!
Наводит на мысль, что решить вопрос с фильтром разработчик предлагает одним из нескольких способов:
я споткнулся на DataControllerFilterBeforeChange,
а другие типо DataControllerFilterGetValueListупустил из виду.
Вернее я естественно смотрел этот пример, но оказалось, что в меню демо-программы необходимо все включать - калькулятор, сортировку и фильтр и тогда видно, что они работают! Причем даже на группах! Ну а уж к ПКМ это можно прикрутить :)
Спасибо!
shadow_hawk (2013-05-27 16:46:00) [2]
> GridMode предполагает что большинство возможностей грида
> будут отключены, их реализацией будет заниматься сам разработчик.
> Сомнительное удовольствие, однако.
Совершенно верно! НО! когда записей очень много надо что то делать, а я решал раньшевопрос просто:
Все записи раз в какое-то время в архивную таблицу переносил и когда нужны общие результаты - а они не так часто нужны - то просто сделал дополнительный инструмент, в котором на уровне SQL-запроса делаю нужную выборку. Но наворачивать такую поисковую систему как постоянный инструмент - это глупость. А при отключенной GridMode клиент очень доволен всеми возможностями - просто ему иногда очень ненравится ждать когда все данные закешируются (10-15 сек. максимум) в датасет. Памяти на 10-15 тысяч записей вполне хватает.
И тем не менее у меня есть желание решить этот вопрос с включенным GridMode, и я надеюсь, что мне это удастся. Очень много людей его задают и почему-то никто так и не опубликовал нормальное решение в виде кода. Это надо исправить.
turbouser (2013-05-27 15:57:00) [3]
> shadow_hawk © (27.05.13 14:30) [37]
> в нем я не нашел ни фильтра, ни суммы, ни счетчиков.
Очень странно.
Фильтр там организован в DataController.Filter.AutoDataSetFilter + tvDataControllerFilterGetValueList
Остальное в tvOrdersDataControllerSummaryAfterSummary
и т.п.
> Inovet © (27.05.13 14:35) [38]
> Не значит ли это, что GridMode для чего-то другого предназначен?
GridMode предполагает что большинство возможностей грида будут отключены, их реализацией будет заниматься сам разработчик. Сомнительное удовольствие, однако.
Inovet (2013-05-27 14:35:00) [4]> [37] shadow_hawk © (27.05.13 14:30)
> Этот пример я тоже изучал - в нем я не нашел ни фильтра,
> ни суммы, ни счетчиков. Хотя грид и установлен в GridMode := True;
Не значит ли это, что GridMode для чего-то другого предназначен? Мне показалось, тут намекали на это.
shadow_hawk (2013-05-27 14:30:00) [5]To Inovet
> > TdxMemData
>
> Так, а где среди TADO такой компонент?
Этот компонент на закладке Dev Express
Это вариант, когда не надо привязываться к базе данных, просто для примера. В реальной программе я его не использую.
To turbouser
> \Program Files (x86)\DevExpress VCL\ExpressQuantumGrid\Demos\Delphi\GridModeDemo\
Этот пример я тоже изучал - в нем я не нашел ни фильтра, ни суммы, ни счетчиков. Хотя грид и установлен в GridMode := True;
:(
turbouser (2013-05-27 13:53:00) [6]\Program Files (x86)\DevExpress VCL\ExpressQuantumGrid\Demos\Delphi\GridModeDemo\
Inovet (2013-05-27 13:45:00) [7]> [32] shadow_hawk © (27.05.13 13:14)
> TdxMemData
Так, а где среди TADO такой компонент?
shadow_hawk (2013-05-27 13:42:00) [8]
> Ну да, сейчас, только шнурки поглажу и побегу ставить делфи,
> компоненты, примеры ваять...
>
> Найми программиста, в конце концов.
Больше негде тролить?
Плохиш (2013-05-27 13:30:00) [9]
> И где пример, о котором ты говоришь?
О каком примере я говорил?
> Приведи простой пример
Ну да, сейчас, только шнурки поглажу и побегу ставить делфи, компоненты, примеры ваять...
Найми программиста, в конце концов.
shadow_hawk (2013-05-27 13:14:00) [10]То Плохиш
> Странно, я сходил к гуглю, набрал название требуемого компанента,
> ткнул мышой в предложеный вариант запроса, и, о чудо, в
> первой же ссылки получил подробную инструкцию по использованию
> фильтрации в этом компоненте.
И где пример, о котором ты говоришь? Инструкции я читал - воспользоваться не не получается - получил оверфлоу по стеку. Поэтому и пришел за помощью!
Приведи простой пример, не надо никаких сложностей:
Форма и 3 компонента: TdxMemData, TDataSource и cxGrid.
В гриде пару столбцов String один Integer и GridMode в True.
В футтере по колонке integer отображать skSum по любой текстовой skCount.
В фильтре отображать строку фильтра.
Написать процедуры, которые заставять работать фильтр, skSum и skCount.
Мне это не под силу - если ты с этим справился - код в студию и ветку можно закрыть :)
Плохиш (2013-05-27 11:04:00) [11]
> И ... если найдешь ПРИМЕР (что бы работал ФИЛЬТР в cxGRID)
> на сайте разработчика - ткни меня в него носом
Кстати, ссылка вела на форум разработчиков.
> и ветку сразу закроем!
Ветку можно закрывать.
Плохиш (2013-05-27 11:02:00) [12]
> Если ты не знаешь, что такое cxGrid - тогда ... ну сходи
> на сайт разработчика и почитай что это
Странно, я сходил к гуглю, набрал название требуемого компанента, ткнул мышой в предложеный вариант запроса, и, о чудо, в первой же ссылки получил подробную инструкцию по использованию фильтрации в этом компоненте.
Inovet (2013-05-26 13:00:00) [13]> [28] turbouser © (26.05.13 12:13)
> Именно датасет. Не грид
Пытаемся донести мысль о датасете уже много постов.
turbouser (2013-05-26 12:13:00) [14]
> shadow_hawk ©
Сам - это значит что тебе самому надо фильтровать датасет. Именно датасет . Не грид.
Германн (2013-05-26 02:31:00) [15]
> Если ты не знаешь, что такое cxGrid - тогда ... ну сходи
> на сайт разработчика и почитай что это
В первую очередь на сайт разработчика стоит сходить тебе! Ты же используешь данный компонент!
shadow_hawk (2013-05-25 22:22:00) [16]To turbouser
> Ты внимательно читал? Для гридмоде фильтр не будет работать.
> DBTableViewDataControllerFilterBeforeChange предполагает
> что ты сам (САМ, емае!!!) будешь фильтровать датасет. Понятно?
>
Очень тяжело оставаться политкорректным :)
Я в первом посте об этом написал! Я знаю, что надо писать самомуобработчик события OnBeforeChange и написал, что не знаю чтотам писать!!! Какими буквами еще об этом надо прокричать? :)
Если ты не знаешь, что такое cxGrid - тогда ... ну сходи на сайт разработчика и почитай что это, потому что в двух словах это ГРИД, а больше объяснять ветка не потянет, и компоненты там же найдешь. Извини, если погорячился, но мне нужна ПОМОЩЬ, а не пустая болтовня, и вопросы по моим предыдущим постам :)
МАСТЕРА, плизз отзовитесь, кто знает cxGRID, кто справился с GridMode := True
turbouser (2013-05-25 21:57:00) [17]ТС, откуда у тебя эти компоненты?
turbouser (2013-05-25 21:54:00) [18]
> shadow_hawk © (25.05.13 21:48) [23]
> что бы работал ФИЛЬТР в cxGRID
Ты внимательно читал? Для гридмоде фильтр не будет работать. DBTableViewDataControllerFilterBeforeChange предполагает что ты сам (САМ, емае!!!) будешь фильтровать датасет. Понятно?
shadow_hawk (2013-05-25 21:48:00) [19]To turbouser
Вопрос:
> За тебя поискать ответы и примеры на сайте devexpress?
Ответ:
> По фильтру:
> У разработчиков увидел намек на то, что надо обрабатывать
> событие для фильтра - OnBeforeChange, но что там писать?
> ?? не пойму :(
Вопрос:
> ты хоть понимаешь, зачем вообще этот GridMode нужен?
Ответ:
> Для ускорения навигации в cxGrid включил:
> DataController.DataModeController.GridMode := True;
>
> Что получил:
> Плюс:
> Скорость увеличилась (это и понятно - сколько надо отобразить
> строк столько и грузится, а не вся таблица целиком
Ответы я взял из своего первого поста.
И ... если найдешь ПРИМЕР(что бы работал ФИЛЬТРв cxGRID) на сайте разработчика - ткни меня в него носом :) - буду очень благодарен и ветку сразу закроем!
turbouser (2013-05-25 20:47:00) [20]
> shadow_hawk ©
> Надеюсь мы все выяснили, осталось понять, как это теперь
> поможет ответить на вопрос про OnBeforeChange при GridMode
> := True ?
За тебя поискать ответы и примеры на сайте devexpress?