自定义控件---重写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,一经查实,立即删除!

相关文章

MySQL初识-架构-安装-初始化-连接-管理工具-数据文件

MySQL架构和结构分析 官方架构图 内部组件结构图 MySQL安装方式 MySQL初始化 MySQL工作模式及常用命令 交互式模式&#xff1a;mysql> 1234567891011121314# 交互式模式下的客户端命令mysql> help # 获取命令帮助 mysql> \? # 同上 mysql> \c # 取消命令执行 mysq…

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…

Gson的使用,对于不需要html escape的情况的处理

引入&#xff1a; 虽然是小问题&#xff0c;但是我还是需要记录下&#xff0c;我们知道&#xff0c;Google提供了一个Gson框架让我们高效的吧普通对象&#xff08;一般VO为佳&#xff09; 和json字符串之间进行互转。因为转换多数是和浏览器打交道的&#xff0c;所以一般默认的…

SpringBoot安装和创建简单的Web应用

SpringBoot安装 方式一&#xff1a; Eclipese->Help->Eclipse Marketplace ->Finde STS -> Install 注意&#xff1a;安装过程中挺慢&#xff0c;而且可能会报错&#xff0c;报错时需要重复以上步骤&#xff08;重新安装STS后&#xff0c;安装进度接之前的继续进行…

ASP.NET Session 详解

[ASP.NET] Session 详解 开发者在线 Builder.com.cn 更新时间:2008-03-23作者&#xff1a;黑暗凝聚力量&#xff0c;堕落方能自由 来源:CSDN 本文关键词&#xff1a; Web开发 ASP session 详解 本文仅代表作者个人观点&#xff0c;正确与否请读者自行研究&#xff01;阅读本文…

hadoop namenode管理元数据机制

一、简要namenode管理元数据机制&#xff1a; 二、详细namenode管理元数据机制&#xff1a; 三、secondary namenode 合并edits和fsimage&#xff1a; 四、namenode存储元数据细节&#xff1a; 五、checkpoint触发点&#xff1a; 本文转自lzf0530377451CTO博客&#xff0c;原文…

BABOK - 企业分析(Enterprise Analysis)概要

描述 企业分析描述我们如何捕捉、提炼并明晰业务需要&#xff0c;并定义一个可能实现这些业务需要的一个方案范围&#xff0c;它包括问题定义和分析&#xff0c;业务案例开发&#xff0c;可行性研究和方案范围定义 目的 明确业务战略需要和目标&#xff0c;并建议方案范围 任务…

6、EIGRP配置实验之负载均衡

1、实验拓扑 2、负载均衡原理 等价负载均衡&#xff1a;默认情况下EIGRP只支持等价负载均衡&#xff0c;默认支持4条线路的等价负载均衡&#xff0c;可以通过show ip protocols 查看&#xff0c;最大可以支持16条线路的等价负载均衡&#xff0c;可以在EIGRP路由进程下通过maxim…

haproxy+keepalived实现负载均衡及高可用

HAProxy是一个使用C语言编写的自由及开放源代码软件&#xff0c;其提供高性能性、负载均衡&#xff0c;以及基于TCP和HTTP的应用程序代理。相较与 Nginx&#xff0c;HAProxy 更专注与反向代理&#xff0c;因此它可以支持更多的选项&#xff0c;更精细的控制&#xff0c;更多的健…

iOS技术博客:App备案指南

&#x1f4dd; 摘要 本文介绍了移动应用程序&#xff08;App&#xff09;备案的重要性和流程。备案是规范App开发和运营的必要手段&#xff0c;有助于保护用户权益、维护网络安全和社会秩序。为了帮助开发者更好地了解备案流程&#xff0c;本文提供了一份最新、最全、最详的备…

Perl文件读写操作

本文转自 tiger506 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/tiger506/830771&#xff0c;如需转载请自行联系原作者

不用正则表达式,用javascript从零写一个模板引擎(一)

前言 模板引擎的作用就是将模板渲染成html&#xff0c;html render(template,data)&#xff0c;常见的js模板引擎有Pug,Nunjucks,Mustache等。网上一些制作模板引擎的文章大部分是用正则表达式做一些hack工作&#xff0c;看完能收获的东西很少。本文将使用编译原理那套理论来打…

关于批量插入数据之我见(100万级别的数据,mysql)

2019独角兽企业重金招聘Python工程师标准>>> 因前段时间去面试&#xff0c;问到如何高效向数据库插入10万条记录&#xff0c;之前没处理过类似问题&#xff0c;也没看过相关资料&#xff0c;结果没答上来&#xff0c;今天就查了些资料&#xff0c;总结出三种方法&am…

极速理解设计模式系列:6.适配器模式(Adapter Pattern)

四个角色&#xff1a;目标抽象类角色(Target)、目标对象角色(Adapter)、源对象角色(Adaptee)、客户端角色(Client) 目标抽象类角色&#xff08;Target)&#xff1a;定义需要实现的目标接口 目标对象角色&#xff08;Adapter)&#xff1a;调用另外一个源对象&#xff0c;并且转换…

Spark(二): 内存管理

2019独角兽企业重金招聘Python工程师标准>>> Spark 作为一个以擅长内存计算为优势的计算引擎&#xff0c;内存管理方案是其非常重要的模块&#xff1b; Spark的内存可以大体归为两类&#xff1a;execution和storage&#xff0c;前者包括shuffles、joins、sorts和agg…

多播、组播、广播优缺点分析

2019独角兽企业重金招聘Python工程师标准>>> 单播、多播和广播单播”&#xff08;Unicast&#xff09;、“多播”&#xff08;Multicast&#xff09;和“广播”&#xff08;Broadcast&#xff09;这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究…

LOFTERD18B542F16FF685FD684F427B4…

2019独角兽企业重金招聘Python工程师标准>>> 验证 转载于:https://my.oschina.net/jinhengyu/blog/1572124

Source Map调试压缩后代码

在前端开发过程中&#xff0c;无论是样式还是脚本&#xff0c;运行时的文件可能是压缩后的&#xff0c;那这个时候调试起来就很麻烦。 这个时候&#xff0c;可以使用Source Map文件来优化调试&#xff0c;Source Map是一个信息文件&#xff0c;里面储存着原代码位置信息&#x…

两台电脑间大量数据拷贝的快捷方法

可能大家会遇到需要将一台电脑里的数据拷贝到另外一台电脑&#xff0c;最常用的方法是用u盘或移动硬盘等存储设备来拷贝&#xff0c;这样速度慢&#xff0c;而且可能拷贝多次才能将数据拷贝完。现提供一种方法&#xff0c;就是通过windows 的文件共享来实现。通过千兆网线直接连…

工作所用的模块回滚脚本

俗话说的好&#xff1a;“真男人从来不回滚”&#xff0c;但是家中常备一个回滚脚本也是很有必要的&#xff0c;我所在公司的服务器模块名都是在初始化的时候写进/etc/role_install这个文件里&#xff0c;如下图的这个服务器就是fss服务器&#xff1a; 再比如下面这个服务器&am…