2009-10-22 5 views
6

Myślałem, że to prosty problem, ale nie mogę znaleźć żadnych informacji w Internecie. Mam wiążący ListBox do List użyciu BindingSource tak:ListBox nie wyświetla zmian w DataSource

List<Customer> customers = MyMethodReturningList(); 

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

customersListBox.DataSource = customersBindingSource; 

Teraz, kiedy dodać lub usunąć z listy customers mój ListBox jest aktualizowany (nawet bez użycia ResetBindings na BindingSource), ale w przypadku zmiany któregokolwiek obiektów klienta na liście, tak nie jest. Wywołanie ResetBindings nie daje żadnego efektu. Wdrożyłem nawet swój własny BindingList, ale zachowanie się nie zmieniło.
Klasa Customer używa właściwości do uzyskiwania dostępu i modyfikowania danych. Jego zawartość ToString() jest wyświetlana na liście.

Używam C# w .Net 2.0.

Wszelkie pomysły?

Dzięki

Odpowiedz

4

OK, tutaj jest brudny fix: wenever trzeba odświeżyć zawartość Box Set DataSource = null, a następnie ponownie powiązać go.

powodem, dla którego nie aktualizuje się, jest fakt, że obiekty na liście nie uległy zmianie, a jedynie sprawdza ona refrencje obiektu, a nie ich zawartość.

+0

Tak, myślę, że to właśnie zrobiłem na końcu (nie mam teraz kodu), ale jak powiedziałeś, jest brudne. –

+0

Innym problemem jest to, że źródło danych traci ustawienia czasu projektowania, np. Właściwości DisplayMember i ValueMember zostają rozbrojone. – Softec

2

Istnieje również błąd w polu listy, który może powodować ten problem. Jeśli ustawisz SelectionMode na Brak ten problem pojawia się.

Podczas pracy ustawiam tryb wyboru na Jeden, a następnie z powrotem na Brak podczas aktualizacji źródła danych.

5

Jeśli używasz BindingList nawet nie potrzebne BindingSource:

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

mam ten problem poprzez konwersję danych do tablicy podczas aktualizacji źródła. Zobacz metodę UpdateData. W ten sposób możesz zaktualizować pole kombi bez utraty ustawień ComboBox.

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

Rozumiem, że to pytanie było zadawane prawie 6 lat temu, ale inny niż obejść nie widzę prawidłową odpowiedź tutaj. Po zmianie właściwości elementu w kolekcji zdarzenie zostanie podniesione dla elementu (obiektu), ale nie dla kolekcji. Tak więc kolekcja nie widzi zmiany i nie odświeży kontrolek związanych. Elementy wewnątrz wszystkich wiążących kolekcji i najbardziej ogólnych kolekcji, takich jak List<>, otrzymują 2 zdarzenia: PropertyChanging i PropertyChanged. Gdy właściwość elementu wewnątrz kolekcji zostanie zmieniona, zdarzenie zostanie wywołane. Wszystko, co musisz zrobić, to dodać procedurę obsługi zdarzeń, która wyzwala albo ponowne wiązanie, albo podniesienie zdarzenia na Collection.