如何在Delphi的DBLookupComboBox中选择正确的项目

6
我有一个连接到数据库查询的DBLookupComboBox,这部分工作正常。当我运行程序时,DBLookupComboBox会填充查询结果。在程序第一次运行启动新项目操作时,我希望看到"Please Select"的第一项填充到DBLookupComboBox中。(见下面的图片)

enter image description here

另外,如果我正在加载先前保存的数据库记录,已选择Index 2 "Quick Elimination",如何使DBLookupComboBox显示所选条目?

是的,"Please Select"是索引0,并且作为查询的一部分进行检索。

5个回答

9
您可以尝试这个方法(我知道您可能已经在2年前解决了这个问题),但如果其他人感兴趣的话,可以参考以下内容...
dbluLookup.KeyValue := dbluLookup.ListSource.DataSet.FieldByName(dbluLookup.KeyField).Value;

这只是将KeyValue设置为ListSource数据集中的第一条记录,这应该是行“请选择”。


1
一种实现方法是在您选择的基础表中添加“请选择”,其中该元组的键为0。然后,当您显示组合框并且连接字段的值为0时,“请选择”将被显示。当然,您必须确保永远不会选择此值!

然后,您必须确保新记录的字段被初始化为值0而不是NULL。 - No'am Newman

1

我猜测底层表字段的值为NULL而不是零,这告诉DBComboBox尚未选择任何值并相应地显示。

如果表中的值为零,则我认为组合框编辑字段中的文本将被选中以指示该值,但我可能记错了。

无论如何,只需检查Field1.IsNull(或IsEmpty),然后将其设置为零。这意味着您不能再区分“未知值”(NULL)和“未选择的值”(零),除非您防止零值返回到表中...


这很有道理。我已经远离Delphi编程很长时间了(8年以上),并且大部分时间都在进行Web编程。当我开始进行Web编程时,我记得一直感到非常沮丧,直到我完全理解了无状态环境的概念。现在我正在重新学习Delphi,并感到沮丧,因为我试图将“无状态编码风格”应用于不是无状态的DBControls。 - Michael Riley - AKA Gunny
@Cape:欢迎回到Delphi。希望你不会感到沮丧,至少有几个“哦耶!”的时刻。 - Marjan Venema
1
我刚刚有了一个“噢耶!”的时刻。我购买了Cary Jensen的新书《Delphi深入:ClientDataSets》,并将他的BDE-DBDEMOS示例移植到MS Access,学到了很多东西。ClientDataSets具有很多的实用性。当我完成Access的移植后,我会尝试将其移植到ElevateDB。 - Michael Riley - AKA Gunny

1

DBLookupComboBox 默认显示与 ListSource 中的 KeyField 匹配的 DataFieldListField(s)。因此,为了确保在 DataField 为空时显示某个值,您必须在 ListSource 中提供一个 NULL 的 KeyField。但是,人们可能不希望在与 ListSource 相关联的底层表中有 NULL 值。

解决这个问题的一种方法是使用 UNION SELECT 将 NULL 值添加到 ListSource 后面的数据集中。这应该可以正常工作,因为该数据集不需要可编辑。

现在,为了确保只有在向与 DataSource 相关联的数据集添加新记录时才能使用这个特殊的数据集,在 DataSource.OnStateChange 中管理 ListSource.DataSet 的查询。当 DataSource.State = dsInsert 时,更新 ListSource.DataSet


0

在 TwwDBLookupCombo、InfoPower 组件中修改 Steve Childs 的答案

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

谢谢 Steve,这对我有用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接