如何方便的让你的集合引发改变事件

简介:
在我们开发自定义 控件 的过程中,我们常常会给 控件 添加集合属性。比如定制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(
thisnew CollectionChangeEventArgs(CollectionChangeAction.Refresh, null));
}


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


protected override void SetItem(int index, ColumnHeader item)

base.SetItem(index, item);
ItemChanged(
thisnew 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);
      当集合属性发生变化时就会触发事件通知自定义 控件 重绘。





本文转自纶巾客博客园博客,原文链接:http://www.cnblogs.com/guanjinke/archive/2006/12/04/582094.html,如需转载请自行联系原作者
目录
相关文章
|
C# 索引 Windows
Winform控件优化之TabControl控件的使用和常用功能
TabControl是一个分页切换(tab)控件,不同的页框内可以呈现不同的内容,将主要介绍调整tab的左右侧显示、设置多行tab、禁用或删除tabpage、隐藏TabControl头部的选项卡等
7006 0
Winform控件优化之TabControl控件的使用和常用功能
|
算法 C语言 C++
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)(一)
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)
4263 1
|
数据采集 XML JavaScript
如何优化 Selenium 和 BeautifulSoup 的集成以提高数据抓取的效率?
如何优化 Selenium 和 BeautifulSoup 的集成以提高数据抓取的效率?
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
《主动式智能导购AI助手构建》体验建议
《主动式智能导购AI助手构建》体验建议
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
3步,0代码!一键部署DeepSeek-V3、DeepSeek-R1
3步,0代码!一键部署DeepSeek-V3、DeepSeek-R1
255 0
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现深度学习模型:智能电影制作与剪辑
使用Python实现深度学习模型:智能电影制作与剪辑
433 5
|
12月前
|
存储 缓存 索引
集合支持的操作有哪些,它们是怎么实现的?
集合支持的操作有哪些,它们是怎么实现的?
141 8
|
12月前
|
机器学习/深度学习 人工智能 安全
如何实现基于AI的网站安全防护?一文讲解
如何实现基于AI的网站安全防护?一文讲解
143 2
|
SQL 运维 安全
【产品升级】Dataphin V4.2重大升级:上线敏捷版,打通数据资产管理和消费,开启数据价值放大新篇章
Dataphin 是阿里巴巴旗下的一个智能数据建设与治理平台,旨在帮助企业构建高效、可靠、安全的数据资产。在V4.2版本中,Dataphin敏捷版上线助力企业打造轻量版数据中台,打通数据资产管理和消费,陪伴企业迈入数据高价值应用新阶段。
2810 2
【产品升级】Dataphin V4.2重大升级:上线敏捷版,打通数据资产管理和消费,开启数据价值放大新篇章
|
C# 数据安全/隐私保护
推荐三款开源且实用的.NET代码混淆工具,保护你的.NET应用程序
推荐三款开源且实用的.NET代码混淆工具,保护你的.NET应用程序
1144 0