/******************************************************************************* * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential * 类的信息: * 1.程序名称:C_CheckedListBoxEx.cs * 2.功能描述:扩展的复选框列表控件:可以多项选择 * 编辑履历: * 作者 日期 版本 修改内容 * 陈晓野 2014/09/04 1.00 新建 *******************************************************************************/ using System.Collections.Generic; using System.ComponentModel; using System.Security.Permissions; using System.Text; using System.Windows.Forms; namespace Dongke.IBOSS.PRD.Basics.BaseControls { /// /// 扩展的复选框列表控件:可以多项选择 /// public partial class C_CheckedListBoxEx : DKCheckedListBox { #region 委托声明 /// /// 表示将处理 System.Windows.Forms.CheckedListBox 控件或 System.Windows.Forms.ListView 控件的 ItemChecked 事件的方法。 /// /// 事件源 /// 包含事件数据的 System.Windows.Forms.ItemCheckEventArgs public delegate void ItemCheckedEventHandler(object sender, ItemCheckEventArgs e); #endregion #region 事件声明 /// /// 当某项的选中状态更改后发生 /// private ItemCheckedEventHandler _onItemChecked; /// /// 当某项的选中状态更改后发生 /// public event ItemCheckedEventHandler ItemChecked { add { this._onItemChecked = (ItemCheckedEventHandler)System.Delegate.Combine(this._onItemChecked, value); } remove { this._onItemChecked = (ItemCheckedEventHandler)System.Delegate.Remove(this._onItemChecked, value); } } #endregion #region 常量 #endregion #region 成员变量 #endregion #region 构造函数 /// /// 构造函数 /// public C_CheckedListBoxEx() { InitializeComponent(); this.CheckOnClick = true; } #endregion #region 属性 /// /// 获取或设置控件的数据源 /// public new object DataSource { get { return base.DataSource; } set { base.DataSource = value; } } /// /// 获取或设置一个字符串,该字符串指定要显示其内容的列表框中所含对象的属性 /// public new string DisplayMember { get { return base.DisplayMember; } set { base.DisplayMember = value; } } /// /// 获取或设置一个字符串,该字符串指定要从中取值的数据源的属性 /// public new string ValueMember { get { return base.ValueMember; } set { base.ValueMember = value; } } /// /// 获取或者设定选中的项目的集合例如返回1,2,3 /// [Description("获取或者设定选中的项目的集合.例如返回\"1,2,3\"")] public string SelectedArray { get { string array = ""; foreach (CheckedBoxListItem item in this.CheckedItems) { array += "," + item.Value; } array = array.Substring(1); return array; } } #endregion #region 事件处理 #endregion #region 公有方法/函数 /// /// 返回指定项的成员属性的值 /// /// 项 /// public virtual object GetItemValue(object item) { if (this.DataManager != null) { string dataMember = this.ValueMember; if (dataMember == null) { dataMember = string.Empty; } int num = dataMember.LastIndexOf("."); if (num != -1) { dataMember = dataMember.Substring(num + 1); } return this.FilterItemOnProperty(item, dataMember); } return null; } /// /// 返回选中项的文本表示形式 /// /// 选中项的文本 public virtual List GetCheckedTexts() { List checkedTexts = new List(); foreach (object item in this.CheckedItems) { checkedTexts.Add(this.GetItemText(item)); } return checkedTexts; } /// /// 返回选中项的成员属性的值 /// /// 选中项的值 public virtual List GetCheckedValues() { List checkedValues = new List(); foreach (object item in this.CheckedItems) { checkedValues.Add(this.GetItemValue(item)); } return checkedValues; } /// /// 返回选中项的文本表示形式 /// /// 选中项的文本 public virtual string GetCheckedText() { StringBuilder checkedText = new StringBuilder(); foreach (object item in this.CheckedItems) { if (checkedText.Length != 0) { checkedText.Append(ControlsConst.MULTIPLE_TEXT_SEPARATOR + this.GetItemText(item)); } else { checkedText.Append(this.GetItemText(item)); } } return checkedText.ToString(); } /// /// 返回选中项的成员属性的值 /// /// 选中项的值 public virtual string GetCheckedValue() { StringBuilder checkedValue = new StringBuilder(); //for (int i = 0; i < this.Items.Count; i++) //{ // if (this.GetItemChecked(i)) // { // this.SetSelected(i, true); // if (checkedValue.Length != 0) // { // checkedValue.Append(ControlsConst.MULTIPLE_VALUE_SEPARATOR + this.SelectedValue.ToString()); // } // else // { // checkedValue.Append(this.SelectedValue.ToString()); // } // } //} foreach (object item in this.CheckedItems) { if (checkedValue.Length != 0) { checkedValue.Append(ControlsConst.MULTIPLE_VALUE_SEPARATOR + this.GetItemValue(item)); } else { checkedValue.Append(this.GetItemValue(item)); } } return checkedValue.ToString(); } /// /// 选中全部项目 /// /// 若要将该项设置为选中,则为 true;否则为 false public virtual void SetAllItemChecked(bool value) { for (int i = 0; i < this.Items.Count; i++) { this.SetItemChecked(i, value); } } /// /// 选中指定索引的项目 /// /// 要为其设置复选状态的项的索引 /// 若要将该项设置为选中,则为 true;否则为 false public virtual void SetItemsChecked(int[] indexs, bool value) { foreach (int index in indexs) { this.SetItemChecked(index, value); } } /// /// 选中指定项目 /// /// 要为其设置复选状态的项 /// 若要将该项设置为选中,则为 true;否则为 false public virtual void SetItemCheckedByItem(object item, bool value) { for (int i = 0; i < this.Items.Count; i++) { object itemInner = this.Items[i]; if (itemInner == item) { this.SetItemChecked(i, value); return; } } } /// /// 选中指定项目 /// /// 要为其设置复选状态的项 /// 若要将该项设置为选中,则为 true;否则为 false public virtual void SetItemsCheckedByItem(object[] items, bool value) { foreach (object item in items) { this.SetItemCheckedByItem(item, value); } } /// /// 选中指定值的项目 /// /// 要为其设置复选状态的项的值 /// 若要将该项设置为选中,则为 true;否则为 false public virtual void SetItemCheckedByValue(object itemValue, bool value) { for (int i = 0; i < this.Items.Count; i++) { object itemValueInner = this.GetItemValue(this.Items[i]); if (itemValueInner == itemValue) { this.SetItemChecked(i, value); return; } } } /// /// 选中指定值的项目 /// /// 要为其设置复选状态的项的值 /// 若要将该项设置为选中,则为 true;否则为 false public virtual void SetItemsCheckedByValue(object[] itemValues, bool value) { foreach (object itemValue in itemValues) { this.SetItemCheckedByValue(itemValue, value); } } /// /// 将指定索引处的项的 System.Windows.Forms.CheckState 设置为 Checked /// /// 要为其设置复选状态的项的索引 /// 若要将该项设置为选中,则为 true;否则为 false public new void SetItemChecked(int index, bool value) { this.SetItemCheckState(index, value ? CheckState.Checked : CheckState.Unchecked); } /// /// 设置指定索引处项的复选状态 /// /// 要为其设置状态的项的索引 /// System.Windows.Forms.CheckState 值之一 public new void SetItemCheckState(int index, CheckState value) { CheckState checkedState = this.GetItemCheckState(index); base.SetItemCheckState(index, value); if (value != checkedState) { ItemCheckEventArgs itemCheckEventArgs = new ItemCheckEventArgs(index, value, checkedState); this.OnItemChecked(itemCheckEventArgs); } } #endregion #region 受保护方法/函数 /// /// 引发 System.Windows.Forms.CheckedListBox.ItemChecked 事件 /// /// 包含事件数据的 System.Windows.Forms.ItemCheckEventArgs protected virtual void OnItemChecked(ItemCheckEventArgs ice) { if (this._onItemChecked != null) { this._onItemChecked(this, ice); } } /// /// 引发 System.Windows.Forms.Control.KeyPress 事件 /// /// 所引发的 System.Windows.Forms.KeyPressEventArgs protected override void OnKeyPress(KeyPressEventArgs e) { if (e.KeyChar == ' ' && this.SelectionMode != SelectionMode.None) { int selectedIndex = this.SelectedIndex; if (selectedIndex < 0 || selectedIndex >= this.Items.Count) { base.OnKeyPress(e); return; } CheckState checkedState = this.GetItemCheckState(selectedIndex); base.OnKeyPress(e); CheckState newCheckValue = this.GetItemCheckState(selectedIndex); if (checkedState != newCheckValue) { ItemCheckEventArgs itemCheckedEventArgs = new ItemCheckEventArgs(selectedIndex, newCheckValue, checkedState); this.OnItemChecked(itemCheckedEventArgs); } } else { base.OnKeyPress(e); } } /// /// 处理 System.Windows.Forms.CheckedListBox 控件从顶级窗口中接收的命令消息 /// /// 顶级窗口发送到此控件的 System.Windows.Forms.Message [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] protected override void WmReflectCommand(ref Message m) { int n = (int)((long)m.WParam); n = n >> 16 & 65535; switch (n) { case 1: case 2: int selectedIndex = this.SelectedIndex; if (selectedIndex < 0 || selectedIndex >= this.Items.Count) { base.WmReflectCommand(ref m); return; } CheckState checkedState = this.GetItemCheckState(selectedIndex); base.WmReflectCommand(ref m); CheckState newCheckValue = this.GetItemCheckState(selectedIndex); if (checkedState != newCheckValue) { ItemCheckEventArgs itemCheckEventArgs = new ItemCheckEventArgs(selectedIndex, newCheckValue, checkedState); this.OnItemChecked(itemCheckEventArgs); } return; default: base.WmReflectCommand(ref m); return; } } #endregion #region 私有方法/函数 #endregion } }