zoukankan      html  css  js  c++  java
  • 创建自定义数据源

    看到一则使用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
    版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
    个人微信公众号
    创业QQ群:617713515
    Donation(扫码支持作者):支付宝:
    Donation(扫码支持作者):微信:
  • 相关阅读:
    Asp.Net Web API 2第八课——Web API 2中的属性路由
    Asp.Net Web API 2第七课——Web API异常处理
    Asp.Net Web API 2第六课——Web API路由和动作选择
    Asp.Net Web API 2第五课——Web API路由
    开始学习python
    BMI 小程序 购物车
    深浅copy 文件操作
    字典 dict 集合set
    基本数据类型 (str,int,bool,tuple,)
    python 运算符
  • 原文地址:https://www.cnblogs.com/cyq1162/p/865307.html
Copyright © 2011-2022 走看看