C#中comboBox下拉框中實現多選

原文地址:http://www.codeproject.com/Articles/21085/CheckBox-ComboBox-Extending-the-ComboBox-Class-and?msg=4535944#xx4535944xx

譯者注:本方法和用checkbox, listbox等控件和事件拼湊出來的不同,本方法基本實現了控件的順滑度,下拉框可懸浮等效果,可以認爲是comboBox的升級版,使用方便,僅需引用編譯好的DLL,直接在toolBox拖拽出控件即可。


簡介

在工作中,我需要用一個佔地方很小的控件,來實現很大空間的下拉選擇。顯然,我們首先想到的是用CheckBoxComboBoxcontrol來代替一組的checkbox,網上有很多這樣的方法,但是都有或多或少的缺點。

有些做法只是假裝在Popup中畫了個check box,所以這個假的checkbox並沒有完整的checkbox的屬性,當用戶想要選擇更多的選項時,Popup已經關閉了;還有一種方法呢,又沒有正常ComboBox的屬性,比如你不能綁定數據源給他。

現在我要介紹的這個CheckBoxComboBox 控件,是完全集成了.net的ComboBox 和CheckBoxes,我創建了一個wrapper 用來存放ComboBox.Items,而不是用現有的CheckBoxListBox 。另一點需要特別提到的是,我還是使用的Lukasz Swiatkowski提供的PopUp 解決方案,他解決了普通的PopUp 存在的問題,比如自定義大小,位置,焦點控制等。

背景:

本自定義控件CheckBoxComboBox 提供了一個CheckBoxItems 屬性,即在ComboBox 的下拉選項顯示爲CheckBoxes。控件提供了一個CheckBoxCheckedChanged 事件,可以實現把選中的項目在下拉列表中勾選出來。

使用步驟:

原文中沒有STEP BY STEP的提到如何使用,但我想大家想知道的肯定只想知道如何實現圖片所要達到的效果,那麼我們快速的來使用吧。

1)下載源碼;

原文裏可以直接下載http://www.codeproject.com/KB/combobox/extending_combobox/CheckBoxComboBox.zip

我在資源裏也上傳了一份

http://download.csdn.net/detail/babyqian84/5458185

2)編譯DLL;

我使用的vs2008編譯的,dll在2008,2010都可以使用,已經測試過。

上面的下載路徑裏面,原文地址下載的沒有編譯好的DLL,需要自己編譯,我上傳的資源中有dll,在\CheckBoxComboBox\CheckBoxComboBox\bin\Debug路徑下,建議還是自己編譯一下,項目中有源碼和例子;

3)添加DLL到工具箱;

4)拖拽控件到你的窗口上;

5)用操作combobox相同的方法操作這個控件CheckBoxComboBox ,給它賦值;

6)擴展:增加全選功能

private void checkBoxComboBoxProd_CheckBoxCheckedChanged(object sender, EventArgs e)
        {
                if (checkBoxComboBoxProd.CheckBoxItems[0].Checked == true)
                {
                    foreach (var item in checkBoxComboBoxProd.CheckBoxItems)
                    {
                        item.Checked = true;
                    }
                    checkBoxComboBoxProd.Text = "ALL";
                }
                else if (checkBoxComboBoxProd.SelectedIndex == 0)
                {
                    foreach (var item in checkBoxComboBoxProd.CheckBoxItems)
                    {
                        item.Checked = false;
                    }
                    checkBoxComboBoxProd.Text = "";
                }
                 else
                {
                    checkedProd = "";
                    foreach (var item in checkBoxComboBoxProd.CheckBoxItems)
                    {
                        if (item.Checked == true)
                        {
                            checkedProd = checkedProd + "'" + item.Text + "',";
                        }
                    }
                    if (checkedProd.Length > 0)
                        checkedProd = checkedProd.Remove(checkedProd.Length - 1);
                    checkBoxComboBoxProd.Text = checkedProd;
                }
        }

7)遺留問題:控件彈出框的高度是可以調的,但是沒有屬性可以控制它的默認高度,目前空間的默認高度被設置爲大概8個選項,但比如我想設置默認高度爲20個選項,這個我還沒有找到方法,原文裏也是有人提問過,但原作者沒有回答,感興趣的朋友可以試着看看源碼看有沒有方法。




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