您的位置:首页 > 其它

复合控件与事件(1)——基础入门,组合也是一种封装

2007-07-02 03:00 225 查看
关于复合控件的文章在网上已经很多了,本文只是最近自己做复合控件的一些心得体会。希望大家愿意和我分享。

复合控件作为组件二次开发一个很好的方式被很多人所喜欢,理由就是它在复用性和实用性两方面做到了很好的权衡。如果你的项目对某一组控件的组合依赖比较多,而这些组合之间的关系基本上也是很稳定的话,再者你对它们会大量使用到的话,那么你可以考虑将它们做成复合控件进行引用。
复合控件不是用户控件ascx,许多用户都做过ascx但是并没有做过复合控件。其实它们的区别也不是很大,表现形式基本上也是一样的,区别就在于用户控件的制作过程和制作页面是无异的,而复合控件的制作则相对更“专业”一点,复合控件以DLL的形式被提供,可以被复用于多个项目,而用户控件则仅限于当前项目中。这些很“酷”的因素也足以让你愿意尝试你的第一个复合控件了。
最简单的复合控件(为了从基础开始有个全面的认识,我用最最简单的例子去开篇,让你对复合控件有个更抽象的认识,从宏观角度更好地把握制作过程)
根据大家对用户控件的认识想必很容易做出同样类型的复合控件,只要它能够以复合控件的形式提供,它事实上已经是一个复合控件,至于好不好用,那就要看你设计的功力了。
在用户控件中,大家通过添加各种控件,然后对它们进行调用,我们用FindControl去寻找它们,理由是因为它们被添加进用户控件ascx文件的时候是protected的,而被调用的时候,用户控件是protected的,而其子控件就相应地变成private的了,因此我们无法轻松的利用点运算符去获取它们,因此我们采用FindControl去Find它们。找到之后它们就可以被你轻松使用了。事实上你最需要的是它们布局上的相对稳定以及一些内部逻辑,而从外部看,控件则是一个整体。在复合控件中,我们也可以这么做,但是我们甚至可以做得更简单,因为它的访问权限受我们支配,我们可以通过public去设置它们,这样用户程序就可以无限制访问了,也就不需要FindControl了,当然你还可以通过get访问器去访问,这样你同样可以获得你子控件对象的实例。你可以像下面这样定义你的子控件,这样你就可以在外部对它们进行访问了。

//Method1
private DropDownList ddl1 = new DropDownList();
public DropDownList DDL1
//Method2
public DropDownList ddl2 = new DropDownList();

调用的代码可以是:

//这里以DataSource进行举例,这样的例子同样适用于事件、方法等
this.CompositeControl1_1.DDL1.DataSource = GetDDLData();
this.CompositeControl1_1.ddl2.DataSource = GetDDLData();

以上这些其实就是一个类中包含有另一个类的一个对象,现在如何让调用这个类的客户程序去使用这个涵盖的对象的问题。
复合控件是一个特殊的类,因为你希望别人知道你所做的是一个控件而不是一个普通的类。.net框架提供了一个CompositeControl抽象类供我们继承,相比自己做控件的用户而言,做复合控件的用户已经清闲了许多了,直接从这个类继承就可以达到目的了。

public abstract class CompositeControl : WebControl, INamingContainer, ICompositeControlDesignerAccessor
//ICompositeControlDesignerAccessor:提供一个接口以使复合控件设计器可以在设计时重新创建其关联控件的子控件。
当然了,你如果要直接从WebControl继承也不是不可以,其实效果都是一样的,如果你要再从Control来继承也是可以的。这里我们只需要以下形式就可以了

public class CompositeControl1 :CompositeControl
[ToolboxData("<{0}:CompositeControl1 runat=\"server\" />")]
public class CompositeControl1 :CompositeControl
public CompositeControl1()
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace ComponentWebControls

CompositeControl1.aspx

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>CompositeControl1</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<cc1:CompositeControl1 ID="CompositeControl1_1" runat="server" />
</div>
</form>
</body>
</html>

CompositeControl1.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using ComponentWebControls;

namespace WebAppTestControls

CompositeControl1.aspx.designer.cs

//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行库版本:2.0.50727.1318
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------

下一篇:复合控件和事件(2)——属性,页面要回发,属性要保存
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: