Как разрешить выбор значения NULL в TDBLookupComboBox? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть TDBLookupComboBox, показывающий TStringField вида fkLookup, который допускает значения Null (из столбца базы данных Integer со значением NULL).

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

Я могу сбросить его до Null, нажав назначенное NullValueKey.

Все в порядке, но пользователи предпочитают использовать мышь. Таким образом, я мог бы предоставить четкую кнопку, но я думаю, что дополнительная строка в верхней части списка была бы намного лучше. Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Вы можете поместить пустую строку в свой запрос, и, если вам нужно, она отсортирована, вы можете сделать так, чтобы она отображалась вверху в вашем списке следующим образом:

select 0 as sort,
       convert(int, null) as UserID,
       'Clear' as Name
union all
select 1 as sort,
       u.UserID,
       u.Name
from   tblUser u
order by sort, Name

В столбце sort он появится сверху, после чего вы можете отсортировать все, что вам нужно.

0 голосов
/ 31 октября 2018

Это не совсем то, что было запрошено, но это может быть лучшее решение для разработчиков, имеющих подписку DevExpress VCL ExpressEditors: в ​​TcxDBLookupComboBox есть скрытая функция, которая может обеспечьте хорошую кнопку очистки внутри выпадающего списка!

Screenshot of a TcxDBLookupComboBox/IsFixedList with clear button

Он работает точно так же, как в TcxButtonEdit, где вы можете добавлять кнопки во время разработки, просто это свойство Buttons не отображается в TcxDBLookupComboBox, поэтому его можно установить только во время выполнения: (

procedure TForm1.FormCreate(Sender: TObject);
begin
  AddClearButton(cxDBLookupComboBox1.Properties);
end;

procedure TForm1.AddClearButton(Prop: TcxCustomEditProperties);
begin
  with Prop.Buttons.Add do begin
    Kind:= bkText;
    Caption:= #$2715; //Unicode X-symbol
  end;
  Prop.OnButtonClick:= ClearButtonClick;
end;

procedure TForm1.ClearButtonClick(Sender: TObject; AButtonIndex: Integer);
begin
  if AButtonIndex = 1 then
    with TcxCustomEdit(Sender) do begin
      EditValue:= Null;
      PostEditValue;
    end;
end;

Это может также работать с другими элементами управления, однако, по крайней мере, с TcxDBSpinEdit это не так.

0 голосов
/ 31 октября 2018

Вы можете использовать в качестве LookupDataSet запроса со следующим SQL (синтаксис Firebird)

SELECT CAST (NULL AS INTEGER) AS ID, CAST ('clear' AS VARCHAR(80)) AS NAME FROM table_name
UNION
SELECT ID, NAME FROM table_name

Однако в этой реализации элемент clear будет находиться в конце списка.

Добавлено после нашего обсуждения в чате

Боюсь, что мы никогда не достигнем такого поведения полей с нулевым значением, как нормальные поля, потому что ноль не является значением, как было правильно упомянуто здесь: https://petercai.com/null-is-not-a-value/. Мы можем сделать только некоторые обходные пути.

Например, мы можем видеть пользовательское отображаемое значение для нуля, такое как SELECT CASE WHEN OurField IS NULL THEN '(empty)' ELSE OurField END AS OurField. И мы можем установить ноль с искусственным пунктом меню. Но это не полное, комплексное решение.

...