2009-03-13 13 views
8

Ho un ComboBox i cui elementi sono impostati utilizzando la proprietà DataSource. DataSource è una raccolta di un oggetto personalizzato (che ha una proprietà stringa "Value" e proprietà int "Id"). Nei controlli di inizializzazione, ho impostato il DisplayMember come Valore e ValueMember come Id. Ora ho provato a cancellare il DataSource chiamando,DisplayMember reset su DataSource = null

myComboBox.DataSource = null; 

Quando ho fatto questo, il mio DisplayMember viene resettato a "" automaticamente. Sto cancellando correttamente DataSource ?? È così che dovrei comportarmi ???

risposta

3

Posso riprodurlo ... non è qualcosa che mi sarei aspettato, ma sembra che dovrai semplicemente reimpostare lo DisplayMember in seguito.

Guardando in riflettore, questo è abbastanza intenzionale:

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

sicuro della ragionamenti dietro quella, ma semplicemente:

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

Non abbastanza, ma che funzionerà.

+0

Così la sua come dovrebbe comportarsi, non è vero ??? –

+0

Bene, "funziona come scritto" ;-p Ma viola alcuni tipici comportamenti di proprietà (cioè effetti collaterali imprevisti). –

0

In caso di lancio di un'eccezione o se il valore dell'origine dati è nullo, il Displaymember è impostato su una stringa vuota.

Utilizzo di un decompilatore di codice .NET, ci sono commenti nel codice su come funziona. Proverò a parafrasare.

Eccezioni possono essere gettati nei seguenti casi:

  1. codice di applicazione su DataSourceChanged
  2. Durante vincolante quando i dati vengono formattati per la visualizzazione
  3. Se il valore DisplayMember non è valido per la nuova Fonte di dati.

Il commento indica anche che l'effettiva eccezione è "ingoiata" per evitare di rompere il comportamento previsto.

Personalmente mi sono imbattuto in questo comportamento e poiché l'eccezione non è stata lanciata è difficile capire quale di queste condizioni ha causato il reset. Probabilmente c'è un modo migliore ma per ora lo sto usando nel mio controllo personalizzato. la proprietà DataSource è valida quando si imposta il DisplayMember dopo che è stato ripristinato, quindi non sono veramente sicuro di questo che è mancato:

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(); 
     } 
    }