如何使用LiveBindings对TComboBox进行编程更改?

时间:2016-11-03 18:27:11

标签: delphi delphi-10-seattle livebindings

我有一个包含两个组合框的表单,这两个组合框都包含相同的项目列表,并且需要保持彼此完全同步。 (它们代表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;

在此之后,无论出于何种原因,cboMainValue都会显示预期的文字,而cboAltValue仍为空白(即ItemIndex = -1)。

我尝试设置Text属性而不是ItemIndex,并在ClientDataset上编辑支持字段的值,但这些都不会产生不同的结果。

有没有人知道如何以编程方式更改一个组合框的状态并使LiveBindings更新另一个以匹配它?

1 个答案:

答案 0 :(得分:1)

我在西雅图的一个新创建的项目中尝试过您的代码,但它没有展示 你描述的问题。我发布它作为答案,因为它在MCVE意义上是非常小的, 它的大多数设置都是在代码中完成的(所以DFM中没有潜伏的“funnies”),并且可能会让你“发现差异” 与你的相比。

所以我认为你的q的字面答案是“你现在正在做的方式。”祝你好运!

顺便说一下,我个人认为Tom Brunberg的建议可能是一个更好的方法,但显然最好能够找到导致项目出现问题的根源。

代码:

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;