自定義控件---重寫Listbox實現item圖標變換和item點擊事件


????? 博客開通有一陣了,就是沒有時間寫,遺憾啊。!
??????這幾天做了個排序的自定義控件,在listbox item里放是button 并支持圖標的交替變換
效果如下:

把代碼貼上:
 
  1. ??1using?System; ?
  2. ??2using?System.Collections.Generic; ?
  3. ??3using?System.Collections; ?
  4. ??4using?System.Text; ?
  5. ??5using?System.ComponentModel; ?
  6. ??6using?System.Windows.Forms; ?
  7. ??7using?System.Drawing; ?
  8. ??8using?System.Drawing.Text; ?
  9. ??9using?System.Data; ?
  10. ?
  11. namespace?SQLAnalysis ?
  12. { ?
  13. ????public?class?ListBoxEx?:?ListBox ?
  14. ????{ ?
  15. ????????public?ListBoxEx() ?
  16. ????????{ ?
  17. ????????????this.DrawMode?=?DrawMode.OwnerDrawFixed; ?
  18. ????????????btnList?=?new?List<Button>(); ?
  19. ????????} ?
  20. ????????public?override?DrawMode?DrawMode ?
  21. ????????{ ?
  22. ????????????get ?
  23. ????????????{ ?
  24. ????????????????return?DrawMode.OwnerDrawFixed; ?
  25. ????????????} ?
  26. ????????????set ?
  27. ????????????{ ?
  28. ????????????????base.DrawMode?=?DrawMode.OwnerDrawFixed; ?
  29. ????????????} ?
  30. ????????} ?
  31. ??????? ?
  32. ????????protected?override?void?OnResize(EventArgs?e) ?
  33. ????????{ ?
  34. ????????????base.OnResize(e); ?
  35. ????????????this.Refresh(); ?
  36. ????????} ?
  37. ?
  38. ?
  39. ?
  40. ?
  41. ????????public?Button?FindItemButton(int?index) ?
  42. ????????{ ?
  43. ???????????? ?
  44. ????????//?return?this.Controls.Find(this.Name?+?"$ItemComboBox"?+?index.ToString(),?true)[0]; ?
  45. ????????????if?(index?>=?btnList.Count) ?
  46. ????????????????return?null; ?
  47. ????????????return?btnList[index]; ?
  48. ??????????? ?
  49. ????????} ?
  50. ?
  51. ????????///?<summary>?
  52. ????????///?提供刪除item項 ?
  53. ????????///?</summary>?
  54. ????????///?<param?name="index"></param>?
  55. ????????public?void?RemoveItem(int?index) ?
  56. ????????{ ?
  57. ????????????this.Items.RemoveAt(index); ?
  58. ????????????btnList[index].Parent?=?null; ?
  59. ????????????btnList[index]?=?null; ?
  60. ????????????//btnList[index].Dispose(); ?
  61. ???????????? ?
  62. ????????????btnList.RemoveAt(index); ?
  63. ????????????this.Refresh(); ?
  64. ????????} ?
  65. ????????///?<summary>?
  66. ????????///?提供移動item項 ?
  67. ????????///?</summary>?
  68. ????????///?<param?name="offset"></param>?
  69. ????????public?void?MoveItem(int?offset) ?
  70. ????????{ ?
  71. ???????????? ?
  72. ????????????int?index?=?this.SelectedIndex?+?offset; ?
  73. ????????????if?(index?>?-1?&&?index?<?this.Items.Count) ?
  74. ????????????{ ?
  75. ????????????????int?oldSelectedIndex?=?this.SelectedIndex; ?
  76. ????????????????Object?item?=?this.SelectedItem; ?
  77. ????????????????this.Items.RemoveAt(oldSelectedIndex); ?
  78. ????????????????this.Items.Insert(index,?item); ?
  79. ????????????????Button?btn?=?btnList[oldSelectedIndex]; ?
  80. ????????????????btnList.RemoveAt(oldSelectedIndex); ?
  81. ????????????????btnList.Insert(index,?btn); ?
  82. ?
  83. ????????????????this.Refresh(); ?
  84. ????????????} ?
  85. ????????????else ?
  86. ????????????{ ?
  87. ????????????????MessageBox.Show("不是可用的移動矢量"); ?
  88. ?
  89. ????????????} ?
  90. ?
  91. ????????} ?
  92. ?
  93. ????????private?ToggleItem?GetNexttoggleItem(ToggleItem?tog) ?
  94. ????????{ ?
  95. ????????????int?index?=?-1; ?
  96. ????????????for?(int?i?=?0;?i?<?ToggleItemList.Count;?i++) ?
  97. ????????????{ ?
  98. ????????????????ToggleItem?item?=(ToggleItem)ToggleItemList[i]; ?
  99. ????????????????if?(item.Tag?==?tog.Tag) ?
  100. ????????????????{ ?
  101. ????????????????????iindex?=?i; ?
  102. ????????????????????break; ?
  103. ????????????????} ?
  104. ????????????} ?
  105. ????????????return?((ToggleItem)ToggleItemList[(index?+?1)?%?ToggleItemList.Count]); ?
  106. ????????} ?
  107. ????????private?List<ToggleItem>?toggleItemList?;//List<ToggleItem>?toggleItemList?=?new?List<ToggleItem>(); ?
  108. ????????[Bindable(false),?Browsable(false)] ?
  109. ????????[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]??? ?
  110. ????????public?List<ToggleItem>?ToggleItemList ?
  111. ????????{ ?
  112. ????????????get ?
  113. ????????????{ ?
  114. ????????????????if?(toggleItemList?==?null) ?
  115. ????????????????????toggleItemList?=?new?List<ToggleItem>(); ?
  116. ????????????????return?toggleItemList; ?
  117. ????????????} ?
  118. ?
  119. ????????????set ?
  120. ????????????{ ?
  121. ????????????????if?(toggleItemList?==?null) ?
  122. ????????????????????toggleItemList?=?new?List<ToggleItem>(); ?
  123. ????????????????toggleItemList?=?value; ?
  124. ????????????} ?
  125. ????????} ?
  126. ?
  127. ????????//主要重寫事件 ?
  128. ????????protected?override?void?OnDrawItem(DrawItemEventArgs?e) ?
  129. ????????{ ?
  130. ????????????this.DrawMode?=?DrawMode.OwnerDrawFixed; ?
  131. ????????????this.ItemHeight?=?22; ?
  132. ????????????e.DrawBackground(); ?
  133. ????????????e.DrawFocusRectangle(); ?
  134. ????????????Brush?myBrush?=?Brushes.Black; ?
  135. ????????????if?(e.Index?>?-1?&&?e.Index?<?this.Items.Count) ?
  136. ????????????{ ?
  137. ????????????????string?drawString?=?(e.Index?+?1)+?"?"?+?this.Items[e.Index].ToString(); ?
  138. ???????????????? ?
  139. ?
  140. ????????????????e.Graphics.DrawString(drawString,?e.Font,?new?SolidBrush(e.ForeColor),?e.Bounds,? ?
  141. ?
  142. StringFormat.GenericDefault); ?
  143. ????????????????AddButtonToItem(e); ?
  144. ????????????} ?
  145. ????????????base.OnDrawItem(e); ?
  146. ?
  147. ????????} ?
  148. ?
  149. ????????private?List<Button>?btnList?=?null; ?
  150. ????????protected?void?AddButtonToItem(DrawItemEventArgs?e) ?
  151. ????????{ ?
  152. ????????????if?(btnList.Count?<=?e.Index) ?
  153. ????????????{ ?
  154. ????????????????btnList.Add(new?Button()); ?
  155. ????????????????Button?btn?=?btnList[e.Index]; ?
  156. ????????????????btn.BackColor?=?System.Drawing.Color.LightSkyBlue?; ?
  157. ????????????????btn.Name?=?this.Name?+?"$ItemButton"?+?e.Index.ToString(); ?
  158. ????????????????btn.Width?=?20; ?
  159. ????????????????btn.Height?=?20; ?
  160. ????????????????btn.ImageAlign?=?ContentAlignment.MiddleCenter; ?
  161. ????????????????btn.TextImageRelation?=?TextImageRelation.ImageAboveText; ?
  162. ????????????????if?(toggleItemList.Count?>?0) ?
  163. ????????????????{ ?
  164. ???????????????????? ?
  165. ????????????????????btn.BackgroundImage?=?((ToggleItem)toggleItemList[0]).BGImage; ?
  166. ????????????????????//btn.Width?=?toggleItemList[0].BGImage.Width; ?
  167. ????????????????????//btn.Height?=?toggleItemList[0].BGImage.Height; ?
  168. ????????????????????btn.Tag?=?((ToggleItem)toggleItemList[0]).Tag; ?
  169. ????????????????} ?
  170. ????????????????btn.Parent?=?this; ?
  171. ????????????????btn.Click?+=?new?EventHandler(ItemButtonClickHandler); ?
  172. ????????????} ?
  173. ????????????Button?bt?=?btnList[e.Index]; ?
  174. ????????????bt.Left?=?this.Width?-?bt.Width?-?20; ?
  175. ????????????bt.Top?=?e.Bounds.Top; ?
  176. ??????????? ?
  177. ????????} ?
  178. ????????///?<summary>?
  179. ????????///?item?button雙擊事件; ?
  180. ????????///?</summary>?
  181. ????????///?<param?name="sender"></param>?
  182. ????????///?<param?name="e"></param>?
  183. ????????protected?void?ItemButtonClickHandler(object?sender,?EventArgs?e) ?
  184. ????????{ ?
  185. ????????????int?index?=?-1; ?
  186. ????????????if?(sender?is?Button) ?
  187. ????????????????index?=?this.IndexFromPoint(((Button)sender).Location); ?
  188. ?
  189. ????????????if?(index?==?-1) ?
  190. ????????????????return; ?
  191. ?
  192. ????????????Button?btn?=?sender?as?Button; ?
  193. ????????????ToggleItem?togold?=?new?ToggleItem((string)btn.Tag,?btn.BackgroundImage); ?
  194. ????????????ToggleItem?tognew?=?this.GetNexttoggleItem(togold); ?
  195. ????????????//btn.Width?=?tognew.BGImage.Width; ?
  196. ????????????//btn.Height?=?tognew.BGImage.Height; ?
  197. ????????????btn.BackgroundImage?=?tognew.BGImage; ?
  198. ??????????? ?
  199. ????????????btn.Tag?=?tognew.Tag; ?
  200. ?
  201. ????????????ItemEventHandler?handler?=?(ItemEventHandler)Events[ItemLabelClickObj]; ?
  202. ????????????if?(handler?!=?null) ?
  203. ????????????{??? ?
  204. ???????????????? ?
  205. ????????????????handler(sender,?new?ItemButtonClickEventArgs(index));?; ?
  206. ????????????} ?
  207. ????????} ?
  208. ?
  209. ??????? ?
  210. ?
  211. ???????? ?
  212. ????} ?
  213. ????[Serializable] ?
  214. ????public?class?ToggleItem ?
  215. ????{ ?
  216. ????????private?string?tag; ?
  217. ????????private?Image?bgImage; ?
  218. ????????public?ToggleItem() ?
  219. ????????{ ?
  220. ????????} ?
  221. ????????public?ToggleItem(string?tag,?Image?bg) ?
  222. ???????{ ?
  223. ???????????this.tag?=?tag; ?
  224. ???????????this.bgImage?=?bg; ?
  225. ???????} ?
  226. ???????public?string?Tag ?
  227. ???????{ ?
  228. ????????????get ?
  229. ????????????{ ?
  230. ????????????????return?tag; ?
  231. ???????????} ?
  232. ???????????set ?
  233. ???????????{ ?
  234. ????????????????tag?=?value; ?
  235. ????????????} ?
  236. ????????} ?
  237. ?
  238. ??????public?Image?BGImage ?
  239. ????????{ ?
  240. ???????????get ?
  241. ???????????{ ?
  242. ???????????????return?bgImage; ?
  243. ???????????} ?
  244. ?
  245. ???????????set ?
  246. ???????????{ ?
  247. ???????????????bgImage?=?value; ?
  248. ?
  249. ???????????} ?
  250. ???????} ?
  251. ?
  252. ????} ?
  253. ?
  254. } ?
  255. ?
  256. ? ?





?
本文轉自 破狼 51CTO博客,原文鏈接:http://blog.51cto.com/whitewolfblog/832641,如需轉載請自行聯系原作者


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540339.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540339.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540339.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉載] Spring面試題整理

參考鏈接&#xff1a; Java中的動態方法Dispatch和運行時多態 Spring面試題整理 2018年03月07日 21:11:46 hrbeuwhw 閱讀數&#xff1a;49116 Spring 概述 1. 什么是spring? spring 是個Java企業級應用的開源開發框架。Spring主要用來開發Java應用&#xff0c;但是有…

ansible: Linux批量管理神器

我們已經知道&#xff0c;基于集群可實現服務器橫向擴展slace out。可是&#xff0c;當上百臺主機集合成共同為一個站點提供web頁面訪問的形式時&#xff0c;怎么管理整個集群體呢&#xff1f; 一些小伙伴大概聽說過pxe等可實現自動安裝系統。可是&#xff0c;要我們一臺一臺主…

[轉載] Python numpy函數:all()和any()比較矩陣

參考鏈接&#xff1a; Python中的any和all 數組元素的比對&#xff0c;我們可以直接使用“”進行比較&#xff0c;比如&#xff1a; 但是當數組元素較多時&#xff0c;查看輸出結果便變得很麻煩&#xff0c;這時我們可以使用all&#xff08;&#xff09;方法&#xff0c;直接…

MySQL初識-架構-安裝-初始化-連接-管理工具-數據文件

MySQL架構和結構分析 官方架構圖 內部組件結構圖 MySQL安裝方式 MySQL初始化 MySQL工作模式及常用命令 交互式模式&#xff1a;mysql> 1234567891011121314# 交互式模式下的客戶端命令mysql> help # 獲取命令幫助 mysql> \? # 同上 mysql> \c # 取消命令執行 mysq…

[轉載] Java基礎——關聯、聚合、組合

參考鏈接&#xff1a; Java中的關聯 | 組合和聚合 一.引言 其實自己也不知道&#xff0c;在需求設計、架構設計、開發階段是否真正需要弄明白“關聯、聚合、組合”。原本計劃這篇博文寫“繼承“和”多態”&#xff0c;但是一翻閱資料&#xff0c;基本上都會把“繼承”和“組…

[轉載] WSDL2Java詳細使用說明【官方最全說明】

參考鏈接&#xff1a; Java中的this說明 WSDL to Java 命名 wsdl2java - 獲取WSDL文檔并生成完全帶注釋的Java代碼&#xff0c;并實現相關服務。 概要 用例 : wsdl2java -fe|-frontend <front-end-name> -db|-databinding <data-binding-name> -wv <…

mdm.Dialogs.promptModal()使用

這是prompt的擴展&#xff0c;提供了更多的功能&#xff0c;比如可以添加其他按鈕和圖標import mdm.*;mdm.Application.init(this, onInit);function onInit():void {// 啟動程序...}quit.addEventListener(MouseEvent.CLICK,quitProgram);function quitProgram(evt:MouseEvent…

[轉載] JAVA 構造函數及其重載

參考鏈接&#xff1a; Java重載Overload public class Student{ public int stuId; public String stuName; public int stuAge; public int stuScore; public Student(){ } public Student(int sId,String sName){ stuId sId; sName stuName; } public Student(int sld,S…

學生機房虛擬化(十)系統操作設計實現

引入&#xff1a; 在前篇思路的指導下&#xff0c;進行了為期三個星期的調試最終建立了一個初步成熟的&#xff0c;具有親和力的配置界面&#xff0c;現在此虛擬系統已經初步部署了一個機房&#xff0c;用來學生日常上課。在本篇中&#xff0c;本人并不試圖去花篇幅講解彼此之間…

[轉載] java之重寫toString

參考鏈接&#xff1a; Java程序的輸出| 重寫Override 1.toString()就是是重寫&#xff0c;對于一般的對象來說都會有這個方法&#xff0c;其實這個方法的目的&#xff0c;主要就是將對象按字符串的方式輸出出來&#xff1a;打個比方&#xff0c;比如一個People類&#xff0c;里…

Gson的使用,對于不需要html escape的情況的處理

引入&#xff1a; 雖然是小問題&#xff0c;但是我還是需要記錄下&#xff0c;我們知道&#xff0c;Google提供了一個Gson框架讓我們高效的吧普通對象&#xff08;一般VO為佳&#xff09; 和json字符串之間進行互轉。因為轉換多數是和瀏覽器打交道的&#xff0c;所以一般默認的…

[轉載] Java 重寫paint繪圖

參考鏈接&#xff1a; 用Java重寫Override 感謝原文&#xff1a;https://zhidao.baidu.com/question/260060153.html 這個方法需要注意的地方不多&#xff0c;也就是重寫時&#xff0c;先調用 super.paint(g) 方法 paint方法不需要編寫代碼調用&#xff0c;只需要重寫。 其他…

教你如何進入有密碼的 XP 系統(下)

自動登錄時禁用Shift鍵 當使用自動登錄功能時&#xff0c;用戶可通過按住Shift鍵忽略登錄進程&#xff0c;輸入其他用戶名及密碼進入電腦。該技巧可以禁用自動登錄時的Shift鍵功能。操作步驟如下&#xff1a;打開“注冊表編輯器”&#xff0c;找到[HKEY_LOCAL_MACHINE\Softwar…

[轉載] 2020最新Java面試題,常見面試題及答案匯總

參考鏈接&#xff1a; Java程序的輸出| 18(重寫Override) 發現網上很多Java面試題都沒有答案&#xff0c;所以花了很長時間搜集整理出來了這套Java面試題大全&#xff0c;希望對大家有幫助哈~ 博主已將以下這些面試題整理成了一個Java面試手冊&#xff0c;是PDF版的。 關注…

【心隨筆】敘述你成功完成一件事情的方法

一、situation 先描述你曾經處于的困難狀況 二、task / target 說一說你是怎樣做出打算的 三、action / attitude 告訴別人你做出的行動 四、result 最后獲得了怎樣的成績轉載于:https://www.cnblogs.com/tnxlvlxy/p/7806142.html

[轉載] java排序compareTo:降序輸出學生成績

參考鏈接&#xff1a; Java程序的輸出| 18(重寫Override) 一道簡單程序題&#xff1a; 編寫一個程序&#xff0c;輸入學生的姓名、分數信息&#xff0c;要求程序按照成績降序排序后并輸出。 實現方法有很多 方法一 public class ScoreSort2 { private String name; pr…

300GB*6 SCSI RAID5 LINUX服務器數據恢復手記

[摘要]某數碼沖印網站&#xff0c;采用DELL POWEREDGE2850服務器&#xff0c;存儲部分由6塊300G硬盤組成RAID5&#xff0c;LINUX平臺&#xff0c;1.5T邏輯磁盤中只包含一個卷&#xff0c;文件系統為EXT3&#xff0c;存儲所有客戶數碼照片&#xff0c;服務器的故障導致整個公司無…

[轉載] public static void main(String[] args) 隱含了什么?

參考鏈接&#xff1a; 了解Java中“ public static void main”中的“ static” public class TestSort { public static void main(String[] args) { // 需要分別用Javac和Java命令行編譯和運行 int[] arr; int temp 0; arr new int [9]; for (int i 0; i < arr.length…

在C#中創建DataTable

經常遇到對DataTable進行各種運算&#xff0c;這方面的資料經常散落在各處&#xff0c;使用起來不方面&#xff0c;我想還是把他們集中到博客中&#xff0c;下次要用到的時候可以直接查看。下面是創建一個空白的DataTable&#xff0c;并定義相關的字段&#xff1a;DataTable dt…

[轉載] Java中的靜態方法不能被子類重寫

參考鏈接&#xff1a; 可以在Java中重載或重寫靜態方法嗎 Java中的靜態方法不能被子類重寫 特點&#xff1a;靜態方法屬于類的方法&#xff0c;也屬于對象的方法&#xff0c;但是靜態方法隨類的存在。 結論&#xff1a;Java中的靜態方法不能被子類重寫&#xff0c;實際上&…