如何更改 Delphi 中的 DBLookupComboBox 值?

How to change DBLookupComboBox value in Delphi?

我正在尝试更改 DBLookupComboBox 的可见文本(值),使用:

DBLookupComboBox1.KeyValue:=S;

DBLookupComboBox2.KeyValue:=X;

如果 KeyValue 和 S 是字符串,那么一切正常,我可以设置值。

但是当 KeyValue 是一个 integer/Int64(数据库中的 UID),并且 X 是一个 Int64 变量时 - 它不起作用,并且没有任何变化。

举个例子,我需要在 DBLookupComboBox1 中设置 "Amsterdam",在 DBLookupComboBox2 中设置 1500。 "Amsterdam" 来自用户的 "City" 字段,1500 作为 UID。

请问我做错了什么?

谢谢

设置 KeyValue 调用 TDBLookupControl 的 SetKeyValue,在 Delphi 7 中显示为:

procedure TDBLookupControl.SetKeyValue(const Value: Variant);
begin
  if not VarEquals(FKeyValue, Value) then
  begin
    FKeyValue := Value;
    KeyValueChanged;
  end;
end;

procedure TDBLookupComboBox.KeyValueChanged;
begin
  if FLookupMode then
  begin
    FText := FDataField.DisplayText;
    FAlignment := FDataField.Alignment;
  end else
  if ListActive and LocateKey then
  begin
    FText := FListField.DisplayText;
    FAlignment := FListField.Alignment;
  end else
  begin
    FText := '';
    FAlignment := taLeftJustify;
  end;
  Invalidate;
end;

如您所见,您的变量 x 用作 LocateKey 的一部分。

function TDBLookupControl.LocateKey: Boolean;
var
  KeySave: Variant;
begin
  Result := False;
  try
    KeySave := FKeyValue;
    if not VarIsNull(FKeyValue) and FListLink.DataSet.Active and
      FListLink.DataSet.Locate(FKeyFieldName, FKeyValue, []) then // << ---here
    begin
      Result := True;
      FKeyValue := KeySave;
    end;
  except
  end;
end;

单步执行这些过程和函数应该可以帮助您调试问题。所有都位于 DbCtrls 单元中..

我用过这个解决了我的问题。

Form1.OnShow 使用这行代码:

DBLookupComboBox1.ListSource.DataSet.Locate('City', 'Amsterdam', []);
DBLookupComboBox1.ListSource.DataSet.FieldByName(DBLookupComboBox1.KeyField).Value;


DBLookupComboBox2.ListSource.DataSet.Locate('UID', '1500', []);
DBLookupComboBox2.ListSource.DataSet.FieldByName(DBLookupComboBox2.KeyField).Value;

此代码对您很重要:

lkcbbArzSource.KeyValue:=2;//c(or another number);

lkcbbArzSource 是一个 dbLookupComboBox 对象,您只能在其中插入一个数字!为什么?因为它是数字,而它的另一面有一个字段显示组合中该数字的文本或字符串。

在下面的示例代码中,您可以看到 dbLookupComboBox 如何管理和填充数据集并添加到网格中:

rzSource.Enabled:= True;
lkcbbArzSource.Font.Size:=8;
lkcbbArzSource.Tag := V_Counter;
lkcbbArzSource.Visible:= True;
lkcbbArzSource.Enabled:= True;
lkcbbArzSource.Font.Name:='tahoma';
lkcbbArzSource.ListSource := myDsrSource;
lkcbbArzSource.KeyField := 'Code';
lkcbbArzSource.ListField := 'Des';
lkcbbArzSource.KeyValue:=  IntToStr(FieldByName('P_ARZSOURCE').AsInteger);
lkcbbArzSource.OnChange := myBicLookUpChange;
SGrid2.Objects[look_col,lkcbbArzSource.Tag]:= lkcbbArzSource;
SGRID2.Objects[look_col,V_Counter] := nil;c