如何方便的让你的集合引发改变事件
生活随笔
收集整理的這篇文章主要介紹了
如何方便的让你的集合引发改变事件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在我們開發自定義控件的過程中,我們常常會給控件添加集合屬性。比如定制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);
??????當集合屬性發生變化時就會觸發事件通知自定義控件重繪。
??????我創建一個名字叫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);
??????當集合屬性發生變化時就會觸發事件通知自定義控件重繪。
總結
以上是生活随笔為你收集整理的如何方便的让你的集合引发改变事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 连续梦到老公出轨怎么回事
- 下一篇: ADSL路由器的设置