Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Использование DevExpress (часть 4)

Автор: XeoNu905097
Дата сообщения: 28.04.2011 09:00
1. каким образом можно в колонках TcxDBTreeList добавить фильтры как в TcxGrid ?
использую DX v.55
2. будет ли поддержка TcxDBTreeList в последующих версиях
спасибо.
Автор: ab000001
Дата сообщения: 28.04.2011 09:55
X11
BlackVetal

Я нечетко сформулировал вопрос

Имеется ввиду курсор ввода

Т.е., я в колонке ввожу "абв", курсор стоит после символа "в", перехожу в другую программу (Alt+Tab), возвращаюсь в свою, курсор стоит в первой позиции, перед символом "а"
Автор: marser
Дата сообщения: 28.04.2011 10:14
XeoNu905097

Цитата:
1. каким образом можно в колонках TcxDBTreeList добавить фильтры как в TcxGrid ?
использую DX v.55
2. будет ли поддержка TcxDBTreeList в последующих версиях
спасибо.

1. А Вы сначало выясните поддерживаются они в TcxDBTreeList или нет. И как Вы представляете работу фильтра в иерархическом списке? Что делать, если родительская запись не подпадает под условия фильтра, а дочерние подпадают? И т.д. и т.п.
2. Спросите разработчиков. ИМХО будет.
Автор: NatNiM
Дата сообщения: 28.04.2011 10:53
Здравствуйте.

Использую DevExpress.XtraGrid.GridControl.
Мне необходимо, чтобы в ячейке отображался выпадающий список, в котором значения выбирались из sql-запроса.

Посоветуйте, пожалуйста, какой использовать тип ComboBox?
Автор: sergey_sergey
Дата сообщения: 28.04.2011 10:59
Добрый день.
Подскажите, как один dxBarPopupMenu (DevExpress) привязать к нескольким компонентам на обработку? С TPopupMenu всё понятно и делал вот так...
procedure TForm1.N9Click(Sender: TObject);
var
i: integer;
gh: TcxCheckListBox;
begin
gh:=PopupMenu3.PopupComponent as TcxCheckListBox;
for i:=0 to gh.Items.Count-1 do gh.Items.Items[i].Checked:=false;
end;
Автор: fantoma61s
Дата сообщения: 28.04.2011 11:05
Компонент cxTreeList, пытаюсь организовать поиск:

IncSearch:=True;
ExpandOnIncSearch:=True;

Все бы ничего...Все вроде бы работает. Но дело в том, что текст узлов, по которому проводится поиск, может иметь пробелы. Когда при поиске я нажимаю Space, вместо того, чтобы продолжить поиск, помечается CheckBox, будь он неладен...
Что можно сделать?
Спасибо.
Автор: marser
Дата сообщения: 28.04.2011 13:02
fantoma61s
Попробуйте обработать событие OnKeyDown:

Код: procedure TForm1.cxTreeList1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if TcxTreeList(Sender).Searching and (Key = VK_SPACE) then
begin
Key := 0;
TcxTreeList(Sender).SearchingText := TcxTreeList(Sender).SearchingText + ' ';
end;
end;
Автор: fantoma61s
Дата сообщения: 28.04.2011 14:32
marser

Спасибо за ответ.

Поиск идет нормально до Спейса. После нажатия на Space дальнейший поиск прекращается.

Например, надо найти узел с текстом "Сергей Петров". Есть две строки:

Сергей Иванов
Сергей Петров

Поиск останавливается на Сергей Иванов. Когда после пробела я пытаюсь ввести символ П, ничего не происходит. Ввести можно только символ И. затем В и т.д...
Автор: marser
Дата сообщения: 28.04.2011 15:08
fantoma61s

Цитата:
помечается CheckBox

Это OptionsView.CheckGroups := True? Я правильно понял? Если так, то у меня на простом тестовом примере нормально работает.
Автор: fantoma61s
Дата сообщения: 28.04.2011 15:25
"Это OptionsView.CheckGroups := True? Я правильно понял?"

Да, именно так.

"Если так, то у меня на простом тестовом примере нормально работает."

Вам везет. У меня не работает.)))

А вообще, странно...Должно же это где-то отключаться...Ну, я имею ввиду, Check выбранного узла Спейсом...
Автор: Czechoslovak
Дата сообщения: 28.04.2011 15:43
NatNiM
LookupComboBox
Автор: fantoma61s
Дата сообщения: 01.05.2011 21:28
Может кому интересно...
Проблему решил редактированием cxTL.pas
Автор: crazypiggy
Дата сообщения: 02.05.2011 21:53
Доброго дня. Не подскажите как при редактировании ячейки в cxGrid сравнить её значение с соседней ячейкой той же строки и разрешить вводить значение только равное или большее. Спасибо
Автор: TechnoDreamer
Дата сообщения: 03.05.2011 00:07
crazypiggy например в OnValidate событии необходимого стлобца. Значения других столбцов можно получить через Controller.FocusedRecord
Автор: Nejdana
Дата сообщения: 03.05.2011 05:27
Подскажите, пожалуйста

получаю число записей
k:= cxGrid1DBTableView1.DataController.FilteredRecordCount;

выделяю нужные
cxGrid1DBTableView1.Controller.SelectCells(
cxGrid1DBTableView1.Columns[0], cxGrid1DBTableView1.Columns[0], 0, k-1);

а как заменить все выделенные значения столбца на какое-то значение? например 1.
если использовать цикл, то получается долго, записей очень много. или использование цикла никак не обойти?
Автор: linker_2009
Дата сообщения: 03.05.2011 06:08
Nejdana
Попробуйте,
перед циклом
cxGrid1DBTableView1.DataController.BeginFullUpdate;
после цикла
cxGrid1DBTableView1.DataController.EndFullUpdate;

Если это БД, то обновлял бы данные через SQL запрос.
Автор: Nejdana
Дата сообщения: 03.05.2011 06:51
а как мне заменить все выделенные значения на другое значение в самой таблице?

План такой - делать изменения в таблице и по окончанию изменений они вносятся уже в базу через SQL.

К примеру, придумала как изменять значения столбца в цикле

for i:=1 to k do
begin
cxGrid1DBTableView1svc_group_id.EditValue := setVal;
cxGrid1DBTableView1.DataController.GotoNext;
end;

но к сожалению, такой способ слишком долгий.
Автор: Cryogen2003
Дата сообщения: 03.05.2011 08:10
Nejdana
Посмотрел такой способ, нормально быстро работает. проверь, включила ли ты у себя smartrefresh, а так же стоит KeyValue на TableView.
Автор: NatNiM
Дата сообщения: 03.05.2011 09:17
Czechoslovak,
такого типа поля нет в компоненте DevExpress.XtraGrid.GridControl.
Пробую использовать LookUpEdit, но здесь столкнулась с тем, что полученные данные из запроса не могу отобразить в выпадающем списке.
Может быть, подскажете, как это можно сделать?

Спасибо.
Автор: Nejdana
Дата сообщения: 03.05.2011 09:31
Cryogen2003

Стоит смартрефреш. Когда записей немного все хорошо, долго отрабатывает на 7 тыс записей. вот полный участок, который это делает.

k:= cxGrid1DBTableView1.DataController.FilteredRecordCount;
setVal := cxLookupComboBox2.EditValue;
for i:=1 to k do
begin
cxGrid1DBTableView1svc_group_id.EditValue := setVal;
cxGrid1DBTableView1.DataController.GotoNext;
end;
cxGrid1DBTableView1.DataController.Filter.Clear;
OraDataSource1.Edit;
OraQuery1.ApplyUpdates;
OraQuery1.CommitUpdates;

По времени примерно 6 минут на цикл и 6 минут на апдейты. Думала как убыстрить и можно ли заменять значения не в цикле, а нечто типа "заменить все".

Смартрефреш включен, KeyValue - это KeyFieldNames в TableView?

Добавлено:
Написала так

cxGrid1DBTableView1.DataController.BeginFullUpdate();

for i:=0 to k-1 do
begin
cxGrid1DBTableView1.DataController.SetValue(cxGrid1DBTableView1.Controller.SelectedRows[i].RecordIndex,0,1);
end;
cxGrid1DBTableView1.DataController.EndFullUpdate();

в гриде меняет моментально . как закоммитить изменения в базе? если писать

OraQuery1.ApplyUpdates;
OraQuery1.CommitUpdates;

то изменения внесенные циклом пропадают
Автор: marser
Дата сообщения: 03.05.2011 10:45
Nejdana
Попробуйте перевести условия фильтра Grid в условия WHERE Оракла (свойство DataController.Filter.FilterText может помочь). Одной SQL командой проапдейтите записи в БД и сделайте DataController.Refresh.
Автор: Nejdana
Дата сообщения: 03.05.2011 11:23
т е присвоенные в SetValue никак не закоммитить?
Автор: marser
Дата сообщения: 03.05.2011 11:58
Nejdana

Цитата:
т е присвоенные в SetValue никак не закоммитить?

А чему Вы их присвоили? В OraQuery1 никах изменений не произошло. Что "коммитить"?
Автор: Nejdana
Дата сообщения: 03.05.2011 12:27
а синхронизировать нельзя значения, измененные SetValue, с датасорсом этой таблицы?
чтобы он данные из таблицы отображаемой взял и поместил в базу
Автор: marser
Дата сообщения: 03.05.2011 12:42
Nejdana
Вы уже это сделали в первом коде
Автор: Nejdana
Дата сообщения: 03.05.2011 12:44
если делать так

for i:=0 to k-1 do
begin
OraQuery1.Edit;
OraQuery1svc_group_id.Value:=1;
OraQuery1.Next;
end;

или так

for i:=1 to k do
begin
cxGrid1DBTableView1svc_type.EditValue := setVal;
cxGrid1DBTableView1.DataController.GotoNext;
end;

долго получается. причем он в первом случае в начале цикла надолго призадумывается (10 мин для 7400 записей). кэширует чтоль..и потом начинает писать в базу.

критичный параметр именно время обработки
Автор: marser
Дата сообщения: 03.05.2011 12:51
Nejdana
Один из возможных вариантов я Вам уже предложил.
Автор: Cryogen2003
Дата сообщения: 03.05.2011 13:03
Nejdana
Я Вам уже сказал, в чем проблема возможно у вас. Вам надо попробовать поставить smartrefresh и указать KeyValue в DataController - если этого не сделать, то любое движение по dataset у вас заставляет заново обновлять весь датасет в памяти. При 100 записях не заметно, при 10000 записях - заметно по полной программе.

Вот например одна из моих фунций по поиску значений через датаконтроллер. Если не сделать KeyFieldNames поиск по датасету с 100К записями около 15 секунд, если сделать - 0.1 секунда. Делай выводы ))))
[more=пример]
Procedure FindValueByField(Grid: TcxGridDBBandedTableViewCEB;
MemTable: TkbmMemTable; FieldName: String; Value: String);
Var
Temp1: String;
Begin
Temp1 := Grid.DataController.KeyFieldNames;
Try
Grid.DataController.KeyFieldNames := FieldName;
Grid.DataController.BeginLocate;
Try
Grid.DataController.LocateByKey(Value);
Finally
Grid.DataController.EndLocate;
End;
Finally
Grid.DataController.KeyFieldNames := Temp1;
End;
End;
[/more]
Автор: fortezza
Дата сообщения: 03.05.2011 14:09
Здравствуйте, подскажите, где в инспекторе у cxGridDBTableView поменять надпись панели GroupByBox - 'Drag a column header... '

Добавлено:
Cryogen2003, по поводу SmartRefrash, в справке написано, что эта штука эффективна если записей > 1000. Иначе её надо отключить. А в чем проблема если записей меньше < 1000?
Автор: Cryogen2003
Дата сообщения: 03.05.2011 14:23
fortezza
нееее, проблемы то нет со SmartRefresh меньше 1000 записей. Там разница равна погрешности при меньше 1000 записей с включенной или отключенной фичей. При 10К записях разница уже есть.

А по поводу другого вопроса - не здесь случаем FilterRow.InfoText?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

Предыдущая тема: Помогите пожалуйста с блокировкой клавиатуры и мышки


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.