加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 05:41:19 所属栏目:百科 来源:网络整理
导读:首先我的代码.我有一节课: 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(); 在我
首先我的代码.我有一节课:
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不会抛出任何异常?

为什么combobox显示类型名称而不是定义属性’Name’?

我想知道为什么这个控件的行为方式如此,我在.NET文档和Internet上找不到任何答案.

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

解决方法

我在google上搜索combobox源代码,看看它是如何实现的,以及为什么异常被埋没了,我发现了这个:

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

我希望这些信息对你有用!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读