如何允许在TDBLookupComboBox中选择NULL值?

时间:2018-10-31 09:24:58

标签: delphi combobox null dataset

我有一个TDBLookupComboBox,显示的是TStringField类型的fkLookup,它允许Null值(来自可空的Integer数据库列)。

下拉列表显示分配的LookupDataSet中的项目,这些项目来自联接表。如果该字段为Null,则不显示任何列表项,组合框为空。如果该字段具有值,则会显示正确的描述。

我可以通过按分配的Null将其重置为NullValueKey

没关系,但是用户更喜欢使用鼠标。因此,我可以提供一个明确的按钮,但我认为在列表顶部再增加一行会更好。我该怎么办?

3 个答案:

答案 0 :(得分:3)

您可以在查询中放入空行,如果需要对其进行排序,可以使它显示在列表的顶部,如下所示:

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列将显示在顶部,之后您可以根据需要进行排序。

答案 1 :(得分:1)

您可以将查询与下一个SQL(Firebird语法)一起用作LookupDataSet

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项将位于列表的末尾。

在聊天中我们讨论之后添加的

恐怕我们永远都不会达到像 normal 字段那样的空值字段的行为,因为null不是一个值,正如这里正确提到的:https://petercai.com/null-is-not-a-value/。我们只能为此采取一些解决方法。

例如,我们可以看到自定义显示的null值,例如SELECT CASE WHEN OurField IS NULL THEN '(empty)' ELSE OurField END AS OurField。我们可以使用人工菜单项设置null。但这不是完整,复杂的解决方案。

答案 2 :(得分:0)

这并非完全是所要求的,但对于拥有 DevExpress VCL ExpressEditors订阅的开发人员来说,这可能是更好的解决方案:{{1中有一个隐藏功能}}可以在组合框内提供一个漂亮的清除按钮!

Screenshot of a TcxDBLookupComboBox/IsFixedList with clear button

它的工作原理与TcxDBLookupComboBox相同,您可以在设计时添加按钮,只是TcxButtonEdit中没有显示此Buttons属性,因此只能将其设置为运行时:(

TcxDBLookupComboBox

这可能也适用于其他编辑控件,但是,至少对于TcxDBSpinEdit无效。