C#中comboBox綁定數據集後事件中取值出System.data.dataRowView問題

寫了一段代碼,希望通過comboBox選項自動關聯填充另外兩項輸入框時發現數據獲取異常
comboBox綁定數據源代碼如下:
            this.cbKHMC.DataSource = dt;
            this.cbKHMC.DisplayMember = "Name";

            this.cbKHMC.ValueMember = "Value";

 

在獲取值selectvalue總是類型爲

           調試時窗口界面數據顯示正常,但設置斷點候發現strKHMC首次返回的總是System.data.dataRowView

當使用Combobox控件時,出現SelectedValue的值爲“System.Data.DataRowView”的原因有兩個:在Combobox的DataSource不爲空的情況下,要麼是沒有爲ValueMember賦值,要麼是賦值賦錯了,這兩種情況下系統就會把SelectedValue的默認值輸出來(注意紅色部分,如果DataSource爲空,那麼SelectedValue的值爲null)。但有時即使你對ValueMember賦了正確的值也會出現這個問題,這裏有一個賦值時機選擇的問題

文本框顯示的是“System.Data.DataRowView”,前面說過,只有在沒有爲Combobox指定ValueMember的值或指定錯的情況下才會是該字符串,可程序已經正確指定了ValueMember爲什麼還是這個結果呢?我試着選擇其他的下拉項,發現顯示的結果變成了預想的值,原因何在?
       仔細觀察程序發現原因在於ValueMember賦值的時機,上面的代碼當執行完DataSource賦值語句之後,觸發了SelectedIndexChanged事件,而此時還未指定ValueMember,所以窗體初次初始化後顯示的是“System.Data.DataRowView”,解決方法很簡單:只需把DataSource賦值語句放到DisplayMember、ValueMember語句之後。

突然想到Combobox還有一個事件是SelectedValueChanged,還是上面的程序,把SelectedIndexChanged替換爲SelectedValueChanged,會是什麼效果呢?試了一下,沒有報錯,並且窗體初始化完畢後顯示的就是預期的值0。呵呵,又找到了一種解決方法。問題還沒完,請接着往下看:
上面SelectedValueChanged的試驗中,DataSource是在DisplayMember、ValueMember前面的,如果放到它們兩個後面呢?繼續嘗試,這次報錯了——“未將對象引用到對象的示例”,對程序進行跟蹤,當執行完this.comboBox1.ValueMember = "Value"語句之後,程序轉到了comboBox1_SelectedIndexChanged方法,在this.textBox1.Text = this.comboBox1.SelectedValue.ToString();語句處報錯,SelectedValue的值爲空,因爲此時還沒有給DataSource賦值,所以報這個錯。
現在可以總結了,當使用SelectedIndexChanged時,ValueMember在DataSource前進行賦值,當使用SelectedValueChanged時,ValueMember在DataSource後進行賦值。

 


還有一個問題很有意思,如下所示:
this.comboBox1.DisplayMember = "Name";
this.comboBox1.ValueMember = "ValueError";
   this.comboBox1.DataSource = table;
上面故意把ValueMember的值寫錯了,運行起來沒有任何問題(是指沒有報錯,此時的SelectedValue值都爲System.Data.DataRowView),然後我們對這三行代碼的順序做一下調整,如下:
   this.comboBox1.DataSource = table;
this.comboBox1.DisplayMember = "Name";
this.comboBox1.ValueMember = "ValueError";
上面ValueMember的值依舊是錯的,但是對其賦值操作放到了DataSource語句之後,運行程序,在ValueMember賦值語句處報錯如下:“無法綁定到值成員”。
當指定了DataSource的值後再對ValueMember賦錯,如果此時賦值賦錯的話,運行時就會報錯,如果是在DataSource語句之前對ValueMember賦值則不會報錯,大家在應用的時候一定要注意。

解決方案:

comboBox綁定數據源代碼調整爲:                     

            this.cbKHMC.DisplayMember = "Name";
            this.cbKHMC.ValueMember = "Value";
            this.cbKHMC.DataSource = dt;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章