如何更改 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
我正在尝试更改 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