當使用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之后
以上均是個人觀點,希望對大家有所幫助;如有錯誤,還望各位指出。
