C_CheckedListBoxEx.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. /*******************************************************************************
  2. * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential
  3. * 类的信息:
  4. * 1.程序名称:C_CheckedListBoxEx.cs
  5. * 2.功能描述:扩展的复选框列表控件:可以多项选择
  6. * 编辑履历:
  7. * 作者 日期 版本 修改内容
  8. * 陈晓野 2014/09/04 1.00 新建
  9. *******************************************************************************/
  10. using System.Collections.Generic;
  11. using System.ComponentModel;
  12. using System.Security.Permissions;
  13. using System.Text;
  14. using System.Windows.Forms;
  15. namespace Dongke.IBOSS.PRD.Basics.BaseControls
  16. {
  17. /// <summary>
  18. /// 扩展的复选框列表控件:可以多项选择
  19. /// </summary>
  20. public partial class C_CheckedListBoxEx : DKCheckedListBox
  21. {
  22. #region 委托声明
  23. /// <summary>
  24. /// 表示将处理 System.Windows.Forms.CheckedListBox 控件或 System.Windows.Forms.ListView 控件的 ItemChecked 事件的方法。
  25. /// </summary>
  26. /// <param name="sender">事件源</param>
  27. /// <param name="e">包含事件数据的 System.Windows.Forms.ItemCheckEventArgs</param>
  28. public delegate void ItemCheckedEventHandler(object sender, ItemCheckEventArgs e);
  29. #endregion
  30. #region 事件声明
  31. /// <summary>
  32. /// 当某项的选中状态更改后发生
  33. /// </summary>
  34. private ItemCheckedEventHandler _onItemChecked;
  35. /// <summary>
  36. /// 当某项的选中状态更改后发生
  37. /// </summary>
  38. public event ItemCheckedEventHandler ItemChecked
  39. {
  40. add
  41. {
  42. this._onItemChecked = (ItemCheckedEventHandler)System.Delegate.Combine(this._onItemChecked, value);
  43. }
  44. remove
  45. {
  46. this._onItemChecked = (ItemCheckedEventHandler)System.Delegate.Remove(this._onItemChecked, value);
  47. }
  48. }
  49. #endregion
  50. #region 常量
  51. #endregion
  52. #region 成员变量
  53. #endregion
  54. #region 构造函数
  55. /// <summary>
  56. /// 构造函数
  57. /// </summary>
  58. public C_CheckedListBoxEx()
  59. {
  60. InitializeComponent();
  61. this.CheckOnClick = true;
  62. }
  63. #endregion
  64. #region 属性
  65. /// <summary>
  66. /// 获取或设置控件的数据源
  67. /// </summary>
  68. public new object DataSource
  69. {
  70. get
  71. {
  72. return base.DataSource;
  73. }
  74. set
  75. {
  76. base.DataSource = value;
  77. }
  78. }
  79. /// <summary>
  80. /// 获取或设置一个字符串,该字符串指定要显示其内容的列表框中所含对象的属性
  81. /// </summary>
  82. public new string DisplayMember
  83. {
  84. get
  85. {
  86. return base.DisplayMember;
  87. }
  88. set
  89. {
  90. base.DisplayMember = value;
  91. }
  92. }
  93. /// <summary>
  94. /// 获取或设置一个字符串,该字符串指定要从中取值的数据源的属性
  95. /// </summary>
  96. public new string ValueMember
  97. {
  98. get
  99. {
  100. return base.ValueMember;
  101. }
  102. set
  103. {
  104. base.ValueMember = value;
  105. }
  106. }
  107. /// <summary>
  108. /// 获取或者设定选中的项目的集合例如返回1,2,3
  109. /// </summary>
  110. [Description("获取或者设定选中的项目的集合.例如返回\"1,2,3\"")]
  111. public string SelectedArray
  112. {
  113. get
  114. {
  115. string array = "";
  116. foreach (CheckedBoxListItem item in this.CheckedItems)
  117. {
  118. array += "," + item.Value;
  119. }
  120. array = array.Substring(1);
  121. return array;
  122. }
  123. }
  124. #endregion
  125. #region 事件处理
  126. #endregion
  127. #region 公有方法/函数
  128. /// <summary>
  129. /// 返回指定项的成员属性的值
  130. /// </summary>
  131. /// <param name="item">项</param>
  132. /// <returns>值</returns>
  133. public virtual object GetItemValue(object item)
  134. {
  135. if (this.DataManager != null)
  136. {
  137. string dataMember = this.ValueMember;
  138. if (dataMember == null)
  139. {
  140. dataMember = string.Empty;
  141. }
  142. int num = dataMember.LastIndexOf(".");
  143. if (num != -1)
  144. {
  145. dataMember = dataMember.Substring(num + 1);
  146. }
  147. return this.FilterItemOnProperty(item, dataMember);
  148. }
  149. return null;
  150. }
  151. /// <summary>
  152. /// 返回选中项的文本表示形式
  153. /// </summary>
  154. /// <returns>选中项的文本</returns>
  155. public virtual List<string> GetCheckedTexts()
  156. {
  157. List<string> checkedTexts = new List<string>();
  158. foreach (object item in this.CheckedItems)
  159. {
  160. checkedTexts.Add(this.GetItemText(item));
  161. }
  162. return checkedTexts;
  163. }
  164. /// <summary>
  165. /// 返回选中项的成员属性的值
  166. /// </summary>
  167. /// <returns>选中项的值</returns>
  168. public virtual List<object> GetCheckedValues()
  169. {
  170. List<object> checkedValues = new List<object>();
  171. foreach (object item in this.CheckedItems)
  172. {
  173. checkedValues.Add(this.GetItemValue(item));
  174. }
  175. return checkedValues;
  176. }
  177. /// <summary>
  178. /// 返回选中项的文本表示形式
  179. /// </summary>
  180. /// <returns>选中项的文本</returns>
  181. public virtual string GetCheckedText()
  182. {
  183. StringBuilder checkedText = new StringBuilder();
  184. foreach (object item in this.CheckedItems)
  185. {
  186. if (checkedText.Length != 0)
  187. {
  188. checkedText.Append(ControlsConst.MULTIPLE_TEXT_SEPARATOR + this.GetItemText(item));
  189. }
  190. else
  191. {
  192. checkedText.Append(this.GetItemText(item));
  193. }
  194. }
  195. return checkedText.ToString();
  196. }
  197. /// <summary>
  198. /// 返回选中项的成员属性的值
  199. /// </summary>
  200. /// <returns>选中项的值</returns>
  201. public virtual string GetCheckedValue()
  202. {
  203. StringBuilder checkedValue = new StringBuilder();
  204. //for (int i = 0; i < this.Items.Count; i++)
  205. //{
  206. // if (this.GetItemChecked(i))
  207. // {
  208. // this.SetSelected(i, true);
  209. // if (checkedValue.Length != 0)
  210. // {
  211. // checkedValue.Append(ControlsConst.MULTIPLE_VALUE_SEPARATOR + this.SelectedValue.ToString());
  212. // }
  213. // else
  214. // {
  215. // checkedValue.Append(this.SelectedValue.ToString());
  216. // }
  217. // }
  218. //}
  219. foreach (object item in this.CheckedItems)
  220. {
  221. if (checkedValue.Length != 0)
  222. {
  223. checkedValue.Append(ControlsConst.MULTIPLE_VALUE_SEPARATOR + this.GetItemValue(item));
  224. }
  225. else
  226. {
  227. checkedValue.Append(this.GetItemValue(item));
  228. }
  229. }
  230. return checkedValue.ToString();
  231. }
  232. /// <summary>
  233. /// 选中全部项目
  234. /// </summary>
  235. /// <param name="value">若要将该项设置为选中,则为 true;否则为 false</param>
  236. public virtual void SetAllItemChecked(bool value)
  237. {
  238. for (int i = 0; i < this.Items.Count; i++)
  239. {
  240. this.SetItemChecked(i, value);
  241. }
  242. }
  243. /// <summary>
  244. /// 选中指定索引的项目
  245. /// </summary>
  246. /// <param name="indexs">要为其设置复选状态的项的索引</param>
  247. /// <param name="value">若要将该项设置为选中,则为 true;否则为 false</param>
  248. public virtual void SetItemsChecked(int[] indexs, bool value)
  249. {
  250. foreach (int index in indexs)
  251. {
  252. this.SetItemChecked(index, value);
  253. }
  254. }
  255. /// <summary>
  256. /// 选中指定项目
  257. /// </summary>
  258. /// <param name="item">要为其设置复选状态的项</param>
  259. /// <param name="value">若要将该项设置为选中,则为 true;否则为 false</param>
  260. public virtual void SetItemCheckedByItem(object item, bool value)
  261. {
  262. for (int i = 0; i < this.Items.Count; i++)
  263. {
  264. object itemInner = this.Items[i];
  265. if (itemInner == item)
  266. {
  267. this.SetItemChecked(i, value);
  268. return;
  269. }
  270. }
  271. }
  272. /// <summary>
  273. /// 选中指定项目
  274. /// </summary>
  275. /// <param name="items">要为其设置复选状态的项</param>
  276. /// <param name="value">若要将该项设置为选中,则为 true;否则为 false</param>
  277. public virtual void SetItemsCheckedByItem(object[] items, bool value)
  278. {
  279. foreach (object item in items)
  280. {
  281. this.SetItemCheckedByItem(item, value);
  282. }
  283. }
  284. /// <summary>
  285. /// 选中指定值的项目
  286. /// </summary>
  287. /// <param name="itemValue">要为其设置复选状态的项的值</param>
  288. /// <param name="value">若要将该项设置为选中,则为 true;否则为 false</param>
  289. public virtual void SetItemCheckedByValue(object itemValue, bool value)
  290. {
  291. for (int i = 0; i < this.Items.Count; i++)
  292. {
  293. object itemValueInner = this.GetItemValue(this.Items[i]);
  294. if (itemValueInner == itemValue)
  295. {
  296. this.SetItemChecked(i, value);
  297. return;
  298. }
  299. }
  300. }
  301. /// <summary>
  302. /// 选中指定值的项目
  303. /// </summary>
  304. /// <param name="itemValues">要为其设置复选状态的项的值</param>
  305. /// <param name="value">若要将该项设置为选中,则为 true;否则为 false</param>
  306. public virtual void SetItemsCheckedByValue(object[] itemValues, bool value)
  307. {
  308. foreach (object itemValue in itemValues)
  309. {
  310. this.SetItemCheckedByValue(itemValue, value);
  311. }
  312. }
  313. /// <summary>
  314. /// 将指定索引处的项的 System.Windows.Forms.CheckState 设置为 Checked
  315. /// </summary>
  316. /// <param name="index">要为其设置复选状态的项的索引</param>
  317. /// <param name="value">若要将该项设置为选中,则为 true;否则为 false</param>
  318. public new void SetItemChecked(int index, bool value)
  319. {
  320. this.SetItemCheckState(index, value ? CheckState.Checked : CheckState.Unchecked);
  321. }
  322. /// <summary>
  323. /// 设置指定索引处项的复选状态
  324. /// </summary>
  325. /// <param name="index">要为其设置状态的项的索引</param>
  326. /// <param name="value">System.Windows.Forms.CheckState 值之一</param>
  327. public new void SetItemCheckState(int index, CheckState value)
  328. {
  329. CheckState checkedState = this.GetItemCheckState(index);
  330. base.SetItemCheckState(index, value);
  331. if (value != checkedState)
  332. {
  333. ItemCheckEventArgs itemCheckEventArgs = new ItemCheckEventArgs(index, value, checkedState);
  334. this.OnItemChecked(itemCheckEventArgs);
  335. }
  336. }
  337. #endregion
  338. #region 受保护方法/函数
  339. /// <summary>
  340. /// 引发 System.Windows.Forms.CheckedListBox.ItemChecked 事件
  341. /// </summary>
  342. /// <param name="ice">包含事件数据的 System.Windows.Forms.ItemCheckEventArgs</param>
  343. protected virtual void OnItemChecked(ItemCheckEventArgs ice)
  344. {
  345. if (this._onItemChecked != null)
  346. {
  347. this._onItemChecked(this, ice);
  348. }
  349. }
  350. /// <summary>
  351. /// 引发 System.Windows.Forms.Control.KeyPress 事件
  352. /// </summary>
  353. /// <param name="e">所引发的 System.Windows.Forms.KeyPressEventArgs</param>
  354. protected override void OnKeyPress(KeyPressEventArgs e)
  355. {
  356. if (e.KeyChar == ' ' && this.SelectionMode != SelectionMode.None)
  357. {
  358. int selectedIndex = this.SelectedIndex;
  359. if (selectedIndex < 0 || selectedIndex >= this.Items.Count)
  360. {
  361. base.OnKeyPress(e);
  362. return;
  363. }
  364. CheckState checkedState = this.GetItemCheckState(selectedIndex);
  365. base.OnKeyPress(e);
  366. CheckState newCheckValue = this.GetItemCheckState(selectedIndex);
  367. if (checkedState != newCheckValue)
  368. {
  369. ItemCheckEventArgs itemCheckedEventArgs = new ItemCheckEventArgs(selectedIndex, newCheckValue, checkedState);
  370. this.OnItemChecked(itemCheckedEventArgs);
  371. }
  372. }
  373. else
  374. {
  375. base.OnKeyPress(e);
  376. }
  377. }
  378. /// <summary>
  379. /// 处理 System.Windows.Forms.CheckedListBox 控件从顶级窗口中接收的命令消息
  380. /// </summary>
  381. /// <param name="m">顶级窗口发送到此控件的 System.Windows.Forms.Message</param>
  382. [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  383. protected override void WmReflectCommand(ref Message m)
  384. {
  385. int n = (int)((long)m.WParam);
  386. n = n >> 16 & 65535;
  387. switch (n)
  388. {
  389. case 1:
  390. case 2:
  391. int selectedIndex = this.SelectedIndex;
  392. if (selectedIndex < 0 || selectedIndex >= this.Items.Count)
  393. {
  394. base.WmReflectCommand(ref m);
  395. return;
  396. }
  397. CheckState checkedState = this.GetItemCheckState(selectedIndex);
  398. base.WmReflectCommand(ref m);
  399. CheckState newCheckValue = this.GetItemCheckState(selectedIndex);
  400. if (checkedState != newCheckValue)
  401. {
  402. ItemCheckEventArgs itemCheckEventArgs = new ItemCheckEventArgs(selectedIndex, newCheckValue, checkedState);
  403. this.OnItemChecked(itemCheckEventArgs);
  404. }
  405. return;
  406. default:
  407. base.WmReflectCommand(ref m);
  408. return;
  409. }
  410. }
  411. #endregion
  412. #region 私有方法/函数
  413. #endregion
  414. }
  415. }