Список множественного выбора, привязанный к базе данных в Delphi 6
-
05-07-2019 - |
Вопрос
Я использую Delphi 6, и мне нужен список со списком, привязанным к базе данных, с множественным выбором. Я нашел три типа списков: TListBox
, TDBListBox
и TDBLookupListBox
. Р>
Насколько я понимаю, TListbox
не привязан к базе данных. TDBListBox
и TDBLookupListBox
нельзя выбрать несколько раз.
Есть ли способ привязать список с множественным выбором к базе данных?
Решение
Проблема с компонентами привязки данных заключается в том, что они полагаются на источник данных, а источник данных имеет только один курсор. Вероятно, это и есть причина.
Кстати, вам нужно изменить данные? В противном случае вы можете заполнить обычный список из набора данных. Или даже используйте список невидимых данных и скопируйте содержимое в обычный список.
Другие советы
Не так далеко, как я знаю.
Стандарт заключается в том, что вы предлагаете в списке набор значений, в которых 1 представляет текущую запись.
Если у вас нет многозначного поля (против лучших практик), я не могу понять, как вы могли бы выбрать несколько элементов ...
Или то, что вы могли бы хотеть, на самом деле является дополнительной таблицей?
DevExpress TcxDBListBox поддерживает множественный выбор. Я использую их флажок множественного выбора, привязанный к базе данных, это мило.
Компоненты имеют методы, которые вы можете реализовать для преобразования в ваш список и из него; EditValueToStates и StatesToEditValue. Хотя данные, которые я храню, не нормализованы (я храню список номеров версий, разделенных точкой с запятой), я создал полнотекстовый индекс поиска в поле с разделителем точки с запятой, и теперь я все еще могу выполнять оптимизированный поиск на этом поле.
Вы можете создать свой собственный настраиваемый компонент списка, который происходит от TCustomListBox, и добавить свойство Datasource для вашего списка, а также другое свойство, такое как TStrings, которое будет использоваться в качестве контейнера для хранения выбранных значений. Затем вы можете опубликовать изменения в своей базе данных, нажав кнопку.
Если вы возьметесь за некоторые параметры TDBGrid и ограничите отображаемые столбцы, вы можете создать нечто, похожее на список. Попробуйте установить для свойства Options значение [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgCancelOnExit, dgMultiSelect] и работайте оттуда.
В TDbLookupListBox у вас есть возможность связать две разные вещи с данными; сначала вы можете привязать список к набору данных (ListSource / ListField / KeyField), а во-вторых, вы можете привязать выбранный элемент к полю в другом наборе данных (DataSource, DataField). С концептуальной точки зрения нет ничего плохого в желании связать список элементов с набором данных, а затем вручную управлять несколькими выборами, однако я не думаю, что это возможно в текущей реализации без создания подклассов и включения необходимых стилей управления.
Исходя из вашего комментария к Fran & ois, я бы использовал обычный TListbox и написал бы код, чтобы вставить все отдельные значения в список, а затем самостоятельно обработать значения множественного выбора. Решение Джереми также работает, и DevExpress Express Quantum Grid имеет хорошую систему фильтров, которая может даже спасти вас от других программ.