2009-03-13 14 views
8

Tengo un ComboBox cuyos elementos se establecen mediante la propiedad DataSource. DataSource es una colección de un objeto personalizado (que tiene una propiedad de cadena 'Value' y la propiedad int 'Id'). En los controles de inicialización del fijo el DisplayMember como Valor y ValueMember como Id. Ahora he tratado de aclarar el origen de datos llamando,DisplayMember restablecimiento en DataSource = nulo

myComboBox.DataSource = null; 

Cuando lo hice, mi DisplayMember se pone a "" automáticamente. ¿Estoy borrando el DataSource correctamente? ¿Es esa la forma en que debería comportarme?

Respuesta

3

Puedo reproducirlo ... no es algo que hubiera esperado, pero parece que simplemente tendrá que configurar el DisplayMember nuevamente después.

Buscando en el reflector, esto es absolutamente intencional:

 if (value == null) 
     { 
      this.DisplayMember = ""; 
     } 
No

seguro de la razonamiento detrás de eso, sino simplemente:

string oldDisplayMember = cbo.DisplayMember; 
cbo.DataSource = null; 
cbo.DisplayMember = oldDisplayMember; 

No es bonita, pero que va a trabajar.

+0

Por lo que su cómo debe comportarse, ¿no es así ??? –

+0

Bueno, "funciona como está escrito" ;-p Pero infringe algunos comportamientos de propiedad típicos (es decir, efectos secundarios inesperados). –

0

Cuando se produce una excepción o si el valor de la fuente de datos es nulo, entonces Displaymember se establece en una cadena vacía.

Usando un descompilador de código .NET, hay comentarios en el código sobre cómo funciona esto. Intentaré parafrasear.

Las excepciones pueden ser lanzadas en las siguientes circunstancias:

  1. código de la aplicación en DataSourceChanged
  2. Durante vinculante cuando se formatea los datos para la visualización
  3. Si el valor DisplayMember no es válida en la nueva Fuente de datos.

El comentario también menciona que la excepción real es "deglutida" para evitar el incumplimiento del comportamiento esperado.

Personalmente encontré este comportamiento y, como no se lanza la excepción, es difícil determinar cuál de estas condiciones provocó el reinicio. Probablemente haya una mejor manera, pero por ahora estoy usando esto en mi control personalizado. La propiedad origen de datos es válido cuando se ajusta el DisplayMember después de que se haya restablecido por lo que realmente no estoy seguro de por qué está fallando:

public new object DataSource 
    { 
     get { return base.DataSource; } 
     set 
     { 
      string displayMem = this.DisplayMember; 
      base.DataSource = value; 
      if (string.IsNullOrEmpty(this.DisplayMember) && string.IsNullOrEmpty(displayMem)) 
       this.DisplayMember = displayMem; 
      DetermineDropDownWidth(); 
     } 
    } 
Cuestiones relacionadas