在我们开发自定义控件的过程中,我们常常会给控件添加集合属性。比如定制Grid控件就会有Column集合。当集合属性发生变化时,比如添加新元素,删除新元素,我们要通知控件去重绘以反映新的变化。我们可以创建一个集合类,在类里添加一个新的事件,并在集合发生变化时触发事件。.Net框架已经为我们提供了现成的委托声明,下面我们来看看怎么使用。
      我创建一个名字叫HeaderCollection的类,派生于System.System.Collections.ObjectModel.Collection<ColumnHeader>。利用.Net已经声明的CollectionChangeEventHandler委托来声明一个事件,如下:

public delegate void CollectionChangeEventHandler (
 Object sender,
 CollectionChangeEventArgs e
)

CollecionChangeEventArgs的构造函数需要两个参数,一个枚举类型CollectionChangeAction,用它来指出发生了什么变化,包含添加,删除,整个集合发生变化三种动作,第二个参数传递发生变化的元素。
      接下来我们重载Collection<T>的几个方法:InsertItem,ClearItems,RemoveItem在这些方法里触发事件,下边是这个类的完整描述:

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace CPI.DataProcess.Forms
{
[Serializable]
public class HeaderCollection:Collection<ColumnHeader>
{

public event CollectionChangeEventHandler ItemChanged;

public HeaderCollection()
{
}

protected override void InsertItem(int index, ColumnHeader item)

base.InsertItem(index, item);
ItemChanged(this,new CollectionChangeEventArgs(CollectionChangeAction.Add,item));
}

protected override void ClearItems()
{
base.ClearItems();
ItemChanged(this, new CollectionChangeEventArgs(CollectionChangeAction.Refresh, null));
}

protected override void RemoveItem(int index)
{
base.RemoveItem(index);
ItemChanged(this, new CollectionChangeEventArgs(CollectionChangeAction.Remove, this[index]));
}

protected override void SetItem(int index, ColumnHeader item)

base.SetItem(index, item);
ItemChanged(this, new CollectionChangeEventArgs(CollectionChangeAction.Refresh, null));
}

private void OnItemPropertyChanged(Object sender)
{
ItemChanged(sender,null);
}
}
}

这样我们的Collection就暴露出一个改变事件,在使用它的地方给它添加委托就可以了,例如:

public void OnCollectionPropertyChanged(Object sender,CollectionChangeEventArgs e)
{
Invalidate();
}
private HeaderCollection _Headers =new HeaderCollection();
Headers.ItemChanged+=new CollectionChangeEventHandler(OnCollectionPropertyChanged);

当集合属性发生变化时就会触发事件通知自定义控件重绘。

如何方便的让你的集合引发改变事件相关推荐

  1. 【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )

    文章目录 前言 一.订阅类-订阅方法缓存集合 二.事件类型-订阅者集合 三.订阅对象-事件类型集合 前言 首先声明几个数据结构 , 参考 [EventBus]EventBus 源码解析 ( 注册订阅者 ...

  2. 无法找到来自源 Netwtw10 的事件 ID 6062 的描述本地计算机上未安装引发此事件的组件,或者安装已损坏。可以安装或修复本地计算机上的组件。

    电脑启动时意外黑屏无响应,强制关机重启后查看黑屏时的最后一条系统日志: 描述: 无法找到来自源 Netwtw10 的事件 ID 6062 的描述.本地计算机上未安装引发此事件的组件,或者安装已损坏.可 ...

  3. 邮件安全引发的事件引人深思

    邮件安全引发的事件引人深思 在各界都在努力加强网络安全防护之际,我们使用了40多年的电子邮件系统,却已经成为安全链最弱的一环. 现代互联网大部分应用都离不开电子邮件,企业内外部沟通.政府部门内外部沟通 ...

  4. android列表集合点击事件,给ListeView列表中的每一个Item添加点击事件

    首先声明本文主要是在ArrayAdapter.SimpleAdapter中对ListView的每一项进行点击事件! 先看下运行结果 第一步:在xml布局中写一个ListView android:lay ...

  5. Ajax请求返回200 OK,但是会引发错误事件而不是成功

    我已经在我的网站上实现了Ajax请求,并且正在从网页调用端点. 它总是返回200 OK ,但是jQuery执行error事件. 我尝试了很多事情,但无法弄清问题所在. 我在下面添加我的代码: jQue ...

  6. 猪肉价格暴涨引发的事件

    说:"保证老百姓吃得上猪肉." 猪肉价格接着涨 南方都市报报道:深圳市政府承认深圳存在炒猪肉团,规模甚至超过炒房团. 猪肉价格接着涨 网友评选新四座大山:高房价.高学费.高医疗费. ...

  7. 【jquery版.net控件—dropdownlist】附源码,欢迎大家指点、指正、拍砖!!!

    前言 为了2012第一个春天,为了我那卑微的工资,为了我那伟大的爱情............................ 其实是为了自我能力的提升罢了,呵呵!!!(也是为了涨工资吧...) 小弟准 ...

  8. sikuli官网自动汉化文档

    这些信息是以前版本x - 1.0 rc3 Sikuli脚本 在下载页面从菜单中你得到新版本信息sikulix - 1.0(2013年5月)   窗户 只有32位版本提供.但是这个版本应该运行在32位和 ...

  9. C#中的集合、哈希表、泛型集合、字典

    集合ArrayList 集合:集合可以看做是数组,可以将其看成"长度可变,具有很多方法的数组".使用ArrayList,首先需要导入命名空间using.system.collect ...

最新文章

  1. Linux centos下项目环境搭建及版本部署
  2. SSIS教程SQlServer2008R2 (5) 添加错误流重定向
  3. c++中this指针基本概念和使用
  4. 小程序[渲染层网络层错误] failed to load image_游戏中水的渲染技术
  5. 通过哪吒动漫豆瓣影评,带你分析python爬虫与BeautifulSoup快速入门
  6. Python数据科学库-小测验
  7. Redis教程:主从复制
  8. Q91:真实地模拟透明材质(Realistic Transparency)(3)——A Glass of Water
  9. sql 查询字段是中文/英文/数字 正则表达式
  10. vi编辑器常用命令大全
  11. SketchUp-2022版本
  12. 拉丁字母表及中英文发音
  13. 使用 vimdiff 比较文件的技巧
  14. 霸榜知乎,谴责豆瓣,数据分析告诉你《流浪地球》到底好看么?
  15. 英语单词----分类记
  16. 计算机黑屏故障的原因及解决方法,电脑黑屏原因及解决方法
  17. CMMI-决策分析与解决(DAR)
  18. pixel2style2pixel(pSp)实现解读【一】 -- 理论层面
  19. 什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?
  20. 网络框架Volley

热门文章

  1. 命令行进入指定目录_VIM学习笔记 操作目录(Manipulate Directory)
  2. Linux进程间通信方式--本地socket
  3. 【电路原理】学习笔记(0):电路与电路模型
  4. Linux下的I/O复用与epoll详解(ET与LT)
  5. 【Leetcode | 52】257. 二叉树的所有路径
  6. access、strtol函数的使用(后者为C库函数)
  7. 如何对接oracle 建立pdb
  8. More DETAILS! PBR的下一个发展在哪里?
  9. 关于tomcat内路径跳转的一些思考
  10. Android开发删除短信