2016-11-03 1 views
3

私は2つのコンボボックスを持つフォームを持っています。両方のコンボボックスは同じアイテムリストを持ち、互いに完全に同期する必要があります。TComboBoxのプログラム的な変更をLiveBindingsでうまくいくようにするにはどうすればよいですか?

この作業を行うために、私は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)。

ItemIndexではなくTextプロパティを設定し、ClientDatasetのバッキングフィールドの値を編集しようとしましたが、これらのいずれも異なる結果を生成しませんでした。

1つのコンボボックスの状態をプログラムで変更し、それに合わせてもう1つのLiveBindingを更新する方法を知っている人はいますか?

+0

2つのコンボを有することに代わり、一つだけを持っていると 'TPageControl.OnChange'イベントでその' parent'を変更する可能性があります。同期の必要性はもう存在しません。 –

答えて

1

シアトルで新しく作成したプロジェクトでコードを試してみましたが、あなたが記述した問題 が表示されません。私は答えとしてそれを投稿しています。それはMCVEの意味ではごくわずかですが、 はコードの大部分を設定しています(DFMに潜む「funnies」はありません)。そして、 " あなたと比較しました。

私はあなたのqへの文字通りの答えが「あなたが今やっているやり方」だと思います。がんばろう!

Btw、個人的に私は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; 
関連する問題