为什么ComboBox在设置DataSource时不会抛出异常?

时间:2013-12-10 16:49:59

标签: c# .net winforms 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包含两个项目,它应显示“John”和“Mike”,但事实并非如此。组合框显示类Person的类型名称(带名称空间)两次。而且,静态字段'test'的值是“11”,这意味着已经调用了事件处理程序。但下一行(使用强制转换为字符串)应抛出异常,但事实并非如此。为什么?接下来,当我单击组合框并更改所选值时,将调用事件处理程序并抛出异常(告知它不能转换为字符串)。

那么,为什么在设置DataSource时,combobox不会抛出任何异常?

为什么组合框显示类型名称而不是定义属性“名称”?

我想知道为什么这个控件会以这种方式运行,我在.NET文档和Internet上找不到任何答案。

当我将错误的行更改为正确的版本时,一切正常。

2 个答案:

答案 0 :(得分:3)

我在谷歌搜索组合框源代码,看看它是如何实现的,以及为什么异常被埋没了,我发现了这个:

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位计算机中。

我希望这些信息有用!

答案 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;
祝你好运