当使用Combobox控件时,出现SelectedValue的值为“System.Data.DataRowView”的原因有两个:在Combobox的DataSource不为空的情况下,要么是没有为ValueMember赋值,要么是赋值赋错了,这两种情况下系统就会把SelectedValue的默认值输出来(如果DataSource为空,那么SelectedValue的值为null)。但有时即使你对ValueMember赋了正确的值也会出现这个问题,这里有一个赋值时机选择的问题:
DataSource在ValueMember之前赋值,先触发SelectedValueChanged

再触发SelectedIndexChanged,但获取到的值都是“System.Data.DataRowView”;
此时把 DataSource赋值放最后:

当给ValueMember赋值时,会去触发SelectedValueChanged,此时cboTabs.Text="",cboTabs.SelectedValue.ToString()引发异常

把cboTabs.SelectedValue.ToString()注释后,继续测试;当给ValueMember赋值时,只会触发SelectedValueChanged;
当走到给DataSource赋值时,又一次触发SelectedValueChanged,此时cboTabs.Text为正确值。
然后接着触发SelectedIndexChanged,此时获取的cboTabs.Text,cboTabs.SelectedValue.ToString()都是正确的。
再次把DataSource位置调整,放在DispalyMember之后,ValueMember之前。在给DataSource赋值时,触发SelectedValueChanged,
此时cboTabs.Text取值正确,cboTabs.SelectedValue.ToString()=“System.Data.DataRowView”;接着触发的SelectedIndexChanged,
取值也是一样的;那么继续接着往下跑,当给ValueMember赋值时,触发了SelectedValueChanged,此时cboTabs.Text=“System.Data.DataRowView”,
而cboTabs.SelectedValue.ToString()取值正确。
由以上情况均在调试时发现,现总结出以下几点:
1、给DataSource 进行赋值会触先触发SelectedValueChanged,再触发SelectedIndexChanged;
给DisplayMember进行赋值不会触发SelectedValueChanged和SelectedIndexChanged;
给ValueMember 进行赋值会触发SelectedValueChanged,但不会触发SelectedIndexChanged;
2、使用SelectedValueChanged事件时,为避免SelectedValue.ToString()引发异常,DataSource赋值需在ValueMember之前
3、使用SelectedIndexChanged事件时,为避免第一次取值出现“System.Data.DataRowView”,DataSource赋值可在ValueMember之后
以上均是个人观点,希望对大家有所帮助;如有错误,还望各位指出。
