首先是我的代码。我有一节课:
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”,这意味着已经调用了事件处理程序。但下一行(使用强制转换为字符串)应抛出异常,但事实并非如此。为什么?接下来,当我单击组合框并更改所选值时,将调用事件处理程序并抛出异常(告知它不能转换为字符串)。
那么,为什么在设置DataSource时,combobox不会抛出任何异常?
为什么组合框显示类型名称而不是定义属性“名称”?
我想知道为什么这个控件会以这种方式运行,我在.NET文档和Internet上找不到任何答案。
当我将错误的行更改为正确的版本时,一切正常。
答案 0 :(得分:3)
我在谷歌搜索组合框源代码,看看它是如何实现的,以及为什么异常被埋没了,我发现了这个:
有趣的是,如果你在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位计算机中。
我希望这些信息有用!
答案 1 :(得分:0)
执行以下操作,您的组合框将起作用:
comboBox_Persons.DataSource = persons.ToArray();
这就是我要做的事情:
Person p = (Person) comboBox_Persons.SelectedItem;
现在你拥有了这个人的所有属性
但下一行(使用强制转换为字符串)应抛出异常,但事实并非如此。为什么? - 你的值是整数。将整数转换为字符串应该抛出异常。虽然,我相信你没有int
。 “......它应该显示”John“和”Mike“,但它没有。组合框显示类Person的类型名称(带名称空间)两次......” - 因为你应该persons.ToArray()
来获取“约翰”和“迈克”。
那么,为什么在设置DataSource时,combobox不会抛出任何异常? - 因为它只是一个设置,并且在执行某些操作之前,您可以将任何内容设置为数据源。
更改此
public static string test = "";....test = test + "1";
到此
public static int test = 0; ..... test += 1;
祝你好运