2013-12-10 2 views
5

Первый мой код. У меня есть класс:Почему 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 и в Интернете.

Когда я меняю неправильную строку на правильную версию, все в порядке.

+0

У вас есть блок try/catch вокруг кода? Вы не показываете его в своем примере. Добавьте его и посмотрите, создано ли исключение. Winforms может проглатывать исключения в зависимости от сложности процесса загрузки. –

+0

Интересно! Я попробовал отлаживать тот же код, который вы опубликовали, и он выбрасывает исключение в SelectedIndexChanged, однако его не нарушает приложение. Похоже, что исключение попадает куда-то ??? !! – Poornima

+0

Сбой при запуске программы напрямую? То есть вне отладчика. Существует определенный класс исключения, который будет возникать при запуске программы, но не во время отладки. Вы всегда можете устанавливать исключения, чтобы всегда вызывать перерыв (даже пойманные), и это, по крайней мере, позволит вам увидеть исключение. –

ответ

0

Выполните следующие действия и комбо коробка будет работать:

comboBox_Persons.DataSource = persons.ToArray(); 

Это то, что я хотел бы сделать:

Person p = (Person) comboBox_Persons.SelectedItem; 

Теперь у вас есть все свойства личности

Но следующая строка (с кастом в строку) должна вызывать исключение, но это не так. Зачем? - ваше значение целое. Кастинг целых чисел в строку должен вызывать исключение. Хотя, я считаю, у вас нет int. «... он должен отображать« John »и« Mike », но это не так. В combobox отображается имя типа (с пространством имен) класса Person дважды ...» - потому что вы должны сделать persons.ToArray(), чтобы получить «John» и "Майк".

Итак, почему combobox не создает никаких исключений при настройке DataSource? - поскольку это только настройка, и пока не выполняется какая-либо операция, вы можете установить что-либо как источник данных.

Изменить этот

public static string test = "";....test = test + "1"; 

Для этой

public static int test = 0; ..... test += 1; 

Удачи

+0

На самом деле это исключение, если вы меняете значение на другой тип! Вы можете преобразовать int в строку, но «casting» создаст исключение. Если вы отлаживаете вышеуказанный код, вы заметите, что генерируется исключение «недействительного броска», но в любом случае оно не отменяет приложение. – Poornima

+0

Это потому, что его 'SelectedValue' не' int', как его код идет. После того, как вы выполните 'comboBox_Persons.DataSource = persons.ToArray();' он должен уйти –

+0

В вашем ответе вы процитировали «Почему отлитие целых чисел в строке должно вызывать исключение?». Мой комментарий - ответ на эту строку. «Кастинг» на другой тип всегда выдает исключение, где преобразование не выполняется. В этом случае будет выбрано исключение. – Poornima

3

Я искал на Google для исходного выпадающего кода, чтобы увидеть, как это реализовано и почему исключения становятся погребены и я нашел это:

http://social.msdn.microsoft.com/Forums/vstudio/en-US/69a0b831-7782-4bd9-b910-25c85f18bceb/visual-studio-doesnt-break-on-unhandled-exception-with-windows-64bit?forum=vsdebug

http://social.msdn.microsoft.com/Forums/vstudio/en-US/8a7006a1-ad86-4aec-9604-d7ccf99ce00b/selectedindexchanged-handler-exception-treated-as-first-chance?forum=vsdebug

Интересно, что если добавить строку бросить исключение в вашем SelectedIndexChanged случае, приложение не ломается !!

private void comboBox_persons_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     test = test + "1"; 
     string id = (string)comboBox_Persons.SelectedValue; 
     throw new ApplicationException("Test"); 
    } 

По-видимому, это проблема с 64-битными машинами, и для этой проблемы доступно исправление. Как указано в этом сообщении, исключающий код в событии Form_Load не нарушает работу приложения! Аналогично имеет место событие combobox SelectedIndexChanged.

Я не смог протестировать исправление, так как у меня нет Win 7 SP1, установленного на моей машине. Тем не менее, из комментариев в блоге, исправление на самом деле не устраняет все проблемы с исключениями, которые были захоронены в 64-битных машинах.

Я надеюсь, что эта информация полезна!

+0

Спасибо за ваш ответ. Ссылки, которые вы указали, дайте мне знать больше. Я использую Win8 64bit, и в этой системе исключение исключения из Form_Load работает правильно. Я запустил свой код (с использованием combobox) на Win7 SP1 32bit, и исключение из события SelectedIndexChanged не было выбрано. Я не могу установить исправление, потому что это не мой компьютер. Поэтому я предполагаю, что проблема присутствует во всех системах Microsoft. И это не проблема, чтобы решить ошибку, например, кастинг на строку или аналогичную, но это может потребовать много времени, чтобы найти ее, как это было в моем случае. – Victor

+0

Я знаю, молчание исключений - злейший враг разработчика! Я использую Win7 64bit, и я не получаю исключение в Form_Load даже после явного использования «throw». Я видел другое поведение, когда меняю целевую платформу в своем проекте. Надеюсь, они скоро найдут исправление. – Poornima

Смежные вопросы