Delphi 7中DBLookupComboBox按回车选记录无法正确保存到数据库问题
问题根因
你的代码存在3个核心错误导致值无法写入数据库:
- 执行顺序颠倒:你先给
KeyValue赋值,再调用Locate查找列表数据集记录,相当于先赋值再改查找目标,最终KeyValue还是旧值 - 未触发目标数据集编辑状态:DBLookupComboBox绑定的主数据集(需要写入数据的数据集,不是下拉列表的
ListSource数据集)没有进入编辑模式,修改的KeyValue不会被同步到数据集缓存 - 未拦截默认回车事件:系统默认的回车事件会触发焦点跳转,可能覆盖你手动设置的控件值
修正后的代码
if (Screen.ActiveControl is TDBLookupComboBox) then begin if Msg.wParam = VK_RETURN then begin TDBLookupComboBox cbb := Screen.ActiveControl as TDBLookupComboBox; // 先定位下拉列表中匹配用户输入的记录 if cbb.ListSource.DataSet.Locate(cbb.ListField, cbb.Text, [loCaseInsensitive]) then begin // 让绑定的目标数据集进入编辑状态 if cbb.Field.DataSet.State = dsBrowse then cbb.Field.DataSet.Edit; // 给控件赋值对应键值 cbb.KeyValue := cbb.ListSource.DataSet.FieldByName(cbb.KeyField).Value; // 标记消息已处理,拦截默认回车跳转逻辑 Msg.Result := 1; Handled := True; end; end; end;
补充注意事项
- 你之前冗余的
ClassName判断可以删掉,is运算符已经自带了类型安全检查 - 如果你的列表匹配是按键字段匹配,可以把
Locate的第一个参数换成cbb.KeyField,按实际业务需求调整即可 - 赋值完成后如果需要立刻持久化数据,可以手动调用
cbb.Field.DataSet.Post,但建议还是留给用户主动提交或者数据集自动提交逻辑处理,避免误存
内容的提问来源于stack exchange,提问作者Lucas Emanuel Silva
相关产品推荐
相关产品推荐

