1. 程式人生 > >C#中comboBox下拉框中實現多選

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

譯者注:本方法和用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)下載原始碼;

我在資源裡也上傳了一份

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個選項,這個我還沒有找到方法,原文裡也是有人提問過,但原作者沒有回答,感興趣的朋友可以試著看看原始碼看有沒有方法。