创建自定义数据源

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

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

                       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.IListSou rce
       {
               private data d=new data();
               public source()
               {
                       for(int i=0;i<10;i++)
                       {
<script> </script>

                               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;
<script> </script>                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;
<script> </script>                        }
               }

               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()
<script> </script>                {
                       _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;
                       }
<script> </script>                }

               #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;
<script> </script>                        }
                       else
                       {
                               this.Reset();
                               return false;
                       }
               }

               #endregion
       }

       public class dataitem
<script> </script>        {
               private string name;
               public string ValueName
               {
                       get{return name;}
               }
               private int valu;
               public int Value
               {
                       get{return valu;}
               }
<script> </script>

               public dataitem(int val,string nam)
               {
                       name = nam;
                       valu = val;
               }
       }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值