欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

创建自定义数据源

程序员文章站 2022-06-07 18:00:33
...

看到一则使用CollectionBase为父类创建自定义数据源的例子:
using System;
namespace 自定义数据源
{

   /// <summary>
   /// 自定义数据源
   /// </summary>
   public class cusdatasource : System.Collections.CollectionBase
   {

                   public cusdatasource()
                   {
                           for(int i = 0;i < 10;i++)
                           {
                                   base.InnerList.Add(new Element(i,string.Format("a[{0}]",i)));
                           }
                   }
   }

   public class Element
   {
           private string name;
           public string ValueName
           {
                   get{return name;}
           }
           private int valu;
           public int Value
           {
                   get{return valu;}
           }
           public Element(int val,string nam)
           {
                   name = nam;
                   valu = val;
           }
   }

}

然后我们new一个cusdatasource,并绑定到datagrid上就会出现2列:value和name;

我们还可以通过实现IListSource 或 IEnumerable 接口,来制作自定义的数据源,较上面的麻烦一点,不过更灵活:
using System;

namespace personaltest
{

   /// <summary>
   /// source 的摘要说明。
   /// </summary>
   public class source:System.ComponentModel.IListSource
   {
           private data d=new data();
           public source()
           {
                   for(int i=0;i<10;i++)
                   { 
                           d.Add(new dataitem(i,string.Format("this is {0}",i)));
                   }
           }
           #region IListSource 成员

           public System.Collections.IList GetList()
           {
                   // TODO:  添加 source.GetList 实现
                   return d;
           }

           public bool ContainsListCollection
           {
                   get
                   {
                           // TODO:  添加 source.ContainsListCollection getter 实现
                           return false;
                   }
           }

           #endregion
   }

   public class data:System.Collections.IList,System.Collections.IEnumerator
   {
           protected System.Collections.ArrayList _dataitems;
           protected int _ptr=0;
           public data()
           {
                   _dataitems=new System.Collections.ArrayList();
           }
           #region IList 成员

           public bool IsReadOnly
           {
                   get
                   {
                           // TODO:  添加 data.IsReadOnly getter 实现
                           return false;
                   }
           }

           public object this[int index]
           {
                   get
                   {

                           return _dataitems[index];
                   }
                   set
                   {
                           _dataitems[index]=value;
                   }
           }

           public void RemoveAt(int index)
           {
                   if(index>=0 && index<_dataitems.Count)
                           _dataitems.RemoveAt(index);
           }

           public void Insert(int index, object value)
           {
                   if(index>=0 && index<_dataitems.Count)
                   {
                           _dataitems.Insert(index,value);
                   }
           }

           public void Remove(object value)
           {
                   _dataitems.Remove(value);
           }

           public bool Contains(object value)
           {
                   return _dataitems.Contains(value);
           }

           public void Clear()
           {
                   _dataitems.Clear();
           }

           public int IndexOf(object value)
           {
                   return _dataitems.IndexOf(value);
           }

           public int Add(object value)
           {
                   return _dataitems.Add(value);
           }

           public bool IsFixedSize
           {
                   get
                   {
                           return _dataitems.IsFixedSize;
                   }
           }

           #endregion

           #region ICollection 成员

           public bool IsSynchronized
           {
                   get
                   {
                           return false;
                   }
           }

           public int Count
           {
                   get
                   {
                         return _dataitems.Count;
                   }
           }

           public void CopyTo(Array array, int index)
           {
           }

           public object SyncRoot
           {
                   get
                   {
                           return null;
                   }
           }

           #endregion

           #region IEnumerable 成员

           public System.Collections.IEnumerator GetEnumerator()
           {
                   return this;
           }

           #endregion

           #region IEnumerator 成员

           public void Reset()
           {
                   _ptr=0;
           }

           public object Current
           {
                   get
                   {
                           return this[_ptr++];
                   }
           }

           public bool MoveNext()
           {
                   if(_ptr<this.Count)
                   {
                           return true;
                   }
                   else
                   {
                           this.Reset();
                           return false;
                   }
           }

           #endregion
   }

   public class dataitem
   {
           private string name;
           public string ValueName
           {
                   get{return name;}
           }
           private int valu;
           public int Value
           {
                   get{return valu;}
           } 
           public dataitem(int val,string nam)
           {
                   name = nam;
                   valu = val;
           }
   }

}

实现了IListSource接口的自定义数据源,IEnumerable在其中也有实现;
需要注意的地方,IEnumerator接口的movenext()方法,在foreach语句的时候会先执行一次,然后才会用current()方法返回"当前值",所以指针初始化为0
的话就不能在movenext()方法中递增指针,而应该放在current()中。

引用:http://www.cnblogs.com/zpisgod/articles/70024.html

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:http://www.cnblogs.com/cyq1162/archive/2007/08/22/865307.html