2009-10-22 24 views
6

Pensé que era un problema simple, pero no puedo encontrar ninguna información en la web. Estoy unirse a un cuadro de lista a un List usando BindingSource así:ListBox no muestra cambios en DataSource

List<Customer> customers = MyMethodReturningList(); 

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

customersListBox.DataSource = customersBindingSource; 

Ahora, cuando agrego o elimino de customers lista, mi ListBox se actualiza (incluso sin utilizar ResetBindings en BindingSource), pero si cambio de cualquier de los objetos del cliente en la lista, no es así. Llamar al ResetBindings no tiene ningún efecto. Incluso implementé mi propio BindingList, pero el comportamiento no ha cambiado.
La clase Customer utiliza propiedades para acceder y modificar datos. Su contenido ToString() se muestra en la lista.

Estoy usando C# en .Net 2.0.

¿Alguna idea?

Gracias

Respuesta

4

OK, aquí está una solución sucia: wenever que necesita para actualizar el contenido de la caja del origen de datos = null, a continuación, vuelva a enlazar ella.

La razón por la que no se actualiza es porque los objetos en la lista no han cambiado y solo verifica las refrencias del objeto en lugar de sus contenidos.

+0

Sí, creo que eso es lo que hice al final (no tengo el código en este momento), pero como dijiste, está sucio. –

+0

Otro problema es que el origen de datos pierde su configuración de tiempo de diseño, p. Las propiedades DisplayMember y ValueMember se desarman. – Softec

2

También hay un error en el cuadro de lista que puede causar este problema. Si configura SelectionMode en None aparece este problema.

Como solución temporal, establecí el modo de selección en Uno y luego de nuevo en Ninguno al actualizar el origen de datos.

5

Si utiliza un BindingList que ni siquiera necesita el BindingSource:

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

Tengo este problema mediante la conversión de los datos a la matriz cuando se actualiza la fuente. Por favor mira el método UpdateData. De esta manera puede actualizar su cuadro combinado sin perder la configuración de 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

entiendo que esta pregunta se hizo hace casi 6 años, pero aparte de soluciones temporales no veo una respuesta correcta aquí. Cuando cambia la propiedad de un elemento en una colección, el evento se levanta para el elemento (objeto) pero no para la colección. Por lo tanto, la colección no ve un cambio y no actualizará los controles vinculados. Los elementos dentro de todas las colecciones vinculantes y la mayoría de las colecciones genéricas como List<> reciben 2 eventos, PropertyChanging y PropertyChanged. Cuando se cambia una propiedad del elemento dentro de la colección, se desencadena el evento. Todo lo que necesita hacer es agregar un controlador de eventos que activaría la re-vinculación o generaría un evento en el Collection.

Cuestiones relacionadas