2009-10-22 39 views
6

これは簡単な問題だと思っていましたが、Web上に情報が見つかりません。私が追加またはcustomersリストから削除すると、ListBoxでDataSourceの変更が表示されない

List<Customer> customers = MyMethodReturningList(); 

BindingSource customersBindingSource = new BindingSource(); 
customersBindingSource.DataSource = customers; 

customersListBox.DataSource = customersBindingSource; 

ListBoxが更新されます(でもBindingSourceResetBindingsを使用せずに)、私はいずれかを変更した場合:私はそうのようなBindingSourceを使用してListへのListBoxをバインドしていますリスト内の顧客オブジェクトのうち、それはありません。 ResetBindingsを呼び出すことは効果がありません。私自身もBindingListを実装しましたが、動作は変更されていません。
Customerクラスは、データのアクセスと変更のためのプロパティを使用します。そのToString()の内容がリストに表示されます。

私は.NET 2.0でC#を使用しています。

アイデア?

おかげ

答えて

4

OKは、ここに汚い修正があります:あなたはそれを再バインドし、データソース= nullを設定するボックスの内容を更新する必要がありますwenever。

更新されないのは、リスト内のオブジェクトが変更されておらず、その内容ではなくオブジェクトの参照のみをチェックするためです。

+0

ええ、私はそれが私が最後にしたことだと思いますが(今はコードがありません)、あなたが言ったように、それは汚いです。 –

+0

もう1つの問題は、データソースの設計時間設定が失われることです。 DisplayMemberおよびValueMemberプロパティは設定解除されます。 – Softec

2

この問題の原因となるリストボックスにもバグがあります。 SelectionModeをに設定しない場合この問題が発生します。

回避策として、データソースを更新するときに選択モードを1に設定してから、なしに戻します。

5

あなたがBindingListを使用する場合も、BindingSourceを必要としない:

BindingList<Customer> customers = new BindingList<Customer>(MyMethodReturningList()); 
customersListBox.DataSource = customers; 
0

私はソースを更新する際に、アレイにデータを変換することによって、この問題を回避ました。 UpdateDataメソッドを参照してください。この方法でコンボボックスの設定を失うことなくコンボボックスを更新できます。

class Person { 
    public int Id {get; set; } 
    public string FirstName{ get; set; } 
    public string SurName {get; set; } 
} 

public Form1() 
{ 
    InitializeComponent(); 
    comboBox1.DisplayMember = "FirstName"; 
    comboBox1.ValueMember = "Id"; 
    comboBox1.DataSource = m_PersonList; 
} 

public void UpdateData() { 
    m_PersonList[0].FirstName = "Firstname1"; 
    comboBox1.DataSource = m_PersonList.ToArray<Person>(); 
} 
0

私はこの質問は、ほぼ6年前に頼まれたが、他の回避策よりも、私はここに正解が表示されないことを理解しています。 コレクション内のアイテムのプロパティを変更すると、イベントはエレメント(オブジェクト)で発生しますが、コレクションでは発生しません。したがって、コレクションには変更が表示されず、バインドされたコントロールは更新されません。すべてのバインディングコレクション内の要素とList<>などの最も一般的なコレクションは、PropertyChangingPropertyChangedの2つのイベントを受け取ります。コレクション内の要素のプロパティが変更されると、イベントがトリガされます。 Collectionにイベントを再バインドするかトリガーするイベントハンドラを追加するだけです。

関連する問題