3

我有一个包含两个组合框的表单,这两个组合框都包含相同的项目列表,并且需要彼此保持完美同步。(它们代表 a 的两个不同选项卡上的相同选项列表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 更新另一个组合框以匹配它?

4

1 回答 1

1

我在西雅图的一个新创建的项目中尝试了您的代码,但没有出现您描述的问题。我将其发布为答案,因为它在 MCVE 意义上非常小,它的大部分设置都是在代码中进行的(因此 DFM 中没有潜伏的“有趣”),并且可能让您“发现差异”和你的相比。

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

顺便说一句,我个人认为汤姆布伦伯格的建议可能是一个更好的方法,但很明显,深入了解导致项目问题的原因会很好。

代码:

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;
于 2016-11-04T08:56:56.240 回答