创建自定义数据源

看到一则使用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()中。

时间: 2024-11-05 04:48:13

创建自定义数据源的相关文章

详细阐述利用ASP.NET 2.0创建自定义Web控件开发说明

asp.net|web|创建|控件|控件开发 简介 从使用基本的文本编辑器到创作标记页面,Web 开发已经经历了一个漫长的过程.目前,集成开发环境 (IDE) 为开发过程中的几乎每个方面都提供了图形化表示形式.此外,还实现各种说明性编程技术以提高效率并降低出现错误的几率.Visual Studio 2005 和 ASP.NET 2.0 中的控件体系结构遵循了这些编程趋势,并且提供了可靠的.可扩展的环境,该环境设计为使开发人员可以创建能够以说明方式配置的控件. 此外,ASP.NET 中新的自适应呈

利用 ASP.NET 2.0 创建自定义 Web 控件

asp.net|web|创建|控件 Jayesh Patel.Bryan Acker.Robert McGovernInfusion Development适用于:Microsoft ASP.NET 2.0Microsoft Visual Studio 2005 摘要:ASP.NET 2.0 中新的自适应呈现模型为控件编写人员提供了很多新的选项.本文展示了这些选项如何使创建 ASP.NET 的自定义控件变得比以前更加容易. 本页内容 简介 自适应呈现模型 创建自定义服务器控件 TagKey 使用

ASP.NET Datagrid创建自定义列

asp.net|datagrid|创建 简介 不得不承认,为 Microsoft? ASP.NET 编写 Datagrid 代码包括大量的重复工作.尽管我深受该控件的困扰,但我还是不断寻找简化这类任务的捷径.谁都不愿意做重复的工作,对不对?为了摆脱这种烦人的工作,我们要将多个项目中的重复代码封装到一个可重复使用的程序包中.这才是面向对象的编程工作所要解决的问题,使用 Datagrid 也不例外.对于 Datagrid 控件来说,要实现该目的,需要将常用的代码放到一个内置的列类型中(将在第一个示例

利用ASP.NET 2.0创建自定义Web控件

asp.net|web|创建|控件 从使用基本的文本编辑器到创作标记页面,Web 开发已经经历了一个漫长的过程.目前,集成开发环境 (IDE) 为开发过程中的几乎每个方面都提供了图形化表示形式.此外,还实现各种说明性编程技术以提高效率并降低出现错误的几率.Visual Studio 2005 和 ASP.NET 2.0 中的控件体系结构遵循了这些编程趋势,并且提供了可靠的.可扩展的环境,该环境设计为使开发人员可以创建能够以说明方式配置的控件. 此外,ASP.NET 中新的自适应呈现模型减少了编写

在ASP.NET 2.0中操作数据之二十七:创建自定义排序用户界面_自学过程

简介 显示大量已经按类别(不是很多)排序的数据但没有类别分界线,用户很难找到所需要的类别.例如,数据库中只有9个类别(8个不同的类别和1个null),共81种产品.现在用一个GridView列出所有产品,假设有用户对类别Seafood的产品感兴趣,她一定会按类别排序,把Seafood产品排列在一起.排序后,用户便寻找Seafood产品开始和结束的地方.虽然是按英文字母排列类别不难找到Seafood,但仍要花些时间在GridView寻找.为了进一步的区分类别,许多网站使用类别分界线这种排序用户界面

用C# .NET创建自定义错误报告

创建|错误     本文介绍如何在 ASP.NET 中发生错误时使用 Visual C# .NET 代码捕获和响应错误.ASP.NET 改进了传统的 Microsoft Active Server Page (ASP) 中的错误处理选项.在 ASP.NET 中,您可在应用程序中处理若干不同级别的错误. ASP.NET 中的新功能 ASP.NET 在处理和响应错误的方式上进行了若干改进.在传统的 ASP 中,是用"On Error Resume Next"(或在 Jscript 中用 t

[转]利用ASP.NET 2.0创建自定义Web控件(2)

原址:http://hi.baidu.com/sjbh/blog/item/5a8298454403a321cffca39c.html   如何生成的? Render() 方法基本上控制着 WebControl 的整个输出.默认情况下,Render() 方法实际上会依次调用 RenderBeginTag().RenderContents() 以及 RenderEndTag().尽管在 ASP.NET 1.x 中调用结构并未变化,但由于该呈现模型,修改这些调用的影响却发生了变化. 您可以覆盖 Re

在ASP.NET中创建自定义配置节(翻译)

asp.net|创建|asp.net 一.介绍 ASP.NET Web应用程序用一种内置的方法访问简单的"键/值"配置数据.在Web.config文件中,你可以创建节来存储简单的"键/值"对.例如,新建一个ASP.NET项目,在Web.config文件中添加如下的标记作为元素的子标记: 该节包含了用两个标记定义的"键/值"对,你可以通过Page对象内置的ConfigurationSettings属性获得它们的值.作为开始,在你的项目中新建一个名为

Javascript创建自定义对象:创建Object实例添加属性和方法

文章简介:创建自定义对象的最简单的方式就是创建一个Object实例,然后再为它添加属性和方法. 创建自定义对象的最简单的方式就是创建一个Object实例,然后再为它添加属性和方法,如下所示: var person = new Object(); person.name = "Nicholas"; person.age = "29" person.job = "Software Engineer"; person.sayName = functio