C# 组合框设置DisplayMember,数据源前后的ValueMember

C# 组合框设置DisplayMember,数据源前后的ValueMember,c#,winforms,datatable,combobox,event-handling,C#,Winforms,Datatable,Combobox,Event Handling,我试图通过实体框架学习一些基本的数据操作。在这个特定的场景中,我碰巧在网上发现了一些模棱两可的代码行 我有一个组合框,其中DisplayMember属性和ValueMember属性设置为某个表的特定列名。到目前为止,我的解释是在设置Combobox的DataSource属性之后绑定DisplayMember和ValueMember,因为这感觉更直观。像这样: ComboBox1.DataSource = SalesEntity.Products.ToList(); ComboBox1.Displ

我试图通过实体框架学习一些基本的数据操作。在这个特定的场景中,我碰巧在网上发现了一些模棱两可的代码行

我有一个组合框,其中DisplayMember属性和ValueMember属性设置为某个表的特定列名。到目前为止,我的解释是在设置Combobox的DataSource属性之后绑定DisplayMember和ValueMember,因为这感觉更直观。像这样:

ComboBox1.DataSource = SalesEntity.Products.ToList();
ComboBox1.DisplayMember = "CategoryName"
ComboBox1.ValueMember = "CategoryId"
在我目前正在进行的一个项目中,我得到了一个CastException,使用这种方法。我知道这确实是一个运行时错误,但我看不到我的表单(进程已经启动,但尚未显示)!我发现SelectedIndexChanged事件会在表单加载时立即触发。在谷歌点击几下后,我发现了这样一条线索:

它解释了应该在将DisplayMember和ValueMember属性与列绑定后设置数据源,以避免这些错误

ComboBox1.DisplayMember = "CategoryName"
ComboBox1.ValueMember = "CategoryId"
ComboBox1.DataSource = SalesEntity.Products.ToList();
虽然有效,但我想知道为什么有效?

我的想法:我假设首先将ComboBox设置为dataSource,初始化SelectedIndex 属性,并在设置ValueMember/DisplayMember属性时,根据绑定到这些属性的类型(ValueMember/DisplayMember)的默认值更改SelectedIndex属性。然而,设置数据源最终避免了属性的重新初始化。如果我错了,请纠正我。
必须进行一些初始化,事件才能在加载后立即触发。
哪个初始化会如此快地触发此事件?

设置DisplayMember属性时,需要取消对数据源的链接并重新分析。您可以在组合框实现注释中看到它,其中被称为。。。。。。在基类和。如果您首先设置
DisplayMember
,并且
DataSource
为空,则不会发生任何事情。如果你把它设定在。。。请参阅与该属性相关的注释。@Jimi,现在您已经指出了引用中的链接,我明白了。请您把它写下来,我会把它标记为答案。当您设置DisplayMember属性时,需要取消对数据源的解析并重新解析。您可以在组合框实现注释中看到它,其中被称为。。。。。。在基类和。如果您首先设置
DisplayMember
,并且
DataSource
为空,则不会发生任何事情。如果你把它设定在。。。请参阅与该属性相关的注释。@Jimi,现在您已经指出了引用中的链接,我明白了。请你把它写下来,我会记下来作为答案。