1. 程式人生 > >.NET控制元件ComboBox繫結資料來源的一個Bug及解決方法

.NET控制元件ComboBox繫結資料來源的一個Bug及解決方法

ComboBox常用於繫結到一個數據源表的某個欄位,提供選擇並更新功能。下面用具體例項介紹它的一個Bug及解決辦法。

1、演示Bug的程式碼

窗體Form1上有組合框comboBox1和一個顯示資料表字段的按鈕button1,演示程式碼如下:

InitiateControl()方法的功能:設定組合框comboBox1的DropDownStyle為DropDownList,填充其Items為3個顏色名;建立一個DataTable的資料表ColorTable,該表含字元型欄位Color,並新增值為Red的行;最後繫結comboBox1的Text屬性到ColorTable當前行的Color欄位。

ShowColorValue()方法的功能:獲取並顯示組合框繫結資料來源的第一行的Color欄位值。

編譯執行上述演示程式碼:

  • 擊button1,顯示的是初始值Red;
  • 如果用Mouse下拉組合框並選擇任意一個顏色,然後點選button1,此時顯示的也是comboBox1的Text值;
  • 如果在comboBox1控制元件上用游標鍵(左右上下翻頁頁首頁尾鍵→、←、↑、↓、PageUp、PageDown、Home、End)選擇一個顏色值,或用Mouse滾動選擇一個顏色值,點選button1,此時顯示的不是comboBox1的當前Text文字值,而是資料表ColorTable原來的值!就是說,選擇的comBoxBox的Text值根本沒有反映並回存資料表ColorTable中!

2、解決方法

檢視comboBox1的DataBindings[0]屬性(即Binding類物件),其WriteValue()用於寫當前Text值到繫結資料來源。只需要在SelectedIndex值改變時,呼叫該方法即可。為了利用下拉時組合框還是可以自動回寫值到資料來源的能力,可以設定一個標誌boxDropDown,判斷當前SelectedIndex是否由下拉動作激發。下面給出解決上述問題的程式碼。

上述程式碼有如下改變:

  1. 增加了兩個成員欄位:boxDropDown、curSelectedIndex,第一用於表示是否下拉了組合框,第二個表示下拉時當前的選擇項索引;
  2. 在Form1_Load方法中增加了一個繫結事件的方法BindingEvents(),該方法繫結組合框的DropDown事件和SelectedIndexChanged事件。第一個事件用於捕獲是否有下拉動作,第二個事件用於捕獲選擇項值改變、沒有下拉動作、有繫結資料來源時回寫選定值(即呼叫WriteValue()方法)。

3、結束語

使用VS2005+.NET 2.0、VS2008+.NET 3.5,Bug依然存在。特別指出,上述Bug僅在組合框DropDownStyle屬性為DropDownList時存在。對DropDrowDtyle為DropDown時,不管是滑鼠下拉還是鍵盤選擇,ComboBox控制元件均自動回寫當前Text值到繫結的資料來源中。