Delphi 如何对Tcombox进行编程更改,使其与LiveBindings配合使用?
我有一个表单,它有两个组合框,两个组合框都包含相同的项目列表,并且需要彼此保持完全同步。(它们代表Delphi 如何对Tcombox进行编程更改,使其与LiveBindings配合使用?,delphi,delphi-10-seattle,livebindings,Delphi,Delphi 10 Seattle,Livebindings,我有一个表单,它有两个组合框,两个组合框都包含相同的项目列表,并且需要彼此保持完全同步。(它们代表TPageControl两个不同选项卡上的相同选项列表) 为了实现这一点,我设置了一个LiveBinding,将两个控件绑定到ClientDataset的同一个字段,该字段的存在只是为了保持表单上的控件同步。我的TBindingsList为两个组合框都提供了一个TLinkControlToField,将它们链接到同一个字段 只要我在GUI中进行所有更改,一切都正常 但是,如果一个不相关的操作更改了其
TPageControl
两个不同选项卡上的相同选项列表)
为了实现这一点,我设置了一个LiveBinding,将两个控件绑定到ClientDataset的同一个字段,该字段的存在只是为了保持表单上的控件同步。我的TBindingsList
为两个组合框都提供了一个TLinkControlToField
,将它们链接到同一个字段
只要我在GUI中进行所有更改,一切都正常
但是,如果一个不相关的操作更改了其中一个框的选择状态,则它们将不同步:
cboMainValue.Items.InsertObject(0, 'ALL', TObject(-1));
cboAltValue.Items.Clear;
cboAltValue.Items.Assign(cboMainValue.Items);
cboMainValue.ItemIndex := 0;
cboAltValue.ItemIndex := 0;
在此之后,无论出于何种原因,cboainvalue
显示预期的文本,而cboAltValue
保持空白(即itemlindex=-1
)
我尝试设置Text
属性而不是ItemIndex
,并在ClientDataset上编辑backing字段的值,但这些都不会产生不同的结果
有人知道如何以编程方式更改一个组合框的状态,并使LiveBinding更新另一个组合框以匹配它吗?我在西雅图的一个新创建的项目中尝试了您的代码,但它没有显示出来 你描述的问题。我把它作为一个答案发布,因为它在MCVE意义上是非常小的, 它的大部分设置都是在代码中进行的(因此DFM中没有“有趣的东西”),并且可能允许您“发现差异” 和你的相比 所以我认为你的问题的字面答案是“你现在的样子”。祝你好运 顺便说一句,我个人认为Tom Brunberg的建议可能是一个更好的方法,但是很明显,最好能弄清是什么导致了项目中的问题 代码:
有两个组合的另一种选择是,在
TPageControl.OnChange
事件中,仅使用一个组合并更改其父组合。同步的需求将不再存在。
type
TForm1 = class(TForm)
CDS1: TClientDataSet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
CDS1ID: TIntegerField;
CDS1Value: TStringField; // String 20 field
cboMainValue: TComboBox;
BindSourceDB1: TBindSourceDB;
DBNavigator1: TDBNavigator;
cboAltValue: TComboBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
public
LinkControlToField1: TLinkControlToField;
LinkControlToField2: TLinkControlToField;
end;
[...]
procedure TForm1.Button1Click(Sender: TObject);
begin
cboMainValue.Items.InsertObject(0, 'ALL', TObject(-1));
cboMainValue.Items.InsertObject(1, 'Other', TObject(-1));
cboAltValue.Items.Clear;
cboAltValue.Items.Assign(cboMainValue.Items);
cboMainValue.ItemIndex := 0;
cboAltValue.ItemIndex := 0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
cboMainValue.Items.Insert(0, 'apple');
cboMainValue.Items.Insert(1, 'orange');
cboMainValue.Items.Insert(2, 'banana');
cboAltValue.Items.Assign(cboMainValue.Items);
LinkControlToField1 := TLinkControlToField.Create(Self);
LinkControlToField1.DataSource := BindSourceDB1;
LinkControlToField1.FieldName := 'Value';
LinkControlToField1.Control := cboMainValue;
LinkControlToField2 := TLinkControlToField.Create(Self);
LinkControlToField2.DataSource := BindSourceDB1;
LinkControlToField2.FieldName := 'Value';
LinkControlToField2.Control := cboAltValue;
CDS1.CreateDataSet;
CDS1.InsertRecord([1, 'apple']);
CDS1.InsertRecord([2, 'banana']);
CDS1.InsertRecord([3, 'orange']);
end;