自定义控件---重写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.mzph.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;实际上&…