首先是我的代码。我有一个类:
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;
}
最后一行是错误的(它来 self 的代码的早期版本),应该是:
int id = (int) comboBox_Persons.SelectedValue;
我花了一些时间才意识到我的问题出在这一行。
但我的问题是关于该行的错误版本以及上面的代码。
为什么在 comboBox_Persons.DataSource 被填充时没有抛出异常?
当我的表单准备就绪时,comboBox_Persons 包含两个项目,它应该显示“John”和“Mike”,但实际上没有。组合框两次显示类 Person 的类型名称(带有命名空间)。此外,静态字段“test”的值为“11”,这意味着事件处理程序已被调用。但是下一行(转换为字符串)应该抛出异常,但它没有。为什么?接下来,当我单击组合框并更改所选值时,将调用事件处理程序并抛出异常(告知它无法转换为字符串)。
那么,为什么combobox在设置DataSource时不会抛出任何异常呢?
为什么组合框显示类型名称而不是定义的属性“名称”?
我想知道为什么这个控件会这样,我在 .NET 文档和 Internet 上没有找到任何答案。
当我将错误的行更改为正确的版本时,一切正常。
最佳答案
我在谷歌上搜索组合框源代码以了解它是如何实现的以及为什么异常被埋没,我发现了这个:
有趣的是,如果您在 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 事件中容易出现异常的代码不会破坏应用程序!!组合框 SelectedIndexChanged 事件的情况与此类似。
我无法测试修补程序,因为我的机器上没有安装 Win 7 SP1。但是,从博客中的评论来看,该修补程序实际上并没有解决 64 位机器中隐藏异常的所有问题。
希望这些信息对您有所帮助!
关于c# - 为什么 ComboBox 在设置 DataSource 时不抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20500326/