DBGrid и dgMultiselect
Модератор: Модераторы
DBGrid и dgMultiselect
Столкнулся с такой проблемой.
В проекте использую TIBConnection+TSQLQuery+TDatasource+TDBGrid. В опциях DBGrid ставлю dgMultiselect=true. При этом малтиселект не работает. Сначала грешил на TDBGrid. Взял с SVN последний RxDBGrid - тоже не работает.
Сменил подключение к Firebird на TZConnection+TZQuery+TDatasource+TDBGrid - малтиселект заработал.
Проект большой и переходить на ZEOS или UIB очень проблематично. Как заставить работать Multiselect малой кровью?
lazarus 0.9.27 r20857, fpc 2.2.4, gtk2, RHEL Client 5.2
В проекте использую TIBConnection+TSQLQuery+TDatasource+TDBGrid. В опциях DBGrid ставлю dgMultiselect=true. При этом малтиселект не работает. Сначала грешил на TDBGrid. Взял с SVN последний RxDBGrid - тоже не работает.
Сменил подключение к Firebird на TZConnection+TZQuery+TDatasource+TDBGrid - малтиселект заработал.
Проект большой и переходить на ZEOS или UIB очень проблематично. Как заставить работать Multiselect малой кровью?
lazarus 0.9.27 r20857, fpc 2.2.4, gtk2, RHEL Client 5.2
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Re: DBGrid и dgMultiselect
yuray писал(а):Взял с SVN последний RxDBGrid - тоже не работает.
Это бесполезно было. RxDBGrid - это расширение функционала стандартного DBGrid-а. В основном в части отрисовки данных.
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
Re: DBGrid и dgMultiselect
в UIB с ним тоже проблемы есть. так что скорее всего виноват TSQLQuery. посмотри отлюичия в плане мультиселект там и там(TZQuery) в плане мультисекта.
Re: DBGrid и dgMultiselect
Attid писал(а):посмотри отлюичия в плане мультиселект там и там(TZQuery) в плане мультисекта.
Смотрел, менял все подряд... В итоге мультиселект появился, но работает не стабильно - селектит не все записи и через раз
Re: DBGrid и dgMultiselect
Аналогичная проблема ... проявилась в Lazarus 0.9.28.2 ... в более ранней версии dgMultiSelect работал (если мне не изменяет память, то это был Lazarus 0.9.26) ... yuray, а Вы бы не могли выложить результат вашей правки ...
Смотрю исходники TDBGrid ... очевидно что в DBGrids.pas:
procedure TBookmarkList.SetCurrentRowSelected(const AValue: boolean);
...
aBookStr := FGrid.Datasource.Dataset.Bookmark; <---------------вот тут
FGrid.Datasource.Dataset.Bookmark возвращает пустую строку, исключение первое обращение ... действительно успешное ...
Счётчик SelectedRows.Count наращивается ... но хранятся там пустые строки ...
И естественно после перерисовки компонента ничего не отмечено ...
Да ... MultiSelect отрабатывает только для [ssCtrl,ssLeft] ... для [ssShift,ssLeft], если верить исходникам, не работает ...
Интересно как обстоит дело у Lazarus из SVN ...
Смотрю исходники TDBGrid ... очевидно что в DBGrids.pas:
procedure TBookmarkList.SetCurrentRowSelected(const AValue: boolean);
...
aBookStr := FGrid.Datasource.Dataset.Bookmark; <---------------вот тут
FGrid.Datasource.Dataset.Bookmark возвращает пустую строку, исключение первое обращение ... действительно успешное ...
Счётчик SelectedRows.Count наращивается ... но хранятся там пустые строки ...
И естественно после перерисовки компонента ничего не отмечено ...
Да ... MultiSelect отрабатывает только для [ssCtrl,ssLeft] ... для [ssShift,ssLeft], если верить исходникам, не работает ...
Интересно как обстоит дело у Lazarus из SVN ...
Re: DBGrid и dgMultiselect
Не почтите за спам, просто думаю, что для гуглевших это будет полезным (при поиске наткнулся на эту тему)
Множественное выделение срок в DBgrid с сохранением выделения предыдущих строк (при нажатии на уже выделенную строку выделение снимается)
Имитирует поведение EhLib TDBGridEh (с определенными настройками) . А конкретнее опцию dghClearSelection
1 Заводим глобальную переменную (вне процедур)
Код: Выделить всё
new_selected_row:boolean;
2 Создаем событие в DBGrid OnMouseUp
procedure TFormMain.DBGrid2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if DBGrid2.SelectedRows.CurrentRowSelected=true then
new_selected_row:=true
else
new_selected_row:=false;
end;
3 Создаем событие в DBGrid OnCellClick
procedure TFormMain.DBGrid2CellClick(Column: TColumn);
begin
if new_selected_row=true then DBGrid2.SelectedRows.CurrentRowSelected:=false else DBGrid2.SelectedRows.CurrentRowSelected:=true;
end;
4 Ставим в свойствах DBGrid в Options
dgMultiselect true
dgPersistentMultiselect true
dgRowSelect true
dgEditing false
Все !
Множественное выделение срок в DBgrid с сохранением выделения предыдущих строк (при нажатии на уже выделенную строку выделение снимается)
Имитирует поведение EhLib TDBGridEh (с определенными настройками) . А конкретнее опцию dghClearSelection
1 Заводим глобальную переменную (вне процедур)
Код: Выделить всё
new_selected_row:boolean;
2 Создаем событие в DBGrid OnMouseUp
procedure TFormMain.DBGrid2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if DBGrid2.SelectedRows.CurrentRowSelected=true then
new_selected_row:=true
else
new_selected_row:=false;
end;
3 Создаем событие в DBGrid OnCellClick
procedure TFormMain.DBGrid2CellClick(Column: TColumn);
begin
if new_selected_row=true then DBGrid2.SelectedRows.CurrentRowSelected:=false else DBGrid2.SelectedRows.CurrentRowSelected:=true;
end;
4 Ставим в свойствах DBGrid в Options
dgMultiselect true
dgPersistentMultiselect true
dgRowSelect true
dgEditing false
Все !
Re: DBGrid и dgMultiselect
Ism писал(а):
if DBGrid2.SelectedRows.CurrentRowSelected=true then
new_selected_row:=true
else
new_selected_row:=false;
...
if new_selected_row=true then DBGrid2.SelectedRows.CurrentRowSelected:=false else DBGrid2.SelectedRows.CurrentRowSelected:=true;
Че-то код какой-то смешной прям.
Re: DBGrid и dgMultiselect
Зато работает. Дело в том, что нужно отловить статус записи до выделения мышью
Не нравится ? Предложи лучше .
Не нравится ? Предложи лучше .
Re: DBGrid и dgMultiselect
Я вообще-то сам код имел в виду, а не его назначение.
Вроде бы совершенно очевидно, что вместо
можно просто написать
а вместо
так
Вроде бы совершенно очевидно, что вместо
Код: Выделить всё
if DBGrid2.SelectedRows.CurrentRowSelected=true then
new_selected_row:=true
else
new_selected_row:=false;можно просто написать
Код: Выделить всё
new_selected_row := DBGrid2.SelectedRows.CurrentRowSelected;а вместо
Код: Выделить всё
if new_selected_row=true then DBGrid2.SelectedRows.CurrentRowSelected:=false else DBGrid2.SelectedRows.CurrentRowSelected:=true;так
Код: Выделить всё
DBGrid2.SelectedRows.CurrentRowSelected := not new_selected_row;