Первый мой код. У меня есть класс:Почему ComboBox не выбрасывает исключение при настройке DataSource?
class Person {
public int Id { set; get; }
public string Name { set; get; }
public Person(int i, string n) {Id = i; Name = n;}
}
и объект ComboBox:
this.comboBox_Persons = new System.Windows.Forms.ComboBox();
и где-то в моем коде:
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;
и статический член и обработчик события:
public static string test = "";
void comboBox_PersonsSelectedIndexChanged(object sender, EventArgs e)
{
test = test + "1";
string id = (string) comboBox_Persons.SelectedValue;
}
Последняя строка неверна (она пришла с более ранней версии моего кода), и это должно быть:
int id = (int) comboBox_Persons.SelectedValue;
и мне потребовалось некоторое время, чтобы понять, что моя проблема в этой строке.
Но мой вопрос касается неправильной версии строки и точно о коде выше.
Почему не исключено исключение, если comboBox_Persons.DataSource заполнен?
Когда моя форма готова, comboBox_Persons содержит два элемента, и он должен отображать «Джон» и «Майк», но это не так. В поле со списком отображается имя типа (с пространством имен) класса Person дважды. Более того, значение статического поля «test» равно «11», что означает, что обработчик события был вызван. Но следующая строка (с кастом в строку) должна вызывать исключение, но это не так. Зачем? И затем, когда я нажимаю на combobox и изменяю выбранное значение, вызывается обработчик события и генерируется исключение (говорящее, что он не может передать в строку).
Итак, почему combobox не создает никаких исключений при настройке DataSource?
И почему combobox отображает имена типов вместо определенного свойства «Имя»?
Интересно, почему этот контроль ведет себя таким образом, и я не нашел ответа в документации .NET и в Интернете.
Когда я меняю неправильную строку на правильную версию, все в порядке.
У вас есть блок try/catch вокруг кода? Вы не показываете его в своем примере. Добавьте его и посмотрите, создано ли исключение. Winforms может проглатывать исключения в зависимости от сложности процесса загрузки. –
Интересно! Я попробовал отлаживать тот же код, который вы опубликовали, и он выбрасывает исключение в SelectedIndexChanged, однако его не нарушает приложение. Похоже, что исключение попадает куда-то ??? !! – Poornima
Сбой при запуске программы напрямую? То есть вне отладчика. Существует определенный класс исключения, который будет возникать при запуске программы, но не во время отладки. Вы всегда можете устанавливать исключения, чтобы всегда вызывать перерыв (даже пойманные), и это, по крайней мере, позволит вам увидеть исключение. –