Как получить правильный элемент в Delphi DBLookupComboBox для выбора

У меня есть DBLookupComboBox, связанный с запросом к базе данных. Эта часть работает нормально. Когда я запускаю программу, DBLookupComboBox заполняется результатами запроса. Я бы хотел, чтобы DBLookupComboBox заполнялся первым элементом "Выберите" при первом запуске программы или при инициировано действие нового элемента. (См. изображение ниже)

введите здесь описание изображения

Кроме того, если я загружаю ранее сохраненную запись базы данных, для которой был выбран Индекс 2 "Быстрое удаление", как мне получить DBLookupComboBox для отображения этой выбранной записи?

Да, "Выберите" имеет индекс 0 и извлекается как часть запроса.


person Michael Riley - AKA Gunny    schedule 27.08.2011    source источник


Ответы (5)


Я предполагаю, что значение базового поля таблицы равно NULL, а не нулю, что сообщает DBComboBox, что значение еще не выбрано, и оно отображается соответствующим образом.

Если бы значение в таблице было равно нулю, я думаю, что текст в поле редактирования комбо был бы выбран, чтобы указать это, но я могу вспомнить это неправильно.

В любом случае, просто проверьте Field1.IsNull (или IsEmpty), а затем установите его равным нулю. Это означает, что вы больше не можете различать «неизвестное значение» (NULL) и «не выбранное значение» (ноль), если только вы не предотвратите возвращение нулевого значения в таблицу...

person Marjan Venema    schedule 27.08.2011
comment
Это имеет смысл. Я давно не занимался программированием на Delphi (8+ лет) и большую часть времени трачу на веб-программирование. Когда я начал веб-программирование, я помню, как был очень разочарован, пока полностью не понял концепцию среды без сохранения состояния. Теперь я возвращаюсь в Delphi и расстраиваюсь, потому что пытаюсь использовать стиль кодирования без сохранения состояния для DBControls, которые не являются состояниями без сохранения состояния. - person Michael Riley - AKA Gunny; 27.08.2011
comment
@Cape: Добро пожаловать обратно в Дельфи. Надеюсь, это не все разочарование для вас, и есть по крайней мере пара о да! - person Marjan Venema; 27.08.2011
comment
У меня только что был один из тех, о да! моменты. Я купил новую книгу Кэри Дженсенса Delphi in Depth: ClienDataSets и переносил его примеры BDE-DBDEMOS в MS Access и многому научился. ClientDataSets очень полезны. Когда я закончу с переносом на Access, я попробую перенести на ElevateDB. - person Michael Riley - AKA Gunny; 28.08.2011

Вы можете попробовать это (я знаю, что вы, вероятно, уже решили это, как вы просили более 2 лет назад), но на случай, если кому-то еще будет интересно...

dbluLookup.KeyValue := dbluLookup.ListSource.DataSet.FieldByName(dbluLookup.KeyField).Value;

Это просто устанавливает KeyValue в первую запись в наборе данных ListSource, которая должна быть строкой «Выберите».

person Steve Childs    schedule 19.09.2013

Один из способов сделать это — добавить «Пожалуйста, выберите» в базовую таблицу, из которой вы выбираете, где ключ к этому кортежу будет равен 0. Затем, когда вы отображаете поле со списком и значение связанного поля равно 0, « Пожалуйста, выберите». Конечно, вы должны убедиться, что это значение никогда не будет выбрано!

person No'am Newman    schedule 27.08.2011
comment
Затем вы должны убедиться, что поля новой записи инициализированы значением 0, а не NULL. - person No'am Newman; 30.08.2011

DBLookupComboBox по умолчанию отображает ListField(s), KeyField которого в ListSource соответствует DataField в DataSource. Таким образом, чтобы гарантировать отображение некоторого значения для DataField, равного NULL, вы должны предоставить KeyField NULL в ListSource. Но можно представить, что не нужно значение NULL в нижележащей таблице, связанной с ListSource.

Один из способов обойти это — добавить значение NULL к набору данных после ListSource с UNION SELECT. Это должно работать нормально, поскольку этот набор данных не обязательно должен быть редактируемым.

Теперь, чтобы убедиться, что этот специальный набор данных доступен только при добавлении новой записи в набор данных, связанный с DataSource, управляйте запросом для ListSource.DataSet в DataSource.OnStateChange. Когда DataSource.State = dsInsert, то обновить ListSource.DataSet.

person NGLN    schedule 27.08.2011

Модификация ответа Стива Чайлдса в TwwDBLookupCombo, компонент InfoPower

cboFilterTravel1.LookupValue := cboFilterTravel1.LookupTable.FieldByName(cboFilterTravel1.LookupField).Value;

Спасибо, Стив, это работает для меня.

person Mohammad Yusuf    schedule 28.02.2016