using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; namespace AIMS.OremrUserControl { public partial class ComCheckBoxList : UserControl { private TextBox tbSelectedValue; private ButtonS btnSelect;//下拉箭头 private LabelS lbGrip;//此LABEL用于设置可以拖动下拉窗体变化 public CheckedListBox checkListBox; private Label lbSelectAll;//全选 private Label lbSelectNo;//取消 private Form frmCheckList; private Panel pnlBack; private Panel pnlCheck; private System.Drawing.Point DragOffset; //用于记录窗体大小变化的位置 //单击列表项状态更改事件 public delegate void CheckBoxListItemClick(object sender, ItemCheckEventArgs e); public event CheckBoxListItemClick ItemClick; public ComCheckBoxList() { InitializeComponent(); this.Name = "comBoxCheckBoxList"; this.Layout += new LayoutEventHandler(ComCheckBoxList_Layout); //生成控件 tbSelectedValue = new TextBox(); tbSelectedValue.BorderStyle = BorderStyle.None; //下拉箭头 this.btnSelect = new ButtonS(); btnSelect.FlatStyle = FlatStyle.Flat; btnSelect.Click += new EventHandler(btnSelect_Click); //全选 this.lbSelectAll = new Label(); lbSelectAll.BackColor = Color.Transparent; lbSelectAll.Text = "全选"; lbSelectAll.Size = new Size(40, 20); lbSelectAll.ForeColor = Color.Blue; lbSelectAll.Cursor = Cursors.Hand; lbSelectAll.TextAlign = ContentAlignment.MiddleCenter; lbSelectAll.Click += new EventHandler(lbSelectAll_Click); //取消 lbSelectNo = new Label(); lbSelectNo.BackColor = Color.Transparent; lbSelectNo.Text = "取消"; lbSelectNo.Size = new Size(40, 20); lbSelectNo.ForeColor = Color.Blue; lbSelectNo.Cursor = Cursors.Hand; lbSelectNo.TextAlign = ContentAlignment.MiddleCenter; lbSelectNo.Click += new EventHandler(lbSelectNo_Click); //生成checkboxlist this.checkListBox = new CheckedListBox(); checkListBox.BorderStyle = BorderStyle.None; checkListBox.Location = new Point(0, 0); checkListBox.CheckOnClick = true; checkListBox.ScrollAlwaysVisible = true; checkListBox.LostFocus += new EventHandler(checkListBox_LostFocus); checkListBox.ItemCheck += new ItemCheckEventHandler(checkListBox_ItemCheck); //窗体 frmCheckList = new Form(); frmCheckList.FormBorderStyle = FormBorderStyle.None; frmCheckList.StartPosition = FormStartPosition.Manual; frmCheckList.BackColor = SystemColors.Control; frmCheckList.ShowInTaskbar = false; //可拖动窗体大小变化的LABEL lbGrip = new LabelS(); lbGrip.Size = new Size(9, 18); lbGrip.BackColor = Color.Transparent; lbGrip.Cursor = Cursors.SizeNWSE; lbGrip.MouseDown += new MouseEventHandler(lbGrip_MouseDown); lbGrip.MouseMove += new MouseEventHandler(lbGrip_MouseMove); //panel pnlBack = new Panel(); pnlBack.BorderStyle = BorderStyle.Fixed3D; pnlBack.BackColor = Color.White; pnlBack.AutoScroll = false; // pnlCheck = new Panel(); pnlCheck.BorderStyle = BorderStyle.FixedSingle; pnlCheck.BackColor = Color.White; SetStyle(ControlStyles.OptimizedDoubleBuffer, true); SetStyle(ControlStyles.ResizeRedraw, true); pnlBack.Controls.Add(tbSelectedValue); pnlBack.Controls.Add(btnSelect); this.Controls.Add(pnlBack); pnlCheck.Controls.Add(checkListBox); pnlCheck.Controls.Add(lbSelectAll); pnlCheck.Controls.Add(lbSelectNo); pnlCheck.Controls.Add(lbGrip); this.frmCheckList.Controls.Add(pnlCheck); } private void ReloationGrip() { lbGrip.Top = this.frmCheckList.Height - lbGrip.Height - 1; lbGrip.Left = this.frmCheckList.Width - lbGrip.Width - 1; lbSelectAll.Left = 5; lbSelectAll.Top = frmCheckList.Height - lbSelectAll.Height; lbSelectNo.Left = 50; lbSelectNo.Top = frmCheckList.Height - lbSelectNo.Height; } #region 事件 //布局 private void ComCheckBoxList_Layout(object sender, LayoutEventArgs e) { this.Height = tbSelectedValue.Height + 10; this.pnlBack.Size = new Size(this.Width, this.Height - 2); //设置按钮的位置 this.btnSelect.Size = new Size(20, this.Height - 6); btnSelect.Location = new Point(this.Width - this.btnSelect.Width - 4, 0); this.tbSelectedValue.Location = new Point(2, 2); this.tbSelectedValue.Width = this.Width - btnSelect.Width - 4; checkListBox.Height = 150; //设置窗体 this.frmCheckList.Size = new Size(this.Width, this.checkListBox.Height); this.pnlCheck.Size = frmCheckList.Size; this.checkListBox.Width = this.frmCheckList.Width; this.checkListBox.Height = this.frmCheckList.Height - lbSelectNo.Height; ReloationGrip(); } /// /// 单击下拉框 /// /// /// public void btnSelect_Click(object sender, EventArgs e) { if (this.frmCheckList.Visible == false) { Rectangle rec = this.RectangleToScreen(this.ClientRectangle); this.frmCheckList.Location = new Point(rec.X, rec.Y + this.pnlBack.Height); this.frmCheckList.Show(); this.frmCheckList.BringToFront(); ReloationGrip(); } else { this.frmCheckList.Hide(); } } //全选事件 private void lbSelectAll_Click(object sender, EventArgs e) { //获取选中的数量 string strSelect = string.Empty; this.tbSelectedValue.Clear(); for (int i = 0; i < checkListBox.Items.Count; i++) { checkListBox.SetItemChecked(i, true); strSelect += this.checkListBox.GetItemText(this.checkListBox.Items[i]) + " "; } tbSelectedValue.Text = strSelect; } //取消 private void lbSelectNo_Click(object sender, EventArgs e) { for (int i = 0; i < checkListBox.Items.Count; i++) { checkListBox.SetItemChecked(i, false); } tbSelectedValue.Text = string.Empty; } private void checkListBox_LostFocus(object sender, EventArgs e) { //如果鼠标位置在下拉框按钮的以为地方,则隐藏下拉框 if (!this.btnSelect.RectangleToScreen(this.btnSelect.ClientRectangle).Contains(Cursor.Position)) { frmCheckList.Hide(); } } /// /// 麻醉方式多选 JBL20140805 /// private void checkListBox_ItemCheck(object sender, ItemCheckEventArgs e) { if (ItemClick != null) { ItemClick(sender, e); } //获取选中的文本 string strSelect = this.tbSelectedValue.Text; if (e.NewValue == CheckState.Checked) { strSelect += this.checkListBox.GetItemText(this.checkListBox.Items[e.Index]) + " "; } else { strSelect = strSelect.Replace(this.checkListBox.GetItemText(this.checkListBox.Items[e.Index]) + " ", string.Empty); } tbSelectedValue.Text = strSelect; } /// /// 鼠标按下 /// /// /// private void lbGrip_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { int offsetX = System.Math.Abs(Cursor.Position.X - frmCheckList.RectangleToScreen(this.frmCheckList.ClientRectangle).Right); int offsetY = System.Math.Abs(Cursor.Position.Y - frmCheckList.RectangleToScreen(this.frmCheckList.ClientRectangle).Bottom); this.DragOffset = new Point(offsetX, offsetY); } } /// /// 鼠标移动 /// /// /// private void lbGrip_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { //获取拉伸长度 int curWidth = Cursor.Position.X - frmCheckList.Location.X; int curHeight = Cursor.Position.Y - frmCheckList.Location.Y; if (curWidth < this.Width) { curWidth = this.Width; } if (curHeight < checkListBox.Height) { curHeight = checkListBox.Height; } this.frmCheckList.Size = new Size(this.Width, curHeight); this.pnlCheck.Size = frmCheckList.Size; this.checkListBox.Height = (this.frmCheckList.Height - lbGrip.Height) < 50 ? 50 : this.frmCheckList.Height - lbGrip.Height; ReloationGrip(); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); SetStyle(ControlStyles.ResizeRedraw, true); SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); } } #endregion /// /// 设置数据源 /// public object DataSource { set { this.checkListBox.DataSource = value; } get { return checkListBox.DataSource; } } /// /// 设置值 /// public string ValueMember { set { checkListBox.ValueMember = value; } } /// /// 设置显示名称 /// public string DisplayMember { set { checkListBox.DisplayMember = value; } } /// /// 添加项 /// public int AddItems(object value) { checkListBox.Items.Add(value); return checkListBox.Items.Count; } /// /// 选项集合 /// public CheckedListBox.ObjectCollection Items { get { return checkListBox.Items; } } /// /// 获取所有选择的文本内容 /// public string SelectedText { get { return this.tbSelectedValue.Text; } set { this.tbSelectedValue.Text = value; } } /// /// 获取选中项的文本 /// /// /// public string GetItemText(object item) { return checkListBox.GetItemText(item); } /// /// 重写LABEL /// public class LabelS : Label { public LabelS() { //控件绘制的时候减少闪烁 this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); System.Windows.Forms.ControlPaint.DrawSizeGrip(e.Graphics, Color.Black, 1, 0, this.Size.Width, this.Size.Height); } } /// /// 重写BUTTON /// public class ButtonS : Button { public ButtonS() { //防止重绘控件出现闪烁 this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); } ButtonState state; //当按钮被按下 protected override void OnMouseDown(MouseEventArgs mevent) { state = ButtonState.Pushed; base.OnMouseDown(mevent); } //当按钮被释放 protected override void OnMouseUp(MouseEventArgs mevent) { state = ButtonState.Normal; base.OnMouseUp(mevent); } protected override void OnPaint(PaintEventArgs pevent) { base.OnPaint(pevent); System.Windows.Forms.ControlPaint.DrawComboButton(pevent.Graphics, 0, 0, this.Width, this.Height, state); } } } }