譯者注:本方法和用checkbox, listbox等控件和事件拼湊出來的不同,本方法基本實現了控件的順滑度,下拉框可懸浮等效果,可以認爲是comboBox的升級版,使用方便,僅需引用編譯好的DLL,直接在toolBox拖拽出控件即可。
簡介
在工作中,我需要用一個佔地方很小的控件,來實現很大空間的下拉選擇。顯然,我們首先想到的是用CheckBoxComboBox
control來代替一組的checkbox,網上有很多這樣的方法,但是都有或多或少的缺點。
有些做法只是假裝在Popup中畫了個check box,所以這個假的checkbox並沒有完整的checkbox的屬性,當用戶想要選擇更多的選項時,Popup已經關閉了;還有一種方法呢,又沒有正常ComboBox的屬性,比如你不能綁定數據源給他。
現在我要介紹的這個CheckBoxComboBox
控件,是完全集成了.net的ComboBox
和CheckBox
es,我創建了一個wrapper
用來存放ComboBox.Items,而不是用現有的CheckBoxListBox 。另一點需要特別提到的是,我還是使用的Lukasz
Swiatkowski提供的PopUp 解決方案,他解決了普通的PopUp
存在的問題,比如自定義大小,位置,焦點控制等。
背景:
本自定義控件CheckBoxComboBox
提供了一個CheckBoxItems
屬性,即在ComboBox 的下拉選項顯示爲CheckBox
es。控件提供了一個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個選項,這個我還沒有找到方法,原文裏也是有人提問過,但原作者沒有回答,感興趣的朋友可以試着看看源碼看有沒有方法。