zoukankan      html  css  js  c++  java
  • 自定义通用System.Web.UI.IHierarchicalDataSource简单实现

    什么是IHierarchicalDataSource接口呢?该接口是Asp.Net2.0中心定义的一个专用于描述一类有继承体系关系的数据的数据源,它可以作为TreeView,SiteMap等这些能够描述继承体系结构的控件的数据源。因为很多情况下,我们需要在TreeView这样的控件中显示我们的自定义数据,不适用数据邦定的情况下,我们当然也能手工来编码,坦率地说,代码也不太难写,几个递归函数而已,但是如果很多页面都用treeview的话是不是该抽象一下呢?如果使用IHierarchicalDataSource数据源,不写一条代码,就能将数据邦定到控件。本文给出的就是一个IHierarchicalDataSource接口的通用简单实现。

    设计目标

    我们的设计目标很明确,就是一个IHierarchicalDataSource实现,该实现类可以接受一组用户获取继承体系中的数据的函数的delegate作为构造函数的参数。

    基本的delegate定义和构造函数定义如下:

    //delegates
    public delegate object[] GetRootItemsHandler();    //获取顶层元素
    public delegate object[] GetNonRootItemsHandler(string parentId);    //获取非顶层元素
    public delegate object GetItemHandler(string id);    //通过id获取元素
    public delegate string GetItemIdHandler(object obj);    //通过元素获取id

    //constructor
    public SimpleHierarchicalDataSource(GetItemHandler itemHandler, GetItemIdHandler itemIdHandler, GetRootItemsHandler rootHandler, GetNonRootItemsHandler nonRootHandler);

    简单说明一下为什么定义了这四个delegate。

    首先出于通用型,元素的id使用了string类型,因为不是所有元素的id都是数值。其次,GetRootItemsHandler用于获取继承体系顶层的元素,也就是没有父元素的元素。GetNonRootItemsHandler和GetRootItemsHandler返回元素类型可以是不一样的。例如,Root Item可以是Project,而Nonroot Item可以是和project相关的requirement;当然,两者返回的元素也可以一样,比如多级产品分类。

    而后两个delegate则分别用来获得元素及其id。这里的id除了作为获取元素的标识,还有一些特殊的用处。以TreeView为例,它的FindNode函数可以通过一个查询字符串来查询继承体系中的元素。例如:/1/12/45标识继承体系中id为1的元素下的id为12的元素下的id为45的元素。

    代码实现

    好了,闲话少说,看看实现代码吧,还是要实现好几个接口和抽象类的~~

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Text;

    namespace Ilungasoft.Framework.Web.UI
    {
        
    public delegate object[] GetRootItemsHandler();

        
    public delegate object[] GetNonRootItemsHandler(string parentId);

        
    public delegate object GetItemHandler(string id);

        
    public delegate string GetItemIdHandler(object obj);

        
    public class HierarchyData : System.Web.UI.IHierarchyData
        
    {
            
    Private Members

            
    Constructors

            
    IHierarchyData Members
        }


        
    public class HierarchicalCollection : System.Web.UI.IHierarchicalEnumerable
        
    {
            
    Private Members
            
            
    Constructors

            
    IHierarchicalEnumerable Members

            
    IEnumerable Members
        }


        
    public class RootHierarchicalDataSourceView : System.Web.UI.HierarchicalDataSourceView
        
    {
            
    Private Members

            
    Constructors

            
    Overriden Members
        }


        
    public class NonRootHierarchicalDataSourceView : System.Web.UI.HierarchicalDataSourceView
        
    {
            
    Private Members

            
    Constructors

            
    Overriden Members
        }


        
    public class SimpleHierarchicalDataSource : System.Web.UI.IHierarchicalDataSource
        
    {
            
    Private Members

            
    Constructors

            
    IHierarchicalDataSource Members

            
    Sample Client Handlers
        }

    }

    注意代码中最后一个#region SampleClientHandler是一组project-requirement两种元素的继承体系的delegate实现范例。

    使用的时候,只要将这几个delegate实现函数引用作为构造函数的参数,将实例化的datasource赋给treeview的datasource,就能轻松显示整个继承体系的元素了。

    源码下载

    HierarchicalDataSource.zip

    --

    以上代码虽然具有一定的通用性,但是本身毕竟是为了一定的特殊用途而写,因此功能并不完备,如果要大量使用,请酌情重构和改写。

  • 相关阅读:
    linux命令查询网站
    UTC(世界协调时间)时区和各个时区时间的转换
    dev-c++ 中写完源文件生成exe程序怎么避免运行闪退?
    numpy和time计时程序
    进化算法之粒子群算法和Matlab实现(多维)
    tf.config:GPU 的使用与分配(转载)
    限制TensorFlow只在CPU上运行的方法
    Python重要学习链接
    SpringCloud 之 Nacos 注册配置中心
    Jenkins 自动化部署入门详细教程
  • 原文地址:https://www.cnblogs.com/teddyma/p/336269.html
Copyright © 2011-2022 走看看