AIMS/AIMSControls/OremrUserControl/ComCheckBoxList.cs
2023-08-16 22:32:16 +08:00

425 lines
14 KiB
C#

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();
}
/// <summary>
/// 单击下拉框
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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();
}
}
/// <summary>
/// 麻醉方式多选 JBL20140805
/// </summary>
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;
}
/// <summary>
/// 鼠标按下
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
/// <summary>
/// 鼠标移动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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
/// <summary>
/// 设置数据源
/// </summary>
public object DataSource
{
set
{
this.checkListBox.DataSource = value;
}
get
{
return checkListBox.DataSource;
}
}
/// <summary>
/// 设置值
/// </summary>
public string ValueMember
{
set
{
checkListBox.ValueMember = value;
}
}
/// <summary>
/// 设置显示名称
/// </summary>
public string DisplayMember
{
set
{
checkListBox.DisplayMember = value;
}
}
/// <summary>
/// 添加项
/// </summary>
public int AddItems(object value)
{
checkListBox.Items.Add(value);
return checkListBox.Items.Count;
}
/// <summary>
/// 选项集合
/// </summary>
public CheckedListBox.ObjectCollection Items
{
get
{
return checkListBox.Items;
}
}
/// <summary>
/// 获取所有选择的文本内容
/// </summary>
public string SelectedText
{
get
{
return this.tbSelectedValue.Text;
}
set
{
this.tbSelectedValue.Text = value;
}
}
/// <summary>
/// 获取选中项的文本
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public string GetItemText(object item)
{
return checkListBox.GetItemText(item);
}
/// <summary>
/// 重写LABEL
/// </summary>
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);
}
}
/// <summary>
/// 重写BUTTON
/// </summary>
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);
}
}
}
}