public class MultiComboBox : UserControl
{
#region 屬性
public ComboBox ComboBox { get; set; }
public CheckedListBox CheckedListBox { get; set; }
public ComboBox.ObjectCollection Items
{
get
{
return ComboBox?.Items;
}
}
#endregion
/// <summary>
/// 多選下拉框
/// </summary>
public MultiComboBox()
{
// 面板
this.VerticalScroll.Enabled = true;
this.AutoSize = true;
// 多選列表
CheckedListBox = new CheckedListBox();
CheckedListBox.CheckOnClick = true;
CheckedListBox.BorderStyle = BorderStyle.Fixed3D;
CheckedListBox.Visible = false;
CheckedListBox.Margin = new Padding(0);
CheckedListBox.MouseUp += (ss, se) =>
{
// 更新ComboBox顯示文本
var lst = new List<string>();
foreach (var v in CheckedListBox.CheckedItems)
{
lst.Add(v.ToString());
}
ComboBox.Text = string.Join(",", lst);
ComboBox.Tag = lst;
};
CheckedListBox.MouseLeave += (ss, se) =>
{
// 隱藏下拉多選框
CheckedListBox.Hide();
};
// 下拉框
ComboBox = new ComboBox();
ComboBox.Width = 150;
ComboBox.DrawMode = DrawMode.OwnerDrawFixed;
ComboBox.IntegralHeight = false;
ComboBox.DroppedDown = false;
ComboBox.DropDownHeight = 1;
ComboBox.Margin = new Padding(0);
ComboBox.Location = new Point(0, 0);
ComboBox.DropDownStyle = ComboBoxStyle.DropDown;
ComboBox.AutoCompleteSource = AutoCompleteSource.ListItems;
ComboBox.MouseDown += (ss, se) =>
{
ComboBox.DroppedDown = false;
};
ComboBox.MouseLeave += (ss, se) =>
{
// 不在下拉區(qū)則隱藏下拉
var curMousePos = this.PointToClient(Control.MousePosition);
var downArea = CheckedListBox.Location;
if (curMousePos.X < downArea.X || curMousePos.X > (downArea.X + CheckedListBox.Width)
|| curMousePos.Y < downArea.Y || curMousePos.Y > (downArea.Y + CheckedListBox.Height))
{
CheckedListBox.Hide();
}
};
ComboBox.DropDown += (ss, se) =>
{
// 顯示下拉多選框
CheckedListBox.Items.Clear();
// 添加并設置選中項
var lastChecked = ComboBox.Tag as List<string>;
ComboBox.BeginUpdate();
foreach (var v in this.Items)
{
var ck = false;
if (lastChecked != null && lastChecked.IndexOf(v.ToString()) >= 0)
{
ck = true;
}
CheckedListBox.Items.Add(v, ck);
}
// 顯示下拉框
CheckedListBox.Width = ComboBox.Width;
CheckedListBox.ItemHeight = ComboBox.ItemHeight;
CheckedListBox.Size = new Size(ComboBox.DropDownWidth, this.Items.Count * 18);
CheckedListBox.Location = new Point(ComboBox.Left, ComboBox.Height);
this.Controls.Add(CheckedListBox);
CheckedListBox.Visible = true;
ComboBox.EndUpdate();
};
// 添加控件
this.Controls.Add(ComboBox);
}
}
winform MultiComboBox
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
相關閱讀更多精彩內(nèi)容
- 最終效果 本實例實現(xiàn)時主要用到了NotifyIcon控件的ShowBalloonTip方法。NotifyIcon控...
- 之前由于需要,使用了c#的winform寫了個桌面應用。后面我把 在此基礎上把頁面(UI)、業(yè)務層(BLL) 和數(shù)...
- 隨筆背景:在很多時候,很多入門不久的朋友都會問我:我是從其他語言轉(zhuǎn)到C#開發(fā)的,有沒有一些基礎性的資料給我們學習學...
- 隨筆背景:在很多時候,很多入門不久的朋友都會問我:我是從其他語言轉(zhuǎn)到C#開發(fā)的,有沒有一些基礎性的資料給我們學習學...
- 1、Winform數(shù)據(jù)訪問模式定義 傳統(tǒng)的Winform程序模塊:用于傳統(tǒng)的數(shù)據(jù)庫通訊獲取數(shù)據(jù),這種方式獲取數(shù)據(jù),...