【发布时间】:2013-12-28 07:34:30
【问题描述】:
首先是我的代码。我有一堂课:
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 包含两个项目,它应该显示“John”和“Mike”,但它没有。组合框两次显示类 Person 的类型名称(带有命名空间)。此外,静态字段“test”的值为“11”,这意味着事件处理程序已被调用。但是下一行(转换为字符串)应该抛出异常,但事实并非如此。为什么?接下来,当我单击组合框并更改所选值时,将调用事件处理程序并引发异常(告诉它不能转换为字符串)。
那么,为什么combobox在设置DataSource的时候不抛出异常呢?
为什么组合框显示类型名称而不是定义的属性“名称”?
我想知道为什么这个控件会这样,我在 .NET 文档和 Internet 上都没有找到任何答案。
当我将错误的行更改为正确的版本时,一切正常。
【问题讨论】:
-
您有问题的代码周围有
try/catch块吗?您没有在示例中显示一个。添加它并查看是否引发了异常。 Winforms 可以根据加载过程的复杂性吞下异常。 -
有趣!我尝试调试您发布的相同代码,它在 SelectedIndexChanged 中引发异常,但它不会破坏应用程序。看起来异常在某处被捕获??!!
-
直接运行程序会不会崩溃? IE。在调试器之外。运行程序时会发生某类异常,但在调试时不会发生。您始终可以将异常设置为始终导致中断(甚至是捕获的中断),这至少可以让您看到异常。
-
@P.Brian.Mackey :不,我没有 try/catch 块中的代码。但是当我添加一个 try/catch 块时,代码会正常运行,因此如果没有该块,就会抛出异常并吞没某处。
-
@j.i.h. :不,直接运行和在调试器中运行的行为相同。
标签: c# .net winforms combobox datasource