【问题标题】:How do I get the Proper Item in a Delphi DBLookupComboBox to be Selected如何在 Delphi DBLookupComboBox 中选择正确的项目
【发布时间】:2017-05-26 21:46:27
【问题描述】:

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

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

是的,“请选择”是索引 0,它作为查询的一部分被检索。

【问题讨论】:

    标签: database delphi lookup


    【解决方案1】:

    你可以试试这个(我知道你现在可能已经解决了,就像你 2 年前问的那样),但万一其他人有兴趣......

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

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

    【讨论】:

      【解决方案2】:

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

      如果表中的值为零,我认为组合的编辑字段中的文本会被选中来表明这一点,但我可能记错了。

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

      【讨论】:

      • 这很有意义。我已经离开 Delphi 编程很长一段时间(8 年多),并且大部分时间都花在了 Web 编程上。当我开始 Web 编程时,我记得在我完全理解无状态环境的概念之前非常沮丧。现在我又回到了 Delphi,我很沮丧,因为我试图对非无状态的 DBControl 采用“无状态编码风格”。
      • @Cape:欢迎回到 Delphi。希望这不是让您感到沮丧,并且至少有几个“哦,是的!”在周围。
      • 我刚吃了一个“哦,是的!”时刻。我购买了 Cary Jensens 的新书“Delphi in Depth: ClienDataSets”,并一直将他的 BDE-DBDEMOS 示例移植到 MS Access 并学到了很多东西。 ClientDataSets 有很多用处。完成移植到 Access 后,我将尝试移植到 ElevateDB。
      【解决方案3】:

      这样做的一种方法是将“请选择”添加到您从中选择的基础表中,该元组的键将为 0。然后当您显示组合框并且连接字段的值是0,将显示“请选择”。当然,你必须确保这个值永远不会被选中!

      【讨论】:

      • 那么你必须确保新记录的字段被初始化为值 0 而不是 NULL。
      【解决方案4】:

      DBLookupComboBox 默认显示ListField(s),其ListSource 中的KeyFieldDataSource 中的DataField 匹配。因此,为了确保显示 DataField 为 NULL 的某些值,您必须在 ListSource 中提供 NULL 的 KeyField。但是可以想象在与ListSource 关联的底层表中不希望有一个 NULL 值。

      避免这种情况的一种方法是将 NULL 值添加到 ListSource 后面的数据集中,并带有 UNION SELECT。这应该可以正常工作,因为该数据集不必是可编辑的。

      现在,为确保此特殊数据集仅在您向与DataSource 关联的数据集添加新记录时可用,请在DataSource.OnStateChange 中管理ListSource.DataSet 的查询。当DataSource.State = dsInsert,则更新ListSource.DataSet

      【讨论】:

        【解决方案5】:

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

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

        谢谢史蒂夫这对我有用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-21
          • 1970-01-01
          • 1970-01-01
          • 2013-03-03
          • 2019-04-11
          • 1970-01-01
          相关资源
          最近更新 更多