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(扫码支持作者):微信:
  • 相关阅读:
    HashMap的C++实现
    MyString的简单实现
    C++智能指针实现
    static_cast 、const_cast、dynamic_cast、reinterpret_cast 关键字简单解释
    对数组取地址
    修改const变量
    红黑树简单总结
    MyInt的简单实现
    全排列之递归与非递归算法实现总结
    不用辅助空间的归并排序
  • 原文地址:https://www.cnblogs.com/cyq1162/p/865307.html
Copyright © 2011-2022 走看看