创建自定义数据源

简介:
看到一则使用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()中。
相关文章
|
2月前
|
存储 监控 数据库连接
数据源管理
数据源管理
33 1
|
5月前
|
数据采集 运维 DataWorks
DataWorks产品使用合集之如何更改修改了mc数据源名称的表的绑定引擎实例
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
6月前
|
存储 弹性计算 运维
自定义问候语
【4月更文挑战第30天】
52 0
|
Unix 关系型数据库 程序员
自定义伟大👑
C语言作为一种经典而强大的编程语言,在计算机科学领域有着广泛的应用。它的简洁性、高效性以及跨平台特性使得C语言成为了开发系统级软件、嵌入式系统以及大规模应用程序的首选。本文将介绍C语言的起源和发展,分析其特点和优势,同时讨论一些常见的应用场景和实例
|
6月前
|
DataWorks 关系型数据库 MySQL
DataWorks数据源暂未绑定数据源,绑定时却显示已经有 1 个是什么回事?
DataWorks数据源暂未绑定数据源,绑定时却显示已经有 1 个是什么回事?
55 2
自定义大头针
自定义大头针
212 0
自定义大头针
|
大数据 开发者
R 的数据源导入方法| 学习笔记
快速学习 R 的数据源导入方法
128 0
下一篇
无影云桌面