2012-01-04 4 views
5

Sto sviluppando una piccola app per desktop e sul mio modulo ci sono diversi elenchi a discesa (combobox). Compongo un elenco di stringhe, che verranno utilizzate come origine dati per tutte. Ecco esempio dalla mia classe Form.cs:Strano comportamento del controllo a combinazione di Windows Form

List<string> datasource = new List<string>(); 
datasource.Add("string 1"); 
datasource.Add("string 2"); 

Poi ho impostato questa lista come fonte di dati per diversi comboboxes:

cmbDataType1.DataSource = datasource; 
cmbDataType2.DataSource = datasource; 

Tutto questo accade in stesso metodo, che è chiamato dal modulo costruttore. Ecco la parte strana: dopo aver modificato un valore selezionato in uno di essi, lo stesso valore verrà impostato nell'altro. Non ci sono eventi SelectedIndexChange impostati. Ho incasinato da qualche parte, ma non posso mettere il mio dito dove ...

+1

Ecco [un collegamento a un post di blog] (http://blogs.msdn.com/b/bethmassi/archive/2007/09/19/ binding-multiple-comboboxes-to-the-same-datasource.aspx) che ne parla un po '. Si tratta di vb.net, ma la descrizione del comportamento dovrebbe essere la stessa in entrambi i casi. –

+0

Ha davvero chiarito alcune cose, grazie amico. –

risposta

10

Il comportamento visualizzato è di progettazione. Quando si associa lo stesso oggetto dell'origine dati per più controlli, tutti i controlli condividono la stessa origine di associazione.

Se si assegna in modo esplicito una nuova fonte di legame ad ogni controllo, anche quando si utilizza la stessa origine dati, tutti i controlli sarà legato e agirà indipendenti l'uno dall'altro:

cmbDataType1.DataSource = new BindingSource(datasource, ""); 
cmbDataType2.DataSource = new BindingSource(datasource, ""); 
+0

Funziona alla grande, grazie. –

3

Poiché si sta vincolando allo stesso identico datasource questo è il comportamento previsto. Dovrai cambiare il tuo binding in modo da essere un binding OneWay o utilizzare oggetti diversi se non vuoi che l'argomento selezionato cambi.

+0

Comunque è ancora curioso. L'origine dati è un elenco di stringhe. In che modo combobox 2 sa che l'indice selezionato è cambiato in combobox 1? Non c'è modo di memorizzare tali informazioni in un elenco. –

+0

Questa è solo la magia del binding a un'origine dati. La modifica dell'indice in combobox1 è ciò che ha detto all'origine dati di spostare il puntatore interno che a sua volta attiva la modifica in combobox2. –

+0

Sto solo provando ad allenare l'implementazione per la mia curiosità ... quindi immagino che avvolgano la lista in una struttura di origine dati con i dati necessari, cose come "voce corrente". In che modo entrambe le caselle combinate hanno un riferimento allo stesso wrapper? Presumo che entrambi ne creerebbero uno quando fossero impostate le rispettive proprietà 'DataSource', il che significa che la comunicazione non funzionerebbe. Interessante ... –

4

si dovrebbe impostare un nuovo BindingContext per il controllo prima di legare il dataSource la prossima volta:

cmbDataType1.BindingContext = new BindingContext(); 
cmbDataType1.DataSource = datasource; 

cmbDataType2.BindingContext = new BindingContext(); 
cmbDataType2.DataSource = datasource; 
+0

Grazie per la risposta rapida, funziona come un fascino! : D –