看到一则使用CollectionBase为父类创建自定义数据
源的例子:
using System;
namespace 自定义数据源
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 自定义数据源
/// </summary>
public class cusdatasource : System.Collections.CollectionBase
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
public cusdatasource()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
for(int i = 0;i < 10;i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
base.InnerList.Add(new Element(i,string.Format("a[{0}]",i)));
}
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public class Element
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private string name;
public string ValueName
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{return name;}
}
private int valu;
public int Value
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{return valu;}
}
public Element(int val,string nam)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
name = nam;
valu = val;
}
}
}
然后我们new一个cusdatasource,并绑定到datagrid上就会出现2列:value和name;
我们还可以通过实现IListSource 或 IEnumerable 接口,来制作自定义的数据源,较上面的麻烦一点,不过更灵活:
using System;
![](/Images/OutliningIndicators/None.gif)
namespace personaltest
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// source 的摘要说明。
/// </summary>
public class source:System.ComponentModel.IListSource
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private data d=new data();
public source()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
for(int i=0;i<10;i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
d.Add(new dataitem(i,string.Format("this is {0}",i)));
}
}
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IListSource 成员#region IListSource 成员
![](/Images/OutliningIndicators/InBlock.gif)
public System.Collections.IList GetList()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// TODO: 添加 source.GetList 实现
return d;
}
![](/Images/OutliningIndicators/InBlock.gif)
public bool ContainsListCollection
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// TODO: 添加 source.ContainsListCollection getter 实现
return false;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
}
![](/Images/OutliningIndicators/InBlock.gif)
public class data:System.Collections.IList,System.Collections.IEnumerator
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
protected System.Collections.ArrayList _dataitems;
protected int _ptr=0;
public data()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_dataitems=new System.Collections.ArrayList();
}
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IList 成员#region IList 成员
![](/Images/OutliningIndicators/InBlock.gif)
public bool IsReadOnly
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// TODO: 添加 data.IsReadOnly getter 实现
return false;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public object this[int index]
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
return _dataitems[index];
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_dataitems[index]=value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public void RemoveAt(int index)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(index>=0 && index<_dataitems.Count)
_dataitems.RemoveAt(index);
}
![](/Images/OutliningIndicators/InBlock.gif)
public void Insert(int index, object value)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(index>=0 && index<_dataitems.Count)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_dataitems.Insert(index,value);
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public void Remove(object value)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_dataitems.Remove(value);
}
![](/Images/OutliningIndicators/InBlock.gif)
public bool Contains(object value)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _dataitems.Contains(value);
}
![](/Images/OutliningIndicators/InBlock.gif)
public void Clear()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_dataitems.Clear();
}
![](/Images/OutliningIndicators/InBlock.gif)
public int IndexOf(object value)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _dataitems.IndexOf(value);
}
![](/Images/OutliningIndicators/InBlock.gif)
public int Add(object value)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _dataitems.Add(value);
}
![](/Images/OutliningIndicators/InBlock.gif)
public bool IsFixedSize
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _dataitems.IsFixedSize;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
ICollection 成员#region ICollection 成员
![](/Images/OutliningIndicators/InBlock.gif)
public bool IsSynchronized
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return false;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public int Count
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _dataitems.Count;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public void CopyTo(Array array, int index)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
}
![](/Images/OutliningIndicators/InBlock.gif)
public object SyncRoot
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return null;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IEnumerable 成员#region IEnumerable 成员
![](/Images/OutliningIndicators/InBlock.gif)
public System.Collections.IEnumerator GetEnumerator()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this;
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IEnumerator 成员#region IEnumerator 成员
![](/Images/OutliningIndicators/InBlock.gif)
public void Reset()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_ptr=0;
}
![](/Images/OutliningIndicators/InBlock.gif)
public object Current
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this[_ptr++];
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public bool MoveNext()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(_ptr<this.Count)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return true;
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.Reset();
return false;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
}
![](/Images/OutliningIndicators/InBlock.gif)
public class dataitem
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private string name;
public string ValueName
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{return name;}
}
private int valu;
public int Value
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{return valu;}
}
public dataitem(int val,string nam)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
name = nam;
valu = val;
}
}
}
实现了IListSource接口的自定义数据源,IEnumerable在其中也有实现;
需要注意的地方,IEnumerator接口的movenext()方法,在foreach语句的时候会先执行一次,然后才会用current()方法返回"当前值",所以指针初始化为0
的话就不能在movenext()方法中递增指针,而应该放在current()中。
引用:http://www.cnblogs.com/zpisgod/articles/70024.html