1. 程式人生 > >combobox2根據combobox1的值繫結,第一次載入時的問題

combobox2根據combobox1的值繫結,第一次載入時的問題

我做的是這樣的:combobox2根據combobox1中的值來繫結的,第一次就需要獲取到combobox1中的值,但這個時候因為combobox1還沒載入到頁面中,還是實體,就開始SelectedIndexChanged該方法了,無法轉化實體,就會報錯

combobox1的繫結

            this.cbo1.DataSource = 類名.方法名();
            this.cbo1.ValueMember = "id";
            this.cbo1.DisplayMember = "name";

一般我們會使用SelectedIndexChanged方法來做

//繫結combobox2方法
private void cbo1_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.cbo2.DataSource = 類名.方法名(Convert.ToInt32(this.cbo1.SelectedValue));
            this.cbo2.ValueMember = "id";
            this.cbo2.DisplayMember = "name";
        }

最後發現一種笨笨的辦法

combobox1使用SelectionChangeCommitted方法(該方法是在選擇選項後並關閉了下拉後才會執行)這樣第一次載入時不會出錯,但是combobox2不會有資料,combobox1操作後才會響應,但這樣不是我們要做的效果!這時我們要在窗體載入事件中繫結一次combobox2,這樣就完美了!

正確方式:

/// <summary>
        /// 窗體載入事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            //繫結combobox1
            this.cbo1.DataSource = 類名.方法名();
            this.cbo1.ValueMember = "id";
            this.cbo1.DisplayMember = "name";
            //繫結combobox2
            this.cbo2.DataSource = 類名.方法名(Convert.ToInt32(this.cbo1.SelectedValue));
            this.cbo2.ValueMember = "id2";
            this.cbo2.DisplayMember = "name2";
        }

        /// <summary>
        /// combobox1發生改變時
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cbo1_SelectionChangeCommitted(object sender, EventArgs e)
        {
            //繫結combobox2
            this.cbo2.DataSource = 類名.方法名(Convert.ToInt32(this.cbo1.SelectedValue));
            this.cbo2.ValueMember = "id2";
            this.cbo2.DisplayMember = "name2";
        }
如果有大神有好辦法,歡迎來頂!!!奮鬥