Prima il mio codice. Ho una classe:Perché ComboBox non genera un'eccezione quando si imposta DataSource?
class Person {
public int Id { set; get; }
public string Name { set; get; }
public Person(int i, string n) {Id = i; Name = n;}
}
e un oggetto ComboBox:
this.comboBox_Persons = new System.Windows.Forms.ComboBox();
e da qualche parte nel mio codice:
List<Person> persons = new List<Person>() {
new Person(5, "John"),
new Person(8, "Mike")
};
comboBox_Persons.Items.Clear();
comboBox_Persons.DisplayMember = "Name";
comboBox_Persons.ValueMember = "Id";
comboBox_Persons.DataSource = persons;
e un membro statico e un gestore di eventi:
public static string test = "";
void comboBox_PersonsSelectedIndexChanged(object sender, EventArgs e)
{
test = test + "1";
string id = (string) comboBox_Persons.SelectedValue;
}
L'ultima riga è sbagliata (viene s da una versione precedente del mio codice) e dovrebbe essere:
int id = (int) comboBox_Persons.SelectedValue;
e mi c'è voluto del tempo per rendersi conto che il mio problema è in questa linea.
Ma la mia domanda riguarda la versione errata della riga e esattamente il codice sopra riportato.
Perché non viene generata alcuna eccezione quando comboBox_Persons.DataSource viene riempito?
Quando il mio modulo è pronto comboBox_Persons contiene due elementi e dovrebbe visualizzare "John" e "Mike" ma non è così. La casella combinata visualizza il nome del tipo (con spazio dei nomi) della classe Persona due volte. Inoltre, il valore del campo statico 'test' è "11", il che significa che il gestore eventi è stato richiamato. Ma la riga successiva (con il cast dello string) dovrebbe generare un'eccezione, ma non lo fa. Perché? E poi, quando clicco sulla casella combinata e cambio il valore selezionato, viene chiamato il gestore di eventi e viene lanciata un'eccezione (che dice che non può eseguire il cast sulla stringa).
Quindi, perché combobox non genera eccezioni durante l'impostazione di DataSource?
E perché nella casella combinata vengono visualizzati i nomi dei tipi anziché la proprietà definita 'Nome'?
Mi chiedo perché questo controllo si comporta in questo modo e non ho trovato alcuna risposta nella documentazione .NET e su Internet.
Quando cambio la riga sbagliata nella versione corretta tutto è OK.
Avete un blocco 'try/catch' attorno al codice in questione? Non ne mostri uno nel tuo esempio. Aggiungilo e vedi se viene sollevata l'eccezione. Le Winform possono ingoiare le eccezioni a seconda delle complessità del processo di caricamento. –
Interessante! Ho provato a eseguire il debugging dello stesso codice che hai postato e sta generando un'eccezione in SelectedIndexChanged, tuttavia non ha infranto l'applicazione. Sembra che l'eccezione venga catturata da qualche parte ?? !! – Poornima
Si blocca durante l'esecuzione diretta del programma? Cioè al di fuori del debugger. Esiste una certa classe di eccezioni che si verifica durante l'esecuzione del programma ma non durante il debug. È sempre possibile impostare eccezioni per causare sempre un'interruzione (anche se sono state rilevate) e questo consentirà almeno di vedere l'eccezione. –