科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道用户控件包装器的设计与实现之二

用户控件包装器的设计与实现之二

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

菜单是Web Part的一个重要组成部分,菜单的充分利用可以对Web Part的内容进行方便的编辑。Web Part自带的菜单可以实现对Web Part进行有效的编辑。这里介绍利用菜单实现对用户控件的复制和粘贴。

作者:中国IT实验室 来源:中国IT实验室 2007年9月11日

关键字: 控件 用户 编程

  • 评论
  • 分享微博
  • 分享邮件
  

    3.2 用户控件的编辑

    菜单是Web Part的一个重要组成部分,菜单的充分利用可以对Web Part的内容进行方便的编辑。Web Part自带的菜单可以实现对Web Part进行有效的编辑。这里介绍利用菜单实现对用户控件的复制和粘贴。

    确定一个用户控件的完整信息需要得到用户控件的路径及用户控件的所有属性。可以考虑将这两者复制到一个“剪切板”上。类的静态成员在该类的所有实例里拥有一样的值,巧妙地起到“剪切板”的作用,基于这个思想,在WebPart的子类中添加两个静态域,用于保存用户控件的信息。

    复制过程:

    (1) 添加复制菜单及相应菜单的服务器端函数;

    (2) 在函数中将WebPart子类中的自定义属性的值赋予添加的两个静态域;

    粘贴过程:

    (1) 添加粘贴菜单及相应菜单的服务器端函数;

    (2) 在函数中将两个静态域的值赋予WebPart子类的自定义属性;

    (3) 根据保存用户控件路径的自定义属性添加用户控件;

    (4) 根据保存用户控件属性的自定义属性赋予用户控件新的属性值。

    (5) 保存自定义属性的值,以便再次加载页面时用户控件的状态得以保留;

    3.3 用户控件之间的数值传递

    3.3.1 Web Part之间的数值传递

    用户控件之间的数值传递依赖于Web Part之间的数值传递。Web Part之间的数值通过实现Web Part框架提供的6对接口之一得以传递,这6对接口分别是:

    连接的接口对

    描述

    ICellProvider, ICellConsumer

    由实现ICellProvider的对象提供一个Object类型的单一值给实现ICellConsumer的对象,实现ICellConsumer的对象在接收值之前可以向实现ICellProvider的对象提供String类型的初始信息,实现ICellProvider的对象也可以在发送值之前向实现ICellConsumer的对象提供String类型的初始信息

    IRowProvider, IRowConsumer

    由实现IRowProvider的对象提供一个DataRow类型的数组给IRowConsumer,实现IRowProvider的对象在传递值之前可以向实现IRowConsumer的对象提供String类型的初始信息

    IListProvider, IListConsumer

    由实现IListProvider的对象提供一个DataTable类型的数给IListConsumer的对象,实现IRowProvider的对象在传递值之前可以向实现IRowConsumer的对象提供String类型的初始信息。

    IFilterProvider, IFilterConsumer

    提供或者消费一个String类型的过滤值的接口对。 例如,SharePoint列表实现了IRowProvider, IListProvider ,IFilterConsumer. 那么两个不同的列表能够互相连接,并且一个列表可以过滤另一个列表的内容。

    IParametersInProvider, IParametersInConsumer

    实现IParametersInProvider接口的对象可以向IParametersInConsumer的对象提供任意组的参数值,值的内容由String类型组成。实现IParametersInConsumer的对象在接受参数之前可以向实现IParametersInProvider的对象提供所需参数的初始信息

    IParametersOutProvider, IParametersOutConsumer

    实现IParametersOutProvider接口的对象可以向IParametersOutConsumer的对象提供任意组的参数值,值得内容由string类型组成。实现IParametersOutProvider的对象在发送参数之前可以向实现IParametersOutConsumer的对象提供所需参数的初始信息

    Web Part连接的设计和SharePoint的对象模型有紧密的联系。但是,从本质上说,提供的数据类型分为Object和String两大类(DataRow和DataTable实际上也就是Object类型的数组组成);提供的相关信息都是String类型,方向要么由数据者提供向数据者接收提前发送,要么由数据者接收向数据者提供者提前发送。用户控件对数据交流的最大要求是既可以传递数据,又可以接收数据,并且可以是任意类型的数据类型。一个Web Part可以实现多个接口以实现既传递数据又接受数据的功能,但是两个Web Part之间不能既提供数据给对方,又从对方接受数据,这样将形成闭环。可以考虑的方案是传递数据而接收数据的初始化信息。综上因素,ICellProvider和ICellConsumer是不错的选择,因为传递的数据是Object类型,而接收方可以提前传递初始化信息给发送方。主要实现步骤如下:

    (1) 创建供用户控件待以实现的数据提供接口和数据接收接口;

    (2) 创建两个类,分别用于实现ICellProvder和ICellConsumer接口;

    (3) 在WebPart的子类中,添加第2步创建的类的对象作为域成员;

    (4) 在WebPart的子类中,覆盖虚方法EnsureInterfaces,根据包装的用户控件实现的接口类型,注册ICellProvider接口或ICellConsumer接口;

    (5) 在WebPart的子类中,覆盖虚方法CanRunAt,指明连接的位置在服务器端还是客户端;

    (6) 在WebPart的子类中,覆盖虚方法PartCommunicationConnect,该方法被Web Part框架用来通知Web Part已被连接;

    (7) 在WebPart的子类中,覆盖虚方法PartCommunicationInit,该方法被Web Part框架用来传送初始化信息,注册了ICellConsumer的Web Part可以从用户控件得到要传送的初始化信息在实现ICellConsumer的域成员中进行传送,注册了ICellProvider的Web Part也可以从用户控件得到要传送的初始化信息在实现ICellProvider的域成员中进行传送;

    (8) 在WebPart的子类中,覆盖虚方法PartCommunicationMain,注册了ICellProvider的Web Part可以将实现ICellProvider的域成员在此方法中得到的传递过来的初始化信息转发给用户控件;注册了ICellConsumer的Web Part也可以将实现ICellConsumer的域成员在此方法中得到的传递过来的初始化信息转发给用户控件;同时,注册了ICellProvider接口的Web Part可以在此时接收用户控件传来的数据,利用实现ICellProvider的域成员发送数据给注册ICellConsumer接口的Web Part;

    (9) 在WebPart的子类中,覆盖虚方法RenderWebPart,注册了ICellConsumer接口的Web Part的实现ICellConsumer的域成员在此方法中得到注册了ICellProvider的Web Part传来的数据,注册了ICellConsumer接口的Web Part可以将数据传递给包装的用户控件,将用户控件呈现在浏览器上;

    这些虚方法都是Web Part框架依次调用,次序和步骤顺序一致。

    4.结束语

    用户控件包装器是巧妙的利用Web Part本身的功能将Web Part的缺陷加以克服。它的实现给Web Part的开发带来极大的便利,ASP.NET程序员根本就不需要理解Web Part的开发原理,就可以利用以往的编程思想快速地开发自己需要的Web Part,进而使得SPS2003的门户网站开发和设计事半功倍。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章