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;