CalCheckAllListBox.cs 83 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602
  1. 
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Drawing;
  6. using System.Drawing.Design;
  7. using System.Runtime;
  8. using System.Windows.Forms;
  9. using Dongke.WinForm.Utilities;
  10. namespace Dongke.WinForm.Controls
  11. {
  12. /// <summary>
  13. /// 全选复选框列表控件
  14. /// </summary>
  15. [ToolboxBitmap(typeof(CheckedListBox))]
  16. [DefaultBindingProperty("SelectedValue"), DefaultProperty("Items"), DefaultEvent("ItemChecked")]
  17. [LookupBindingProperties("DataSource", "DisplayMember", "ValueMember", "SelectedValue")]
  18. //[Designer("System.Windows.Forms.Design.ListBoxDesigner, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
  19. public partial class CalCheckAllListBox : UserControl, IDKControl, IPopupControl, IDataVerifiable, IAsyncControl
  20. {
  21. #region 事件声明
  22. #region HasErrorChanged
  23. /// <summary>
  24. /// 当 HasError 属性的值更改时发生。
  25. /// </summary>
  26. private static readonly object EventHasErrorChanged = new object();
  27. /// <summary>
  28. /// 当 HasError 属性的值更改时发生。
  29. /// </summary>
  30. [Description("当 HasError 属性的值更改时发生。"), Category("CustomerEx")]
  31. public event EventHandler HasErrorChanged
  32. {
  33. add
  34. {
  35. base.Events.AddHandler(EventHasErrorChanged, value);
  36. }
  37. remove
  38. {
  39. base.Events.RemoveHandler(EventHasErrorChanged, value);
  40. }
  41. }
  42. #endregion
  43. #endregion
  44. #region 成员变量
  45. /// <summary>
  46. /// 是否全部选择
  47. /// </summary>
  48. private bool? _isCheckAll = null;
  49. /// <summary>
  50. /// 不确定选中时,选中的Item的Index
  51. /// </summary>
  52. private List<int> _indeterminateIndices = new List<int>();
  53. /// <summary>
  54. /// 焦点是否进入控件
  55. /// </summary>
  56. private bool _entered = false;
  57. /// <summary>
  58. /// 鼠标是否进入控件
  59. /// </summary>
  60. private bool _mouseOver = false;
  61. /// <summary>
  62. /// 边框颜色
  63. /// </summary>
  64. private Color? _borderColor = null;
  65. //private bool _isAllChecked = false;
  66. #endregion
  67. #region 构造函数
  68. /// <summary>
  69. /// 扩展的复选框列表控件:可以全部选择
  70. /// </summary>
  71. public CalCheckAllListBox()
  72. {
  73. this.InitializeComponent();
  74. base.BackColor = SystemColors.Window;
  75. base.BorderStyle = BorderStyle.FixedSingle;
  76. this.chkAll.MouseWheel += chkAll_MouseWheel;
  77. this.chkAll.GotFocus += chkAll_GotFocus;
  78. }
  79. #endregion
  80. #region 实现
  81. #region ListControl
  82. #region 属性
  83. /// <summary>
  84. /// 获取或设置控件的数据源
  85. /// </summary>
  86. [Description("获取或设置控件的数据源。"), Category("ListControl")]
  87. [AttributeProvider(typeof(IListSource))]
  88. [DefaultValue(null)]
  89. [RefreshProperties(RefreshProperties.Repaint)]
  90. public object DataSource
  91. {
  92. get
  93. {
  94. return this.cklItem.DataSource;
  95. }
  96. set
  97. {
  98. this.cklItem.DataSource = value;
  99. }
  100. }
  101. /// <summary>
  102. /// 获取或设置控件的显示的属性
  103. /// </summary>
  104. [Description("获取或设置控件的显示的属性。"), Category("ListControl")]
  105. //[DefaultValue(null)]
  106. [DefaultValue("")]
  107. [Editor("System.Windows.Forms.Design.DataMemberFieldEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
  108. [TypeConverter("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
  109. public string DisplayMember
  110. {
  111. get
  112. {
  113. return this.cklItem.DisplayMember;
  114. }
  115. set
  116. {
  117. this.cklItem.DisplayMember = value;
  118. }
  119. }
  120. /// <summary>
  121. /// 获取或设置提供自定义格式设置行为的 System.IFormatProvider。
  122. /// </summary>
  123. [Description("获取或设置提供自定义格式设置行为的 System.IFormatProvider。"), Category("ListControl")]
  124. [Browsable(false)]
  125. [DefaultValue(null)]
  126. [EditorBrowsable(EditorBrowsableState.Advanced)]
  127. public IFormatProvider FormatInfo
  128. {
  129. get
  130. {
  131. return this.cklItem.FormatInfo;
  132. }
  133. set
  134. {
  135. this.cklItem.FormatInfo = value;
  136. }
  137. }
  138. /// <summary>
  139. /// 获取或设置格式说明符字符,指示如何显示值。
  140. /// </summary>
  141. [Description("获取或设置格式说明符字符,指示如何显示值。"), Category("ListControl")]
  142. [DefaultValue("")]
  143. [Editor("System.Windows.Forms.Design.FormatStringEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
  144. [MergableProperty(false)]
  145. public string FormatString
  146. {
  147. get
  148. {
  149. return this.cklItem.FormatString;
  150. }
  151. set
  152. {
  153. this.cklItem.FormatString = value;
  154. }
  155. }
  156. /// <summary>
  157. /// 获取或设置一个值,该值指示是否将格式设置应用于控件的 DisplayMember 属性。
  158. /// </summary>
  159. [Description("获取或设置一个值,该值指示是否将格式设置应用于控件的 DisplayMember 属性。"), Category("ListControl")]
  160. [DefaultValue(false)]
  161. public bool FormattingEnabled
  162. {
  163. get
  164. {
  165. return this.cklItem.FormattingEnabled;
  166. }
  167. set
  168. {
  169. this.cklItem.FormattingEnabled = value;
  170. }
  171. }
  172. /// <summary>
  173. /// 获取或设置由 DisplayMember 属性指定的成员属性的值。
  174. /// </summary>
  175. [Description("获取或设置由 DisplayMember 属性指定的成员属性的值。"), Category("ListControl")]
  176. [Bindable(true)]
  177. [Browsable(false)]
  178. [DefaultValue(null)]
  179. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  180. public object SelectedValue
  181. {
  182. get
  183. {
  184. return this.cklItem.SelectedValue;
  185. }
  186. set
  187. {
  188. this.cklItem.SelectedValue = value;
  189. }
  190. }
  191. /// <summary>
  192. /// 获取或设置一个属性,该属性将用作控件中的项的实际值。
  193. /// </summary>
  194. [Description("获取或设置一个属性,该属性将用作控件中的项的实际值。"), Category("ListControl")]
  195. //[DefaultValue(null)]
  196. [DefaultValue("")]
  197. [Editor("System.Windows.Forms.Design.DataMemberFieldEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
  198. public string ValueMember
  199. {
  200. get
  201. {
  202. return this.cklItem.ValueMember;
  203. }
  204. set
  205. {
  206. this.cklItem.ValueMember = value;
  207. }
  208. }
  209. #endregion
  210. #region 事件声明
  211. /// <summary>
  212. /// 当 DataSource 更改时发。
  213. /// </summary>
  214. [Description("当 DataSource 更改时发。"), Category("ListControl")]
  215. public event EventHandler DataSourceChanged
  216. {
  217. add
  218. {
  219. this.cklItem.DataSourceChanged += value;
  220. }
  221. remove
  222. {
  223. this.cklItem.DataSourceChanged -= value;
  224. }
  225. }
  226. /// <summary>
  227. /// 当 DisplayMember 属性更改时发生。
  228. /// </summary>
  229. [Description("当 DisplayMember 属性更改时发生。"), Category("ListControl")]
  230. public event EventHandler DisplayMemberChanged
  231. {
  232. add
  233. {
  234. this.cklItem.DisplayMemberChanged += value;
  235. }
  236. remove
  237. {
  238. this.cklItem.DisplayMemberChanged -= value;
  239. }
  240. }
  241. /// <summary>
  242. /// 在该控件绑定到数据值时发生。
  243. /// </summary>
  244. [Description("在该控件绑定到数据值时发生。"), Category("ListControl")]
  245. public event ListControlConvertEventHandler Format
  246. {
  247. add
  248. {
  249. this.cklItem.Format += value;
  250. }
  251. remove
  252. {
  253. this.cklItem.Format -= value;
  254. }
  255. }
  256. /// <summary>
  257. /// 当 FormatInfo 属性的值更改时发生。
  258. /// </summary>
  259. [Description("当 FormatInfo 属性的值更改时发生。"), Category("ListControl")]
  260. [Browsable(false)]
  261. [EditorBrowsable(EditorBrowsableState.Advanced)]
  262. public event EventHandler FormatInfoChanged
  263. {
  264. add
  265. {
  266. this.cklItem.FormatInfoChanged += value;
  267. }
  268. remove
  269. {
  270. this.cklItem.FormatInfoChanged -= value;
  271. }
  272. }
  273. /// <summary>
  274. /// 当 FormatString 属性的值更改时发生。
  275. /// </summary>
  276. [Description("当 FormatString 属性的值更改时发生。"), Category("ListControl")]
  277. public event EventHandler FormatStringChanged
  278. {
  279. add
  280. {
  281. this.cklItem.FormatStringChanged += value;
  282. }
  283. remove
  284. {
  285. this.cklItem.FormatStringChanged -= value;
  286. }
  287. }
  288. /// <summary>
  289. /// 当 FormattingEnabled 属性的值更改时发生。
  290. /// </summary>
  291. [Description("当 FormattingEnabled 属性的值更改时发生。"), Category("ListControl")]
  292. public event EventHandler FormattingEnabledChanged
  293. {
  294. add
  295. {
  296. this.cklItem.FormattingEnabledChanged += value;
  297. }
  298. remove
  299. {
  300. this.cklItem.FormattingEnabledChanged -= value;
  301. }
  302. }
  303. /// <summary>
  304. /// 当 SelectedValue 属性更改时发生。
  305. /// </summary>
  306. [Description("当 SelectedValue 属性更改时发生。"), Category("ListControl")]
  307. public event EventHandler SelectedValueChanged
  308. {
  309. add
  310. {
  311. this.cklItem.SelectedValueChanged += value;
  312. }
  313. remove
  314. {
  315. this.cklItem.SelectedValueChanged -= value;
  316. }
  317. }
  318. /// <summary>
  319. /// 当 ValueMember 属性更改时发生。
  320. /// </summary>
  321. [Description("当 ValueMember 属性更改时发生。"), Category("ListControl")]
  322. public event EventHandler ValueMemberChanged
  323. {
  324. add
  325. {
  326. this.cklItem.ValueMemberChanged += value;
  327. }
  328. remove
  329. {
  330. this.cklItem.ValueMemberChanged -= value;
  331. }
  332. }
  333. #endregion
  334. #region 公共方法
  335. /// <summary>
  336. /// 返回指定项的文本表示形式。
  337. /// </summary>
  338. /// <param name="item">从中获取要显示的内容的对象</param>
  339. /// <returns>
  340. /// 如果未指定 DisplayMember 属性,则由 GetItemText(System.Object)
  341. /// 返回的值是此项的 ToString 方法的值。否则,该方法返回在 DisplayMember
  342. /// 属性中指定的成员的字符串值,该成员被指定给在 item 参数中指定的对象。
  343. /// </returns>
  344. public string GetItemText(object item)
  345. {
  346. return this.cklItem.GetItemText(item);
  347. }
  348. #endregion
  349. #endregion
  350. #region ListBox
  351. #region 属性
  352. /// <summary>
  353. /// 获取或设置多列显示中列的宽度。
  354. /// </summary>
  355. [Description("获取或设置多列显示中列的宽度。"), Category("ListBox")]
  356. [DefaultValue(0)]
  357. [Localizable(true)]
  358. public int ColumnWidth
  359. {
  360. get
  361. {
  362. return this.cklItem.ColumnWidth;
  363. }
  364. set
  365. {
  366. this.cklItem.ColumnWidth = value;
  367. }
  368. }
  369. /// <summary>
  370. /// 获取控件中的项之间的制表符的宽度。
  371. /// </summary>
  372. [Description("获取控件中的项之间的制表符的宽度。"), Category("ListBox")]
  373. [Browsable(false)]
  374. [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
  375. public ListBox.IntegerCollection CustomTabOffsets
  376. {
  377. get
  378. {
  379. return this.cklItem.CustomTabOffsets;
  380. }
  381. }
  382. /// <summary>
  383. /// 获取或设置控件的水平滚动条可滚动的宽度。
  384. /// </summary>
  385. [Description("获取或设置控件的水平滚动条可滚动的宽度。"), Category("ListBox")]
  386. [DefaultValue(0)]
  387. [Localizable(true)]
  388. public int HorizontalExtent
  389. {
  390. get
  391. {
  392. return this.cklItem.HorizontalExtent;
  393. }
  394. set
  395. {
  396. this.cklItem.HorizontalExtent = value;
  397. }
  398. }
  399. /// <summary>
  400. /// 获取或设置一个值,该值指示是否在控件中显示水平滚动条。
  401. /// </summary>
  402. [Description("获取或设置一个值,该值指示是否在控件中显示水平滚动条。"), Category("ListBox")]
  403. [DefaultValue(false)]
  404. [Localizable(true)]
  405. public bool HorizontalScrollbar
  406. {
  407. get
  408. {
  409. return this.cklItem.HorizontalScrollbar;
  410. }
  411. set
  412. {
  413. this.cklItem.HorizontalScrollbar = value;
  414. }
  415. }
  416. /// <summary>
  417. /// 获取或设置一个值,该值指示控件是否应调整大小以避免只显示项的局部。
  418. /// </summary>
  419. [Description("获取或设置一个值,该值指示控件是否应调整大小以避免只显示项的局部。"), Category("ListBox")]
  420. [DefaultValue(true)]
  421. [Localizable(true)]
  422. [RefreshProperties(RefreshProperties.Repaint)]
  423. public bool IntegralHeight
  424. {
  425. get
  426. {
  427. return this.cklItem.IntegralHeight;
  428. }
  429. set
  430. {
  431. this.cklItem.IntegralHeight = value;
  432. }
  433. }
  434. /// <summary>
  435. /// 获取或设置一个值,该值指示控件是否支持多列。
  436. /// </summary>
  437. [Description("获取或设置一个值,该值指示控件是否支持多列。"), Category("ListBox")]
  438. [DefaultValue(false)]
  439. public bool MultiColumn
  440. {
  441. get
  442. {
  443. return this.cklItem.MultiColumn;
  444. }
  445. set
  446. {
  447. this.cklItem.MultiColumn = value;
  448. }
  449. }
  450. /// <summary>
  451. /// 获取控件中所有项的组合高度。
  452. /// </summary>
  453. [Description("获取控件中所有项的组合高度。"), Category("ListBox")]
  454. [Browsable(false)]
  455. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  456. [EditorBrowsable(EditorBrowsableState.Advanced)]
  457. public int PreferredHeight
  458. {
  459. get
  460. {
  461. return this.cklItem.PreferredHeight;
  462. }
  463. }
  464. /// <summary>
  465. /// 获取或设置一个值,该值指示是否任何时候都显示垂直滚动条。
  466. /// </summary>
  467. [Description("获取或设置一个值,该值指示是否任何时候都显示垂直滚动条。"), Category("ListBox")]
  468. [DefaultValue(false)]
  469. [Localizable(true)]
  470. public bool ScrollAlwaysVisible
  471. {
  472. get
  473. {
  474. return this.cklItem.ScrollAlwaysVisible;
  475. }
  476. set
  477. {
  478. this.cklItem.ScrollAlwaysVisible = value;
  479. }
  480. }
  481. /// <summary>
  482. /// 获取或设置控件中当前选定项的从零开始的索引。
  483. /// </summary>
  484. [Description("获取或设置控件中当前选定项的从零开始的索引。"), Category("ListBox")]
  485. [Bindable(true)]
  486. [Browsable(false)]
  487. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  488. public virtual int SelectedIndex
  489. {
  490. get
  491. {
  492. return this.cklItem.SelectedIndex;
  493. }
  494. set
  495. {
  496. this.cklItem.SelectedIndex = value;
  497. }
  498. }
  499. /// <summary>
  500. /// 获取一个集合,该集合包含控件中所有当前选定项的从零开始的索引。
  501. /// </summary>
  502. [Description("获取一个集合,该集合包含控件中所有当前选定项的从零开始的索引。"), Category("ListBox")]
  503. [Browsable(false)]
  504. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  505. public ListBox.SelectedIndexCollection SelectedIndices
  506. {
  507. get
  508. {
  509. return this.cklItem.SelectedIndices;
  510. }
  511. }
  512. /// <summary>
  513. /// 获取或设置控件中的当前选定项。
  514. /// </summary>
  515. [Description("获取或设置控件中的当前选定项。"), Category("ListBox")]
  516. [Bindable(true)]
  517. [Browsable(false)]
  518. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  519. public object SelectedItem
  520. {
  521. get
  522. {
  523. return this.cklItem.SelectedItem;
  524. }
  525. set
  526. {
  527. this.cklItem.SelectedItem = value;
  528. }
  529. }
  530. /// <summary>
  531. /// 获取包含控件中当前选定项的集合。
  532. /// </summary>
  533. [Description("获取包含控件中当前选定项的集合。"), Category("ListBox")]
  534. [Browsable(false)]
  535. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  536. public ListBox.SelectedObjectCollection SelectedItems
  537. {
  538. get
  539. {
  540. return this.cklItem.SelectedItems;
  541. }
  542. }
  543. /// <summary>
  544. /// 获取或设置在控件中选择项所用的方法。
  545. /// </summary>
  546. [Description("获取或设置在控件中选择项所用的方法。"), Category("ListBox")]
  547. [DefaultValue(typeof(SelectionMode), "One")]
  548. public virtual SelectionMode SelectionMode
  549. {
  550. get
  551. {
  552. return this.cklItem.SelectionMode;
  553. }
  554. set
  555. {
  556. this.cklItem.SelectionMode = value;
  557. }
  558. }
  559. /// <summary>
  560. /// 获取或设置一个值,该值指示控件中的项是否按字母顺序排序。
  561. /// </summary>
  562. [Description("获取或设置一个值,该值指示控件中的项是否按字母顺序排序。"), Category("ListBox")]
  563. [DefaultValue(false)]
  564. public bool Sorted
  565. {
  566. get
  567. {
  568. return this.cklItem.Sorted;
  569. }
  570. set
  571. {
  572. this.cklItem.Sorted = value;
  573. }
  574. }
  575. /// <summary>
  576. /// 获取或搜索控件中当前选定项的文本。
  577. /// </summary>
  578. [Description("获取或搜索控件中当前选定项的文本。"), Category("ListBox")]
  579. [Bindable(false)]
  580. [Browsable(false)]
  581. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  582. [EditorBrowsable(EditorBrowsableState.Advanced)]
  583. public virtual string ItemText
  584. {
  585. get
  586. {
  587. return this.cklItem.Text;
  588. }
  589. set
  590. {
  591. this.cklItem.Text = value;
  592. }
  593. }
  594. /// <summary>
  595. /// 获取或设置控件中第一个可见项的索引。
  596. /// </summary>
  597. [Description("获取或设置控件中第一个可见项的索引。"), Category("ListBox")]
  598. [Browsable(false)]
  599. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  600. public int TopIndex
  601. {
  602. get
  603. {
  604. return this.cklItem.TopIndex;
  605. }
  606. set
  607. {
  608. this.cklItem.TopIndex = value;
  609. }
  610. }
  611. /// <summary>
  612. /// 获取或设置一个值,它指示控件在通过使用 CustomTabOffsets 整数数组绘制字符串时是否识别并展开制表符。
  613. /// </summary>
  614. [Description("获取或设置一个值,它指示控件在通过使用 CustomTabOffsets 整数数组绘制字符串时是否识别并展开制表符。"), Category("ListBox")]
  615. [Browsable(false)]
  616. [DefaultValue(false)]
  617. public bool UseCustomTabOffsets
  618. {
  619. get
  620. {
  621. return this.cklItem.UseCustomTabOffsets;
  622. }
  623. set
  624. {
  625. this.cklItem.UseCustomTabOffsets = value;
  626. }
  627. }
  628. /// <summary>
  629. /// 获取或设置一个值,该值指示控件在绘制其字符串时是否可识别和展开制表符。
  630. /// </summary>
  631. [Description("获取或设置一个值,该值指示控件在绘制其字符串时是否可识别和展开制表符。"), Category("ListBox")]
  632. [DefaultValue(true)]
  633. public bool UseTabStops
  634. {
  635. get
  636. {
  637. return this.cklItem.UseTabStops;
  638. }
  639. set
  640. {
  641. this.cklItem.UseTabStops = value;
  642. }
  643. }
  644. #region Never
  645. /*
  646. [Description(""), Category("CustomerEx")]
  647. [Browsable(false)]
  648. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  649. [EditorBrowsable(EditorBrowsableState.Never)]
  650. public Padding ItemPadding
  651. {
  652. get
  653. {
  654. return base.Padding;
  655. }
  656. set
  657. {
  658. }
  659. }
  660. */
  661. /*
  662. /// <summary>
  663. /// 获取或设置控件的绘图模式。
  664. /// </summary>
  665. [Description("获取或设置控件的绘图模式。"), Category("CustomerEx")]
  666. //[Browsable(false)]
  667. //[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  668. //[EditorBrowsable(EditorBrowsableState.Never)]
  669. [RefreshProperties(RefreshProperties.Repaint)]
  670. [DefaultValue(typeof(DrawMode), "Normal")]
  671. public virtual DrawMode DrawMode
  672. {
  673. get
  674. {
  675. return this.clstItem.DrawMode;
  676. }
  677. set
  678. {
  679. this.clstItem.DrawMode = value;
  680. }
  681. }
  682. /// <summary>
  683. /// 获取或设置控件中项的高度。
  684. /// </summary>
  685. [Description("获取或设置控件中项的高度。"), Category("CustomerEx")]
  686. //[Browsable(false)]
  687. //[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  688. //[EditorBrowsable(EditorBrowsableState.Never)]
  689. //[DefaultValue(13)]
  690. [DefaultValue(16)]
  691. [Localizable(true)]
  692. [RefreshProperties(RefreshProperties.Repaint)]
  693. public virtual int ItemHeight
  694. {
  695. get
  696. {
  697. return this.clstItem.ItemHeight;
  698. }
  699. set
  700. {
  701. this.clstItem.ItemHeight = value;
  702. //this.pnlItem.Height = this.clstItem.ItemHeight + 2;
  703. }
  704. }
  705. /// <summary>
  706. /// 获取控件的项
  707. /// </summary>
  708. [Browsable(false)]
  709. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  710. [EditorBrowsable(EditorBrowsableState.Never)]
  711. [Description("获取控件的项。"), Category("CustomerEx")]
  712. //[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
  713. [Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
  714. [Localizable(true)]
  715. [MergableProperty(false)]
  716. //public ListBox.ObjectCollection Items
  717. public ListBox.ObjectCollection ListBoxItems
  718. {
  719. get
  720. {
  721. return this.clstItem.Items;
  722. }
  723. }
  724. */
  725. #endregion
  726. #endregion
  727. #region 事件声明
  728. /// <summary>
  729. /// 在单击 Item 控件时发生。
  730. /// </summary>
  731. [Description("在单击 Item 控件时发生。"), Category("ListBox")]
  732. [Browsable(true)]
  733. [EditorBrowsable(EditorBrowsableState.Always)]
  734. public event EventHandler ItemClick
  735. {
  736. add
  737. {
  738. this.cklItem.Click += value;
  739. }
  740. remove
  741. {
  742. this.cklItem.Click -= value;
  743. }
  744. }
  745. /// <summary>
  746. /// 在所有者绘制的 Item 在视觉外观更改时发生。
  747. /// </summary>
  748. [Description("在所有者绘制的 Item 在视觉外观更改时发生。"), Category("ListBox")]
  749. public event DrawItemEventHandler DrawItem
  750. {
  751. add
  752. {
  753. this.cklItem.DrawItem += value;
  754. }
  755. remove
  756. {
  757. this.cklItem.DrawItem -= value;
  758. }
  759. }
  760. /// <summary>
  761. /// 当用户使用鼠标指针单击 Item 控件时发生。
  762. /// </summary>
  763. [Description("当用户使用鼠标指针单击 Item 控件时发生。"), Category("ListBox")]
  764. [Browsable(true)]
  765. [EditorBrowsable(EditorBrowsableState.Always)]
  766. public event MouseEventHandler ItemMouseClick
  767. {
  768. add
  769. {
  770. this.cklItem.MouseClick += value;
  771. }
  772. remove
  773. {
  774. this.cklItem.MouseClick -= value;
  775. }
  776. }
  777. /// <summary>
  778. /// 在 SelectedIndex 属性或 SelectedIndices集合更改后发生。
  779. /// </summary>
  780. [Description("在 SelectedIndex 属性或 SelectedIndices集合更改后发生。"), Category("ListBox")]
  781. public event EventHandler SelectedIndexChanged
  782. {
  783. add
  784. {
  785. this.cklItem.SelectedIndexChanged += value;
  786. }
  787. remove
  788. {
  789. this.cklItem.SelectedIndexChanged -= value;
  790. }
  791. }
  792. /// <summary>
  793. /// 当 Text 属性更改时发生。
  794. /// </summary>
  795. [Description("当 Text 属性更改时发生。"), Category("ListBox")]
  796. [Browsable(false)]
  797. [EditorBrowsable(EditorBrowsableState.Advanced)]
  798. public event EventHandler ItemTextChanged
  799. {
  800. add
  801. {
  802. this.cklItem.TextChanged += value;
  803. }
  804. remove
  805. {
  806. this.cklItem.TextChanged -= value;
  807. }
  808. }
  809. #region Never
  810. /*
  811. /// <summary>
  812. /// 当 Padding 属性的值更改时发生。
  813. /// </summary>
  814. [Description("当 Padding 属性的值更改时发生。"), Category("CustomerEx")]
  815. [Browsable(false)]
  816. [EditorBrowsable(EditorBrowsableState.Never)]
  817. public event EventHandler ItemPaddingChanged
  818. {
  819. add
  820. {
  821. this.clstItem.PaddingChanged += value;
  822. }
  823. remove
  824. {
  825. this.clstItem.PaddingChanged -= value;
  826. }
  827. }
  828. /// <summary>
  829. /// 在绘制 Item 控件时发生。
  830. /// </summary>
  831. [Description("在绘制 Item 控件时发生。"), Category("CustomerEx")]
  832. [Browsable(false)]
  833. [EditorBrowsable(EditorBrowsableState.Never)]
  834. public event PaintEventHandler ItemPaint
  835. {
  836. add
  837. {
  838. this.clstItem.Paint += value;
  839. }
  840. remove
  841. {
  842. this.clstItem.Paint -= value;
  843. }
  844. }
  845. */
  846. /*
  847. /// <summary>
  848. /// 创建所有者描述的控件和确定列表项的大小时发生。
  849. /// </summary>
  850. //[Browsable(false)]
  851. //[EditorBrowsable(EditorBrowsableState.Never)]
  852. [Description("创建所有者描述的控件和确定列表项的大小时发生。"), Category("CustomerEx")]
  853. public event MeasureItemEventHandler MeasureItem
  854. {
  855. add
  856. {
  857. this.clstItem.MeasureItem += value;
  858. }
  859. remove
  860. {
  861. this.clstItem.MeasureItem -= value;
  862. }
  863. }
  864. */
  865. #endregion
  866. #endregion
  867. #region 公共方法
  868. /// <summary>
  869. /// 当向控件中一次添加一个项时,通过防止该控件绘图来维护性能,直到调用 EndUpdate() 方法为止。
  870. /// </summary>
  871. public void BeginUpdate()
  872. {
  873. this.cklItem.BeginUpdate();
  874. }
  875. /// <summary>
  876. /// 取消选择控件中的所有项。
  877. /// </summary>
  878. public void ClearSelected()
  879. {
  880. this.cklItem.ClearSelected();
  881. }
  882. /// <summary>
  883. /// 在 BeginUpdate() 方法挂起绘制后,该方法恢复绘制控件。
  884. /// </summary>
  885. public void EndUpdate()
  886. {
  887. this.cklItem.EndUpdate();
  888. }
  889. /// <summary>
  890. /// 查找 Item 中以指定字符串开始的第一个项。
  891. /// </summary>
  892. /// <param name="s">要搜索的文本</param>
  893. /// <returns>找到的第一个项的从零开始的索引;如果找不到匹配项,则返回 ListBox.NoMatches。</returns>
  894. [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
  895. public int FindString(string s)
  896. {
  897. return this.cklItem.FindString(s);
  898. }
  899. /// <summary>
  900. /// 查找 Item 中以指定字符串开头的第一个项。搜索从特定的起始索引处开始。
  901. /// </summary>
  902. /// <param name="s">要搜索的文本</param>
  903. /// <param name="startIndex">项的从零开始的索引,该项在要搜索的第一个项之前。设置为负一 (-1) 以从控件的开始处进行搜索。</param>
  904. /// <returns>找到的第一个项的从零开始的索引;如果找不到匹配项,则返回 ListBox.NoMatches。</returns>
  905. public int FindString(string s, int startIndex)
  906. {
  907. return this.cklItem.FindString(s, startIndex);
  908. }
  909. /// <summary>
  910. /// 查找 Item 中第一个精确匹配指定字符串的项。
  911. /// </summary>
  912. /// <param name="s">要搜索的文本</param>
  913. /// <returns>找到的第一个项的从零开始的索引;如果找不到匹配项,则返回 ListBox.NoMatches。</returns>
  914. [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
  915. public int FindStringExact(string s)
  916. {
  917. return this.cklItem.FindStringExact(s);
  918. }
  919. /// <summary>
  920. /// 查找 Item 中第一个精确匹配指定字符串的项。搜索从特定的起始索引处开始。
  921. /// </summary>
  922. /// <param name="s">要搜索的文本</param>
  923. /// <param name="startIndex">项的从零开始的索引,该项在要搜索的第一个项之前。设置为负一 (-1) 以从控件的开始处进行搜索。</param>
  924. /// <returns>找到的第一个项的从零开始的索引;如果找不到匹配项,则返回 ListBox.NoMatches。</returns>
  925. public int FindStringExact(string s, int startIndex)
  926. {
  927. return this.cklItem.FindStringExact(s, startIndex);
  928. }
  929. /// <summary>
  930. /// 返回 Item 中某项的高度。
  931. /// </summary>
  932. /// <param name="index">要返回其高度的项的从零开始的索引</param>
  933. /// <returns>指定的项的高度,以像素为单位</returns>
  934. public int GetItemHeight(int index)
  935. {
  936. return this.cklItem.GetItemHeight(index);
  937. }
  938. /// <summary>
  939. /// 返回控件中的项的边框。
  940. /// </summary>
  941. /// <param name="index">要返回其边框的项的从零开始的索引</param>
  942. /// <returns>表示指定项的边框</returns>
  943. public Rectangle GetItemRectangle(int index)
  944. {
  945. return this.cklItem.GetItemRectangle(index);
  946. }
  947. /// <summary>
  948. /// 返回一个值,该值指示是否选定了指定的项
  949. /// </summary>
  950. /// <param name="index">项的从零开始的索引,根据该索引确定该项是否被选定</param>
  951. /// <returns>如果当前在控件中选定了指定的项,则为 true;否则为 false。</returns>
  952. public bool GetSelected(int index)
  953. {
  954. return this.cklItem.GetSelected(index);
  955. }
  956. /// <summary>
  957. /// 返回指定坐标处的项的从零开始的索引
  958. /// </summary>
  959. /// <param name="p">System.Drawing.Point 对象,包含用于获取项索引的坐标</param>
  960. /// <returns>在指定坐标处找到的项的从零开始的索引;如果找不到匹配项,则返回 ListBox.NoMatches。</returns>
  961. public int IndexFromPoint(Point p)
  962. {
  963. return this.cklItem.IndexFromPoint(p);
  964. }
  965. /// <summary>
  966. /// 返回指定坐标处的项的从零开始的索引。
  967. /// </summary>
  968. /// <param name="x">要搜索的位置的 x 坐标</param>
  969. /// <param name="y">要搜索的位置的 y 坐标</param>
  970. /// <returns>在指定坐标处找到的项的从零开始的索引;如果找不到匹配项,则返回 ListBox.NoMatches。</returns>
  971. public int IndexFromPoint(int x, int y)
  972. {
  973. return this.cklItem.IndexFromPoint(x, y);
  974. }
  975. /// <summary>
  976. /// 强制控件使其工作区无效并立即重绘自己和任何子控件。
  977. /// </summary>
  978. public virtual void ItemRefresh()
  979. {
  980. this.cklItem.Refresh();
  981. }
  982. /// <summary>
  983. ///
  984. /// </summary>
  985. public virtual void ItemResetBackColor()
  986. {
  987. this.cklItem.ResetBackColor();
  988. }
  989. /// <summary>
  990. ///
  991. /// </summary>
  992. public virtual void ItemResetForeColor()
  993. {
  994. this.cklItem.ResetForeColor();
  995. }
  996. /// <summary>
  997. /// 选择或清除对 Item 中指定项的选定。
  998. /// </summary>
  999. /// <param name="index">Item中要选择或清除对其选定的项的从零开始的索引</param>
  1000. /// <param name="value">如果为 true,则选择指定的项;否则为 false</param>
  1001. public void SetSelected(int index, bool value)
  1002. {
  1003. this.cklItem.SetSelected(index, value);
  1004. }
  1005. /// <summary>
  1006. /// 返回控件的字符串表示形式。
  1007. /// </summary>
  1008. /// <returns>一个字符串,它描述控件类型、控件中的项计数,如果该计数不为 0,则还描述控件中第一项的 Text 属性</returns>
  1009. public new string ToString()
  1010. {
  1011. return this.cklItem.ToString();
  1012. }
  1013. #endregion
  1014. #endregion
  1015. #region CheckedListBox
  1016. #region 属性
  1017. /// <summary>
  1018. /// 该控件中选中索引的集合。
  1019. /// </summary>
  1020. [Description("该控件中选中索引的集合。"), Category("CheckedListBox")]
  1021. [Browsable(false)]
  1022. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  1023. public CheckedListBox.CheckedIndexCollection CheckedIndices
  1024. {
  1025. get
  1026. {
  1027. return this.cklItem.CheckedIndices;
  1028. }
  1029. }
  1030. /// <summary>
  1031. /// 该控件中选中项的集合。
  1032. /// </summary>
  1033. [Description("该控件中选中项的集合。"), Category("CheckedListBox")]
  1034. [Browsable(false)]
  1035. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  1036. public CheckedListBox.CheckedItemCollection CheckedItems
  1037. {
  1038. get
  1039. {
  1040. return this.cklItem.CheckedItems;
  1041. }
  1042. }
  1043. /// <summary>
  1044. /// 获取或设置一个值,该值指示当选定项时是否应切换复选框。
  1045. /// </summary>
  1046. [Description("获取或设置一个值,该值指示当选定项时是否应切换复选框。"), Category("CheckedListBox")]
  1047. [DefaultValue(true)]
  1048. public bool CheckOnClick
  1049. {
  1050. get
  1051. {
  1052. return this.cklItem.CheckOnClick;
  1053. }
  1054. set
  1055. {
  1056. this.cklItem.CheckOnClick = value;
  1057. }
  1058. }
  1059. /// <summary>
  1060. /// 获取该控件中项的集合。
  1061. /// </summary>
  1062. [Description("获取该控件中项的集合。"), Category("CheckedListBox")]
  1063. [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
  1064. [Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
  1065. [Localizable(true)]
  1066. [MergableProperty(false)]
  1067. public CheckedListBox.ObjectCollection Items
  1068. {
  1069. get
  1070. {
  1071. return this.cklItem.Items;
  1072. }
  1073. }
  1074. /// <summary>
  1075. /// 获取或设置一个值,该值指示复选框是否有 Flat 或 Normal 的 System.Windows.Forms.ButtonState。
  1076. /// </summary>
  1077. [Description("获取或设置一个值,该值指示复选框是否有 Flat 或 Normal 的 System.Windows.Forms.ButtonState。"), Category("CheckedListBox")]
  1078. [DefaultValue(false)]
  1079. public bool ThreeDCheckBoxes
  1080. {
  1081. get
  1082. {
  1083. return this.cklItem.ThreeDCheckBoxes;
  1084. }
  1085. set
  1086. {
  1087. this.cklItem.ThreeDCheckBoxes = value;
  1088. }
  1089. }
  1090. /// <summary>
  1091. /// 获取或设置一个值,该值确定是使用 System.Drawing.Graphics 类 (GDI+) 还是 System.Windows.Forms.TextRenderer 类 (GDI) 呈现文本。
  1092. /// </summary>
  1093. [Description("获取或设置一个值,该值确定是使用 System.Drawing.Graphics 类 (GDI+) 还是 System.Windows.Forms.TextRenderer 类 (GDI) 呈现文本。"), Category("CheckedListBox")]
  1094. [DefaultValue(false)]
  1095. public bool UseCompatibleTextRendering
  1096. {
  1097. get
  1098. {
  1099. return this.cklItem.UseCompatibleTextRendering;
  1100. }
  1101. set
  1102. {
  1103. this.cklItem.UseCompatibleTextRendering = value;
  1104. this.chkAll.UseCompatibleTextRendering = value;
  1105. }
  1106. }
  1107. /*
  1108. //
  1109. // 摘要:
  1110. // 获取一个值,该值表示 System.Windows.Forms.CheckedListBox 的绘制元素的模式。此属性与该类无关。
  1111. //
  1112. // 返回结果:
  1113. // 通常为 Normal 的 System.Windows.Forms.DrawMode。
  1114. //[Browsable(false)]
  1115. //[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  1116. //[EditorBrowsable(EditorBrowsableState.Never)]
  1117. //public override DrawMode DrawMode
  1118. //{
  1119. // get;
  1120. // set;
  1121. //}
  1122. //
  1123. // 摘要:
  1124. // 获取项区域的高度。
  1125. //
  1126. // 返回结果:
  1127. // 项区域的高度(以像素为单位)。
  1128. //[Browsable(false)]
  1129. //[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  1130. //[EditorBrowsable(EditorBrowsableState.Never)]
  1131. //public override int ItemHeight
  1132. //{
  1133. // get;
  1134. // set;
  1135. //}
  1136. */
  1137. #endregion
  1138. #region 事件声明
  1139. /// <summary>
  1140. /// 当某项的选中状态更改时发生。
  1141. /// </summary>
  1142. [Description("当某项的选中状态更改时发生。"), Category("CheckedListBox")]
  1143. public event ItemCheckEventHandler ItemCheck
  1144. {
  1145. add
  1146. {
  1147. this.cklItem.ItemCheck += value;
  1148. }
  1149. remove
  1150. {
  1151. this.cklItem.ItemCheck -= value;
  1152. }
  1153. }
  1154. /*
  1155. ///// <summary>
  1156. ///// 当用户单击 Item 控件时发生。
  1157. ///// </summary>
  1158. //[Description("当用户单击 Item 控件时发生。"), Category("CustomerEx")]
  1159. //[Browsable(true)]
  1160. //[EditorBrowsable(EditorBrowsableState.Always)]
  1161. //public event EventHandler ItemClick
  1162. //{
  1163. // add
  1164. // {
  1165. // this.clstItem.Click += value;
  1166. // }
  1167. // remove
  1168. // {
  1169. // this.clstItem.Click -= value;
  1170. // }
  1171. //}
  1172. ///// <summary>
  1173. ///// 当用户使用鼠标单击 Item 控件时发生。
  1174. ///// </summary>
  1175. //[Description("当用户使用鼠标单击 Item 控件时发生。"), Category("CustomerEx")]
  1176. //[Browsable(true)]
  1177. //[EditorBrowsable(EditorBrowsableState.Always)]
  1178. //public event MouseEventHandler ItemMouseClick
  1179. //{
  1180. // add
  1181. // {
  1182. // this.clstItem.MouseClick += value;
  1183. // }
  1184. // remove
  1185. // {
  1186. // this.clstItem.MouseClick -= value;
  1187. // }
  1188. //}
  1189. */
  1190. /*
  1191. //
  1192. // 摘要:
  1193. // 在所有者描述的 System.Windows.Forms.CheckedListBox 的可视方位更改时发生。此事件与此类无关。
  1194. //[Browsable(false)]
  1195. //[EditorBrowsable(EditorBrowsableState.Never)]
  1196. //public event DrawItemEventHandler DrawItem;
  1197. //
  1198. // 摘要:
  1199. // 创建所有者描述的 System.Windows.Forms.ListBox 和确定列表项的大小时发生。此事件与此类无关。
  1200. //[Browsable(false)]
  1201. //[EditorBrowsable(EditorBrowsableState.Never)]
  1202. //public event MeasureItemEventHandler MeasureItem;
  1203. */
  1204. #endregion
  1205. #region 公共方法
  1206. /// <summary>
  1207. /// 返回指示指定项是否选中的值。
  1208. /// </summary>
  1209. /// <param name="index">项的索引</param>
  1210. /// <returns>如果选中该项,则为 true;否则为 false。</returns>
  1211. public bool GetItemChecked(int index)
  1212. {
  1213. return this.cklItem.GetItemChecked(index);
  1214. }
  1215. /// <summary>
  1216. /// 返回指示当前项的复选状态的值。
  1217. /// </summary>
  1218. /// <param name="index">要获取其选中值的项的索引</param>
  1219. /// <returns>System.Windows.Forms.CheckState 值之一。</returns>
  1220. public CheckState GetItemCheckState(int index)
  1221. {
  1222. return this.cklItem.GetItemCheckState(index);
  1223. }
  1224. /// <summary>
  1225. /// 将指定索引处的项的 System.Windows.Forms.CheckState 设置为 Checked。
  1226. /// </summary>
  1227. /// <param name="index">要为其设置复选状态的项的索引</param>
  1228. /// <param name="value">若要将该项设置为选中,则为 true;否则为 false</param>
  1229. public void SetItemChecked(int index, bool value)
  1230. {
  1231. this.cklItem.SetItemChecked(index, value);
  1232. }
  1233. /// <summary>
  1234. /// 设置指定索引处项的复选状态。
  1235. /// </summary>
  1236. /// <param name="index">要为其设置状态的项的索引</param>
  1237. /// <param name="value">System.Windows.Forms.CheckState 值之一</param>
  1238. public void SetItemCheckState(int index, CheckState value)
  1239. {
  1240. this.cklItem.SetItemCheckState(index, value);
  1241. }
  1242. #endregion
  1243. #endregion
  1244. #region CklCheckedListBox
  1245. #region 属性
  1246. /// <summary>
  1247. /// 获取选中的文本
  1248. /// </summary>
  1249. [Description("获取选中的文本。"), Category("CklCheckedListBox")]
  1250. [DefaultValue(null)]
  1251. public string[] CheckedTexts
  1252. {
  1253. get
  1254. {
  1255. return this.cklItem.CheckedTexts;
  1256. }
  1257. }
  1258. /// <summary>
  1259. /// 获取选中的值
  1260. /// </summary>
  1261. [Description("获取选中的值。"), Category("CklCheckedListBox")]
  1262. [DefaultValue(null)]
  1263. public object[] CheckedValues
  1264. {
  1265. get
  1266. {
  1267. return this.cklItem.CheckedValues;
  1268. }
  1269. }
  1270. /// <summary>
  1271. /// 获取选中项的文本表示形式,用【,】隔开。
  1272. /// </summary>
  1273. [Description("获取选中项的文本表示形式,用【,】隔开。"), Category("CklCheckedListBox")]
  1274. [DefaultValue(null)]
  1275. public string CheckedText
  1276. {
  1277. get
  1278. {
  1279. return this.cklItem.CheckedText;
  1280. }
  1281. }
  1282. /// <summary>
  1283. /// 获取选中项的值,用【,】隔开
  1284. /// </summary>
  1285. [Description("获取选中项的值,用【,】隔开。"), Category("CklCheckedListBox")]
  1286. [DefaultValue(null)]
  1287. public string CheckedValue
  1288. {
  1289. get
  1290. {
  1291. return this.cklItem.CheckedValue;
  1292. }
  1293. }
  1294. ///// <summary>
  1295. ///// 获取或设置控件是否单项选中。
  1296. ///// </summary>
  1297. //[Description("获取或设置控件是否单项选中。"), Category("CustomerEx")]
  1298. //[DefaultValue(false)]
  1299. ////[Browsable(false)]
  1300. //[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  1301. //[EditorBrowsable(EditorBrowsableState.Never)]
  1302. //public bool SimpleChecked
  1303. //{
  1304. // get
  1305. // {
  1306. // return this.cklItem.SimpleChecked;
  1307. // }
  1308. // set
  1309. // {
  1310. // this.cklItem.SimpleChecked = value;
  1311. // }
  1312. //}
  1313. /// <summary>
  1314. /// 获取一个值,该值指示控件是否有输入焦点。
  1315. /// </summary>
  1316. [DefaultValue(false)]
  1317. [Browsable(false)]
  1318. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  1319. [EditorBrowsable(EditorBrowsableState.Advanced)]
  1320. public virtual bool Entered
  1321. {
  1322. get
  1323. {
  1324. return this._entered;
  1325. }
  1326. protected set
  1327. {
  1328. if (this._entered != value)
  1329. {
  1330. this._entered = value;
  1331. this.InvalidateBorder();
  1332. }
  1333. }
  1334. }
  1335. /// <summary>
  1336. /// 获取一个值,该值指示鼠标是否在控件上方。
  1337. /// </summary>
  1338. [DefaultValue(false)]
  1339. [Browsable(false)]
  1340. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  1341. [EditorBrowsable(EditorBrowsableState.Advanced)]
  1342. public virtual bool MouseOver
  1343. {
  1344. get
  1345. {
  1346. return this._mouseOver;
  1347. }
  1348. protected set
  1349. {
  1350. if (this._mouseOver != value)
  1351. {
  1352. this._mouseOver = value;
  1353. this.InvalidateBorder();
  1354. }
  1355. }
  1356. }
  1357. #endregion
  1358. #region 事件处理
  1359. /// <summary>
  1360. /// 当某项的选中状态更改后发生。
  1361. /// </summary>
  1362. [Description("当某项的选中状态更改后发生。"), Category("CklCheckedListBox")]
  1363. public event ItemCheckedEventHandler ItemChecked
  1364. {
  1365. add
  1366. {
  1367. this.cklItem.ItemChecked += value;
  1368. }
  1369. remove
  1370. {
  1371. this.cklItem.ItemChecked -= value;
  1372. }
  1373. }
  1374. #endregion
  1375. #region 公有方法
  1376. /// <summary>
  1377. /// 返回指定项的成员属性的值
  1378. /// </summary>
  1379. /// <param name="item">项</param>
  1380. /// <returns>值</returns>
  1381. public virtual object GetItemValue(object item)
  1382. {
  1383. return this.cklItem.GetItemValue(item);
  1384. }
  1385. /// <summary>
  1386. /// 返回选中项的文本表示形式
  1387. /// </summary>
  1388. /// <returns>选中项的文本</returns>
  1389. public virtual List<string> GetCheckedItemTexts()
  1390. {
  1391. return this.cklItem.GetCheckedItemTexts();
  1392. }
  1393. /// <summary>
  1394. /// 返回选中项的成员属性的值
  1395. /// </summary>
  1396. /// <returns>选中项的值</returns>
  1397. public virtual List<object> GetCheckedItemValues()
  1398. {
  1399. return this.cklItem.GetCheckedItemValues();
  1400. }
  1401. /// <summary>
  1402. /// 返回选中项的成员属性的值
  1403. /// </summary>
  1404. /// <returns>选中项的值</returns>
  1405. public virtual List<T> GetCheckedItemValues<T>()
  1406. {
  1407. return this.cklItem.GetCheckedItemValues<T>();
  1408. }
  1409. /// <summary>
  1410. /// 设置全部项目选中状态
  1411. /// </summary>
  1412. /// <param name="value">若要将该项设置为选中,则为 true;否则为 false</param>
  1413. public virtual void SetAllItemsChecked(bool value)
  1414. {
  1415. //this.chkAll.Checked = value;
  1416. if (value)
  1417. {
  1418. this.chkAll.CheckState = CheckState.Checked;
  1419. }
  1420. else
  1421. {
  1422. this.chkAll.CheckState = CheckState.Unchecked;
  1423. }
  1424. }
  1425. /// <summary>
  1426. /// 设置全部项目选中状态
  1427. /// </summary>
  1428. /// <param name="value">若要将该项设置为选中,则为 true;否则为 false</param>
  1429. public virtual void SetAllItemsChecked(CheckState value)
  1430. {
  1431. this.chkAll.CheckState = value;
  1432. }
  1433. /// <summary>
  1434. /// 获取全部项目的选中状态
  1435. /// </summary>
  1436. /// <returns>选中状态</returns>
  1437. public virtual CheckState GetItemsCheckState()
  1438. {
  1439. //return this.cklItem.GetItemsCheckState();
  1440. return this.chkAll.CheckState;
  1441. }
  1442. /// <summary>
  1443. /// 选中指定项目
  1444. /// </summary>
  1445. /// <param name="items">要为其设置复选状态的项</param>
  1446. /// <param name="value">若要将该项设置为选中,则为 true;否则为 false</param>
  1447. public virtual void SetItemCheckedByItem(bool value, params object[] items)
  1448. {
  1449. this.cklItem.SetItemCheckedByItem(value, items);
  1450. }
  1451. /// <summary>
  1452. /// 选中指定值的项目
  1453. /// </summary>
  1454. /// <param name="itemValues">要为其设置复选状态的项的值</param>
  1455. /// <param name="value">若要将该项设置为选中,则为 true;否则为 false</param>
  1456. public virtual void SetItemCheckedByValue(bool value, params object[] itemValues)
  1457. {
  1458. this.cklItem.SetItemCheckedByValue(value, itemValues);
  1459. }
  1460. /// <summary>
  1461. /// 将指定索引处的项的 System.Windows.Forms.CheckState 设置为 Checked
  1462. /// </summary>
  1463. /// <param name="value">若要将该项设置为选中,则为 true;否则为 false</param>
  1464. /// <param name="indexs">要为其设置复选状态的项的索引</param>
  1465. public void SetItemChecked(bool value, params int[] indexs)
  1466. {
  1467. this.cklItem.SetItemChecked(value, indexs);
  1468. }
  1469. /*
  1470. /// <summary>
  1471. /// 设置指定索引处项的复选状态
  1472. /// </summary>
  1473. /// <param name="index">要为其设置状态的项的索引</param>
  1474. /// <param name="value"></param>
  1475. public void SetItemChecked(int index, bool value)
  1476. {
  1477. this.clstItem.SetItemChecked(index, value);
  1478. }
  1479. /// <summary>
  1480. /// 设置指定索引处项的复选状态
  1481. /// </summary>
  1482. /// <param name="index">要为其设置状态的项的索引</param>
  1483. /// <param name="value">System.Windows.Forms.CheckState 值之一</param>
  1484. public void SetItemCheckState(int index, CheckState value)
  1485. {
  1486. this.clstItem.SetItemChecked(index, value);
  1487. }
  1488. */
  1489. #endregion
  1490. #endregion
  1491. #endregion
  1492. #region 属性
  1493. #region CustomerEx
  1494. /// <summary>
  1495. /// 获取或设置全选CheckBox的Text。
  1496. /// </summary>
  1497. [Description("获取或设置全选CheckBox的Text。"), Category("CustomerEx")]
  1498. [DefaultValue("全部")]
  1499. public string TextAll
  1500. {
  1501. get
  1502. {
  1503. return this.chkAll.Text;
  1504. }
  1505. set
  1506. {
  1507. this.chkAll.Text = value;
  1508. }
  1509. }
  1510. /// <summary>
  1511. /// 获取或设置一个值,该值指示此全选是否允许三种复选状态而不是两种。
  1512. /// </summary>
  1513. [Description("获取或设置一个值,该值指示此全选是否允许三种复选状态而不是两种。"), Category("CustomerEx")]
  1514. [DefaultValue(false)]
  1515. public bool ThreeState
  1516. {
  1517. get
  1518. {
  1519. return this.chkAll.ThreeState;
  1520. }
  1521. set
  1522. {
  1523. this.chkAll.ThreeState = value;
  1524. if (!value)
  1525. {
  1526. this._indeterminateIndices.Clear();
  1527. }
  1528. }
  1529. }
  1530. /// <summary>
  1531. /// 获取或设置控件的背景色。
  1532. /// </summary>
  1533. //[Description("获取或设置控件的背景色。"), Category("CustomerEx")]
  1534. [DefaultValue(typeof(Color), "Window")]
  1535. public override Color BackColor
  1536. {
  1537. get
  1538. {
  1539. Color bc = base.BackColor;
  1540. if (bc.IsEmpty)
  1541. {
  1542. return SystemColors.Window;
  1543. }
  1544. return bc;
  1545. }
  1546. set
  1547. {
  1548. if (value.IsEmpty)
  1549. {
  1550. base.BackColor = SystemColors.Window;
  1551. }
  1552. else
  1553. {
  1554. base.BackColor = value;
  1555. }
  1556. }
  1557. }
  1558. /// <summary>
  1559. /// 获取或设置用户控件的边框样式
  1560. /// </summary>
  1561. //[Description("获取或设置用户控件的边框样式。"), Category("CustomerEx")]
  1562. [Browsable(true)]
  1563. [EditorBrowsable(EditorBrowsableState.Always)]
  1564. [DefaultValue(typeof(BorderStyle), "FixedSingle")]
  1565. public new BorderStyle BorderStyle
  1566. {
  1567. get
  1568. {
  1569. return base.BorderStyle;
  1570. }
  1571. set
  1572. {
  1573. base.BorderStyle = value;
  1574. }
  1575. }
  1576. /// <summary>
  1577. /// 获取或设置全部项目的选中状态。
  1578. /// </summary>
  1579. [DefaultValue(typeof(CheckState), "Unchecked")]
  1580. [Description("获取或设置全部项目的选中状态。"), Category("CustomerEx")]
  1581. public CheckState CheckedState
  1582. {
  1583. get
  1584. {
  1585. return this.chkAll.CheckState;
  1586. }
  1587. set
  1588. {
  1589. this.chkAll.CheckState = value;
  1590. }
  1591. }
  1592. #endregion
  1593. #endregion
  1594. #region 重写事件
  1595. #region 属性改变
  1596. /// <summary>
  1597. /// 引发 HasErrorChanged 事件
  1598. /// </summary>
  1599. /// <param name="e">包含事件数据的 EventArgs</param>
  1600. protected virtual void OnHasErrorChanged(EventArgs e)
  1601. {
  1602. EventHandler eventHandler = (EventHandler)base.Events[EventHasErrorChanged];
  1603. if (eventHandler != null)
  1604. {
  1605. eventHandler(this, e);
  1606. }
  1607. }
  1608. /// <summary>
  1609. /// 字体改变事件
  1610. /// </summary>
  1611. /// <param name="e"></param>
  1612. protected override void OnFontChanged(EventArgs e)
  1613. {
  1614. base.OnAutoSizeChanged(e);
  1615. this.chkAll.Font = this.Font;
  1616. this.cklItem.Font = this.Font;
  1617. }
  1618. /// <summary>
  1619. /// 背景色改变事件
  1620. /// </summary>
  1621. /// <param name="e"></param>
  1622. protected override void OnBackColorChanged(EventArgs e)
  1623. {
  1624. base.OnBackColorChanged(e);
  1625. this.pnlAll.BackColor = this.BackColor;
  1626. this.pnlItem.BackColor = this.BackColor;
  1627. this.chkAll.BackColor = this.BackColor;
  1628. this.cklItem.BackColor = this.BackColor;
  1629. }
  1630. /// <summary>
  1631. /// 字体颜色改变
  1632. /// </summary>
  1633. /// <param name="e"></param>
  1634. protected override void OnForeColorChanged(EventArgs e)
  1635. {
  1636. base.OnForeColorChanged(e);
  1637. this.pnlAll.ForeColor = this.ForeColor;
  1638. this.pnlItem.ForeColor = this.ForeColor;
  1639. this.chkAll.ForeColor = this.ForeColor;
  1640. this.cklItem.ForeColor = this.ForeColor;
  1641. }
  1642. /// <summary>
  1643. /// ImeMode改变
  1644. /// </summary>
  1645. /// <param name="e"></param>
  1646. protected override void OnImeModeChanged(EventArgs e)
  1647. {
  1648. base.OnImeModeChanged(e);
  1649. this.pnlAll.ImeMode = this.ImeMode;
  1650. this.pnlItem.ImeMode = this.ImeMode;
  1651. this.chkAll.ImeMode = this.ImeMode;
  1652. this.cklItem.ImeMode = this.ImeMode;
  1653. }
  1654. /// <summary>
  1655. /// RightToLeft改变
  1656. /// </summary>
  1657. /// <param name="e"></param>
  1658. protected override void OnRightToLeftChanged(EventArgs e)
  1659. {
  1660. base.OnRightToLeftChanged(e);
  1661. this.pnlAll.RightToLeft = this.RightToLeft;
  1662. this.pnlItem.RightToLeft = this.RightToLeft;
  1663. this.chkAll.RightToLeft = this.RightToLeft;
  1664. this.cklItem.RightToLeft = this.RightToLeft;
  1665. }
  1666. #endregion
  1667. #region 键盘事件
  1668. #endregion
  1669. #region 焦点事件
  1670. /// <summary>
  1671. /// 输入焦点进入控件
  1672. /// </summary>
  1673. /// <param name="e"></param>
  1674. protected override void OnEnter(EventArgs e)
  1675. {
  1676. this.Entered = true;
  1677. base.OnEnter(e);
  1678. }
  1679. /// <summary>
  1680. /// 获得焦点
  1681. /// </summary>
  1682. /// <param name="e"></param>
  1683. protected override void OnGotFocus(EventArgs e)
  1684. {
  1685. base.OnGotFocus(e);
  1686. }
  1687. /// <summary>
  1688. /// 失去焦点
  1689. /// </summary>
  1690. /// <param name="e"></param>
  1691. protected override void OnLostFocus(EventArgs e)
  1692. {
  1693. base.OnLostFocus(e);
  1694. }
  1695. /// <summary>
  1696. /// 输入焦点离开控件
  1697. /// </summary>
  1698. /// <param name="e"></param>
  1699. protected override void OnLeave(EventArgs e)
  1700. {
  1701. base.OnLeave(e);
  1702. //this.Entered = false;
  1703. }
  1704. /// <summary>
  1705. /// 控件正在验证
  1706. /// </summary>
  1707. /// <param name="e"></param>
  1708. protected override void OnValidating(CancelEventArgs e)
  1709. {
  1710. base.OnValidating(e);
  1711. if (this.HasError && !this._canLostFocusOnError)
  1712. {
  1713. e.Cancel = true;
  1714. }
  1715. }
  1716. /// <summary>
  1717. /// 控件完成验证
  1718. /// </summary>
  1719. /// <param name="e"></param>
  1720. protected override void OnValidated(EventArgs e)
  1721. {
  1722. this.Entered = false;
  1723. base.OnValidated(e);
  1724. }
  1725. #endregion
  1726. #region 鼠标事件
  1727. /// <summary>
  1728. /// 鼠标进入控件
  1729. /// </summary>
  1730. /// <param name="e"></param>
  1731. protected override void OnMouseEnter(EventArgs e)
  1732. {
  1733. this.MouseOver = true;
  1734. base.OnMouseEnter(e);
  1735. }
  1736. /// <summary>
  1737. /// 鼠标离开控件
  1738. /// </summary>
  1739. /// <param name="e"></param>
  1740. protected override void OnMouseLeave(EventArgs e)
  1741. {
  1742. base.OnMouseLeave(e);
  1743. this.MouseOver = false;
  1744. }
  1745. /// <summary>
  1746. /// 鼠标移动
  1747. /// </summary>
  1748. /// <param name="e"></param>
  1749. protected override void OnMouseMove(MouseEventArgs e)
  1750. {
  1751. base.OnMouseMove(e);
  1752. }
  1753. /// <summary>
  1754. /// 鼠标按下
  1755. /// </summary>
  1756. /// <param name="e"></param>
  1757. protected override void OnMouseDown(MouseEventArgs e)
  1758. {
  1759. base.OnMouseDown(e);
  1760. }
  1761. /// <summary>
  1762. /// 鼠标抬起
  1763. /// </summary>
  1764. /// <param name="e"></param>
  1765. protected override void OnMouseUp(MouseEventArgs e)
  1766. {
  1767. base.OnMouseUp(e);
  1768. }
  1769. #endregion
  1770. #endregion
  1771. #region 重写方法
  1772. /// <summary>
  1773. /// 处理 Windows 消息
  1774. /// </summary>
  1775. /// <param name="m">要处理的 Windows System.Windows.Forms.Message</param>
  1776. protected override void WndProc(ref Message m)
  1777. {
  1778. base.WndProc(ref m);
  1779. if (m.Msg == (int)WindowsMessage.WM_PAINT ||
  1780. m.Msg == (int)WindowsMessage.WM_NCPAINT ||
  1781. m.Msg == (int)WindowsMessage.WM_CTLCOLOREDIT)
  1782. {
  1783. //this.WmBorderPaint(ref m);
  1784. BorderColorPaint.WmBorderPaint(this._borderColor, this.Width, this.Height, ref m);
  1785. }
  1786. }
  1787. #endregion
  1788. #region 事件处理
  1789. /// <summary>
  1790. /// 获得焦点
  1791. /// </summary>
  1792. /// <param name="sender"></param>
  1793. /// <param name="e"></param>
  1794. private void cklItem_Enter(object sender, EventArgs e)
  1795. {
  1796. this.OnEnter(e);
  1797. }
  1798. /// <summary>
  1799. /// 焦点离开
  1800. /// </summary>
  1801. /// <param name="sender"></param>
  1802. /// <param name="e"></param>
  1803. private void cklItem_Leave(object sender, EventArgs e)
  1804. {
  1805. this.OnLeave(e);
  1806. }
  1807. /// <summary>
  1808. /// 鼠标进入控件
  1809. /// </summary>
  1810. /// <param name="sender"></param>
  1811. /// <param name="e"></param>
  1812. private void cklItem_MouseEnter(object sender, EventArgs e)
  1813. {
  1814. this.OnMouseEnter(e);
  1815. }
  1816. /// <summary>
  1817. /// 鼠标离开控件
  1818. /// </summary>
  1819. /// <param name="sender"></param>
  1820. /// <param name="e"></param>
  1821. private void cklItem_MouseLeave(object sender, EventArgs e)
  1822. {
  1823. this.OnMouseLeave(e);
  1824. }
  1825. /// <summary>
  1826. /// 全部选择
  1827. /// </summary>
  1828. /// <param name="sender"></param>
  1829. /// <param name="e"></param>
  1830. private void pnlAll_Click(object sender, EventArgs e)
  1831. {
  1832. if (this.chkAll.ThreeState)
  1833. {
  1834. int cs = (int)this.chkAll.CheckState + 1;
  1835. cs = cs > 2 ? 0 : cs;
  1836. this.chkAll.CheckState = (CheckState)cs;
  1837. }
  1838. else
  1839. {
  1840. this.chkAll.Checked = !this.chkAll.Checked;
  1841. }
  1842. }
  1843. /// <summary>
  1844. /// 全部选择状态改变
  1845. /// </summary>
  1846. /// <param name="sender"></param>
  1847. /// <param name="e"></param>
  1848. private void chkAll_CheckedChanged(object sender, EventArgs e)
  1849. {
  1850. //if (this._isCheckAll.HasValue && !this._isCheckAll.Value)
  1851. //{
  1852. // return;
  1853. //}
  1854. //this._isCheckAll = true;
  1855. //if (this._mustInput)
  1856. //{
  1857. // CheckState cs = this.cklItem.GetItemsCheckState();
  1858. // if (cs != CheckState.Checked)
  1859. // {
  1860. // this.cklItem.SetItemsChecked(true);
  1861. // }
  1862. // this._isCheckAll = false;
  1863. // this.chkAll.Checked = true;
  1864. // this._isCheckAll = null;
  1865. // this.ValidateData();
  1866. // return;
  1867. //}
  1868. //this.cklItem.SetItemsChecked(this.chkAll.Checked);
  1869. //this._isCheckAll = null;
  1870. }
  1871. /// <summary>
  1872. /// 全部选择状态改变
  1873. /// </summary>
  1874. /// <param name="sender"></param>
  1875. /// <param name="e"></param>
  1876. private void chkAll_CheckStateChanged(object sender, EventArgs e)
  1877. {
  1878. if (this._isCheckAll.HasValue)
  1879. {
  1880. return;
  1881. }
  1882. if (this.cklItem.Items.Count == 0)
  1883. {
  1884. this._isCheckAll = false;
  1885. this.chkAll.Checked = false;
  1886. this._isCheckAll = null;
  1887. return;
  1888. }
  1889. this._isCheckAll = true;
  1890. switch (this.chkAll.CheckState)
  1891. {
  1892. case CheckState.Checked:
  1893. if (this.cklItem.SimpleChecked)
  1894. {
  1895. this._isCheckAll = null;
  1896. this.cklItem.ResetMustOrSimpleChecked();
  1897. this._isCheckAll = false;
  1898. this.chkAll.CheckState = this.cklItem.GetItemsCheckState();
  1899. this._isCheckAll = null;
  1900. return;
  1901. }
  1902. else
  1903. {
  1904. this.cklItem.SetItemsChecked(true);
  1905. }
  1906. break;
  1907. case CheckState.Unchecked:
  1908. if (this._mustInput)
  1909. {
  1910. this._isCheckAll = null;
  1911. this.chkAll.Checked = true;
  1912. return;
  1913. }
  1914. this.cklItem.SetItemsChecked(false);
  1915. break;
  1916. case CheckState.Indeterminate:
  1917. if (this.cklItem.SimpleChecked)
  1918. {
  1919. this._isCheckAll = null;
  1920. this.cklItem.ResetMustOrSimpleChecked();
  1921. this._isCheckAll = false;
  1922. this.chkAll.CheckState = this.cklItem.GetItemsCheckState();
  1923. this._isCheckAll = null;
  1924. return;
  1925. }
  1926. else
  1927. {
  1928. if (this._indeterminateIndices != null &&
  1929. this._indeterminateIndices.Count > 0)
  1930. {
  1931. this._isCheckAll = true;
  1932. for (int i = 0; i < this.cklItem.Items.Count; i++)
  1933. {
  1934. this.SetItemChecked(this._indeterminateIndices.Contains(i), i);
  1935. }
  1936. }
  1937. else
  1938. {
  1939. this._isCheckAll = null;
  1940. this.chkAll.Checked = false;
  1941. return;
  1942. }
  1943. }
  1944. break;
  1945. default:
  1946. break;
  1947. }
  1948. this._isCheckAll = null;
  1949. this.ValidateData();
  1950. }
  1951. /// <summary>
  1952. /// 项目选择状态改变
  1953. /// </summary>
  1954. /// <param name="sender"></param>
  1955. /// <param name="e"></param>
  1956. private void cklItem_ItemChecked(object sender, ItemCheckEventArgs e)
  1957. {
  1958. if (this._isCheckAll.HasValue)
  1959. {
  1960. return;
  1961. }
  1962. this._isCheckAll = false;
  1963. this.chkAll.CheckState = this.cklItem.GetItemsCheckState();
  1964. if (this.chkAll.ThreeState)
  1965. {
  1966. // 点击项目变成全选状态时,是否记录-不记录。
  1967. //this._indeterminateIndices.Clear();
  1968. if (this.chkAll.CheckState == CheckState.Indeterminate)
  1969. {
  1970. // 点击项目变成全选状态时,是否记录-记录。
  1971. this._indeterminateIndices.Clear();
  1972. foreach (int checkedIndex in this.cklItem.CheckedIndices)
  1973. {
  1974. this._indeterminateIndices.Add(checkedIndex);
  1975. }
  1976. }
  1977. }
  1978. this._isCheckAll = null;
  1979. if (this._mustInput)
  1980. {
  1981. this.ValidateData();
  1982. }
  1983. }
  1984. /// <summary>
  1985. /// 验证有错误时
  1986. /// </summary>
  1987. /// <param name="sender"></param>
  1988. /// <param name="e"></param>
  1989. private void cklItem_HasErrorChanged(object sender, EventArgs e)
  1990. {
  1991. this.OnHasErrorChanged(e);
  1992. this.InvalidateBorder();
  1993. }
  1994. /// <summary>
  1995. /// 键盘按下事件
  1996. /// </summary>
  1997. /// <param name="sender"></param>
  1998. /// <param name="e"></param>
  1999. private void chkAll_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
  2000. {
  2001. switch (e.KeyCode)
  2002. {
  2003. case Keys.Up:
  2004. case Keys.Left:
  2005. case Keys.Down:
  2006. case Keys.Right:
  2007. if (this.cklItem.Items.Count > 0)
  2008. {
  2009. this.cklItem.Focus();
  2010. if (this.cklItem.SelectedIndex == -1)
  2011. {
  2012. this.cklItem.SelectedIndex = 0;
  2013. }
  2014. }
  2015. break;
  2016. default:
  2017. break;
  2018. }
  2019. }
  2020. /// <summary>
  2021. /// 在移动鼠标滚轮并且控件有焦点时发生
  2022. /// </summary>
  2023. /// <param name="sender"></param>
  2024. /// <param name="e"></param>
  2025. private void chkAll_MouseWheel(object sender, MouseEventArgs e)
  2026. {
  2027. //if (e.Delta > 0)
  2028. //{
  2029. // this.lstItem.SelectPrevItem();
  2030. //}
  2031. //else
  2032. //{
  2033. // this.lstItem.SelectNextItem();
  2034. //}
  2035. if (this.cklItem.Items.Count > 0)
  2036. {
  2037. this.cklItem.Focus();
  2038. if (this.cklItem.SelectedIndex == -1)
  2039. {
  2040. this.cklItem.SelectedIndex = 0;
  2041. }
  2042. }
  2043. }
  2044. /// <summary>
  2045. /// 无选择项目
  2046. /// </summary>
  2047. /// <param name="sender"></param>
  2048. /// <param name="e"></param>
  2049. private void cklItem_SelectedIndexChanged(object sender, EventArgs e)
  2050. {
  2051. if (this.cklItem.SelectedIndex == -1)
  2052. {
  2053. this.chkAll.Focus();
  2054. }
  2055. }
  2056. /// <summary>
  2057. /// 全选checkbox获得焦点
  2058. /// </summary>
  2059. /// <param name="sender"></param>
  2060. /// <param name="e"></param>
  2061. private void chkAll_GotFocus(object sender, EventArgs e)
  2062. {
  2063. this.cklItem.SelectedIndex = -1;
  2064. }
  2065. #endregion
  2066. #region 公有方法
  2067. /// <summary>
  2068. /// 第一个控件获得焦点
  2069. /// </summary>
  2070. public void FocusOnShown()
  2071. {
  2072. this.chkAll.Focus();
  2073. }
  2074. #endregion
  2075. #region 保护方法
  2076. /// <summary>
  2077. /// 设置Item选中状态
  2078. /// </summary>
  2079. protected virtual void ResetMustChecked()
  2080. {
  2081. this.cklItem.ResetMustOrSimpleChecked();
  2082. }
  2083. #endregion
  2084. #region 内部方法
  2085. #endregion
  2086. #region 私有方法
  2087. /// <summary>
  2088. /// 使父控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向父控件发送绘制消息。
  2089. /// </summary>
  2090. private void InvalidateBorder()
  2091. {
  2092. Color? borderColor = BorderColorPaint.GetBorderColor(this as IDataVerifiable, this._entered, this._mouseOver);
  2093. if (borderColor != this._borderColor)
  2094. {
  2095. this._borderColor = borderColor;
  2096. if (this.Parent == null)
  2097. {
  2098. this.Invalidate();
  2099. }
  2100. else
  2101. {
  2102. this.Parent.Invalidate(this.Bounds, true);
  2103. }
  2104. }
  2105. }
  2106. #endregion
  2107. #region IDataVerifiable 成员
  2108. #region 成员变量
  2109. /// <summary>
  2110. /// 显示边框颜色
  2111. /// </summary>
  2112. private bool _showBorderColor = true;
  2113. /// <summary>
  2114. /// 控件的项目名
  2115. /// </summary>
  2116. private string _itemName = null;
  2117. /// <summary>
  2118. /// 控件是否是必须输入项目
  2119. /// </summary>
  2120. private bool _mustInput = false;
  2121. /// <summary>
  2122. /// 控件在验证输入错误时,如何提示
  2123. /// </summary>
  2124. private InputErrorAlert _errorAlert = InputErrorAlert.Validated;
  2125. /// <summary>
  2126. /// 是否显示必须输入项目的提示
  2127. /// </summary>
  2128. private bool _showMustInputAlert = true;
  2129. /// <summary>
  2130. /// 验证不通过时,焦点能否离开
  2131. /// </summary>
  2132. private bool _canLostFocusOnError = true;
  2133. /// <summary>
  2134. /// 验证是否有错误
  2135. /// </summary>
  2136. private bool _hasError = false;
  2137. /// <summary>
  2138. /// 是否自定义错误
  2139. /// </summary>
  2140. private bool _hasCustomerError = false;
  2141. /// <summary>
  2142. /// 错误编码
  2143. /// </summary>
  2144. private ControlErrorCode _errorCode = ControlErrorCode.DKC_0000;
  2145. /// <summary>
  2146. /// 错误消息
  2147. /// </summary>
  2148. private string _errorMessage = null;
  2149. /// <summary>
  2150. /// 自定义错误消息
  2151. /// </summary>
  2152. private string _customerErrorMessage = null;
  2153. #endregion
  2154. #region 属性
  2155. /// <summary>
  2156. /// 获取或设置控件是否显示边框颜色。
  2157. /// </summary>
  2158. [Description("获取或设置控件是否显示边框颜色。"), Category("IDataVerifiable")]
  2159. [DefaultValue(true)]
  2160. public bool ShowBorderColor
  2161. {
  2162. get
  2163. {
  2164. return this._showBorderColor;
  2165. }
  2166. set
  2167. {
  2168. if (this._showBorderColor != value)
  2169. {
  2170. this._showBorderColor = value;
  2171. this.InvalidateBorder();
  2172. }
  2173. }
  2174. }
  2175. /// <summary>
  2176. /// 获取或设置控件的项目名
  2177. /// </summary>
  2178. [Description("获取或设置控件的项目名。"), Category("IDataVerifiable")]
  2179. [DefaultValue(null)]
  2180. public string CDItemName
  2181. {
  2182. get
  2183. {
  2184. return this._itemName;
  2185. }
  2186. set
  2187. {
  2188. this._itemName = value;
  2189. }
  2190. }
  2191. /// <summary>
  2192. /// 获取或设置控件是否必须选中项目。
  2193. /// </summary>
  2194. [Description("获取或设置控件是否必须选中项目。"), Category("IDataVerifiable")]
  2195. [DefaultValue(false)]
  2196. public bool MustInput
  2197. {
  2198. get
  2199. {
  2200. return this._mustInput;
  2201. }
  2202. set
  2203. {
  2204. if (this._mustInput != value)
  2205. {
  2206. this._mustInput = value;
  2207. this.cklItem.MustInput = value;
  2208. if (this._mustInput && this._showMustInputAlert)
  2209. {
  2210. this.InvalidateBorder();
  2211. }
  2212. }
  2213. }
  2214. }
  2215. /// <summary>
  2216. /// 获取或设置控件是否必须选中项目。
  2217. /// </summary>
  2218. [Description("获取或设置控件在验证输入错误时,如何提示。"), Category("IDataVerifiable")]
  2219. [DefaultValue(typeof(InputErrorAlert), "Validated")]
  2220. public InputErrorAlert InputErrorAlert
  2221. {
  2222. get
  2223. {
  2224. return this._errorAlert;
  2225. }
  2226. set
  2227. {
  2228. if (this._errorAlert != value)
  2229. {
  2230. this._errorAlert = value;
  2231. this.InvalidateBorder();
  2232. }
  2233. }
  2234. }
  2235. /// <summary>
  2236. /// 获取或设置控件是否显示必须输入项目提示
  2237. /// </summary>
  2238. [Description("获取或设置控件是否显示必须输入项目提示。"), Category("IDataVerifiable")]
  2239. [DefaultValue(true)]
  2240. public bool ShowMustInputAlert
  2241. {
  2242. get
  2243. {
  2244. return this._showMustInputAlert;
  2245. }
  2246. set
  2247. {
  2248. if (this._showMustInputAlert != value)
  2249. {
  2250. this._showMustInputAlert = value;
  2251. this.InvalidateBorder();
  2252. }
  2253. }
  2254. }
  2255. /// <summary>
  2256. /// 获取或设置当验证不通过时,控件是否可以失去焦点
  2257. /// </summary>
  2258. [Description("获取或设置当验证不通过时,控件是否可以失去焦点。"), Category("IDataVerifiable")]
  2259. [DefaultValue(true)]
  2260. public bool CanLostFocusOnError
  2261. {
  2262. get
  2263. {
  2264. return this._canLostFocusOnError;
  2265. }
  2266. set
  2267. {
  2268. this._canLostFocusOnError = value;
  2269. }
  2270. }
  2271. /// <summary>
  2272. /// 获取控件校验时是否有错误
  2273. /// </summary>
  2274. [Description("获取控件校验时是否有错误。"), Category("IDataVerifiable")]
  2275. [DefaultValue(false)]
  2276. public bool HasError
  2277. {
  2278. get
  2279. {
  2280. return this._hasCustomerError || this._hasError || this.cklItem.HasError;
  2281. }
  2282. }
  2283. /// <summary>
  2284. /// 获取控件校验时的错误编码
  2285. /// </summary>
  2286. [Description("获取控件校验时的错误编码。"), Category("IDataVerifiable")]
  2287. [DefaultValue(typeof(ControlErrorCode), "DKC_0000")]
  2288. public ControlErrorCode ErrorCode
  2289. {
  2290. get
  2291. {
  2292. //return this._hasCustomerError ? ControlErrorCode.DKC_C001 : this._errorCode;
  2293. return this._hasCustomerError ? ControlErrorCode.DKC_C001 : this.cklItem.ErrorCode;
  2294. }
  2295. }
  2296. /// <summary>
  2297. /// 获取控件校验时的错误消息
  2298. /// </summary>
  2299. [Description("获取控件校验时的错误编码。"), Category("IDataVerifiable")]
  2300. [DefaultValue(null)]
  2301. public string ErrorMessage
  2302. {
  2303. get
  2304. {
  2305. //return this._hasCustomerError ? this._customerErrorMessage : this._errorMessage;
  2306. return this._hasCustomerError ? this._customerErrorMessage : this.cklItem.ErrorMessage;
  2307. }
  2308. }
  2309. #endregion
  2310. #region 公有方法
  2311. /// <summary>
  2312. /// 设置自定义错误
  2313. /// </summary>
  2314. /// <param name="hasError">输入是否有错误</param>
  2315. /// <param name="errorMessage">错误消息</param>
  2316. public virtual void SetCustomerError(bool hasError, string errorMessage)
  2317. {
  2318. if (this._hasCustomerError != hasError ||
  2319. this._customerErrorMessage != errorMessage)
  2320. {
  2321. this._hasCustomerError = hasError;
  2322. this._customerErrorMessage = errorMessage;
  2323. this.OnHasErrorChanged(EventArgs.Empty);
  2324. this.InvalidateBorder();
  2325. }
  2326. }
  2327. /// <summary>
  2328. /// 清除自定义错误
  2329. /// </summary>
  2330. public virtual void ClearCustomerError()
  2331. {
  2332. this.SetCustomerError(false, null);
  2333. }
  2334. /// <summary>
  2335. /// 验证输入内容
  2336. /// </summary>
  2337. /// <returns>验证结果</returns>
  2338. public virtual bool ValidateData()
  2339. {
  2340. //bool result = this.cklItem.ValidateData();
  2341. //this.InvalidateBorder();
  2342. //return result;
  2343. if (this._mustInput && this.CheckedState == CheckState.Unchecked)
  2344. {
  2345. this.SetError(true, ControlErrorCode.DKC_0001, this.CDItemName);
  2346. return false;
  2347. }
  2348. this.ClearError();
  2349. return true;
  2350. }
  2351. /// <summary>
  2352. /// 清除输入项
  2353. /// </summary>
  2354. public virtual void ClearValue()
  2355. {
  2356. this.chkAll.Checked = false;
  2357. this._indeterminateIndices.Clear();
  2358. }
  2359. #endregion
  2360. #region 保护方法
  2361. /// <summary>
  2362. /// 设置验证不通过错误
  2363. /// </summary>
  2364. /// <param name="hasError">是否有错误</param>
  2365. /// <param name="code">错误编码</param>
  2366. /// <param name="args">设置格式的对象</param>
  2367. protected void SetError(bool hasError, ControlErrorCode code, params object[] args)
  2368. {
  2369. if (this._hasError != hasError ||
  2370. this._errorCode != code)
  2371. {
  2372. this._hasError = hasError;
  2373. this._errorCode = code;
  2374. if (args != null && args.Length > 0)
  2375. {
  2376. this._errorMessage = string.Format(code.GetDescription(), args);
  2377. }
  2378. else
  2379. {
  2380. this._errorMessage = code.GetDescription();
  2381. }
  2382. this.OnHasErrorChanged(EventArgs.Empty);
  2383. this.InvalidateBorder();
  2384. }
  2385. }
  2386. /// <summary>
  2387. /// 清除验证不通过错误
  2388. /// </summary>
  2389. protected void ClearError()
  2390. {
  2391. this.SetError(false, ControlErrorCode.DKC_0000);
  2392. }
  2393. #endregion
  2394. #endregion
  2395. #region IAsyncControl 成员
  2396. #region 成员变量
  2397. /// <summary>
  2398. /// 异步处理开始时,控件状态
  2399. /// </summary>
  2400. private bool _asyncBeginStatus = false;
  2401. private bool _asyncBeginFocused = false;
  2402. private Control _activeControl = null;
  2403. #endregion
  2404. #region 公有方法
  2405. /// <summary>
  2406. /// 开始异步处理
  2407. /// </summary>
  2408. /// <param name="doFocus">是否处理焦点</param>
  2409. public virtual void BeginAsync(ref bool doFocus)
  2410. {
  2411. this._asyncBeginFocused = false;
  2412. //if (doFocus && this.Focused)
  2413. if (doFocus && this.ActiveControl != null)
  2414. {
  2415. this._asyncBeginFocused = true;
  2416. this._activeControl = this.ActiveControl;
  2417. doFocus = false;
  2418. }
  2419. this._asyncBeginStatus = this.Enabled;
  2420. this.Enabled = false;
  2421. }
  2422. /// <summary>
  2423. /// 结束异步处理
  2424. /// </summary>
  2425. public virtual void EndAsync()
  2426. {
  2427. this.Enabled = this._asyncBeginStatus;
  2428. if (this._asyncBeginFocused)
  2429. {
  2430. //this.Focus();
  2431. this.ActiveControl = this._activeControl;
  2432. this._activeControl = null;
  2433. }
  2434. }
  2435. #endregion
  2436. #endregion
  2437. }
  2438. }