2004-6-26+ 用户控件(初步知识+属性设置)
终于到用户控件(usercontrol)啦,按照microsoft press出的书的说法:“这一方面是如此重要,以至于一天没有学习这种控件,您就浪费了一天时间”。这样说虽然有点悬,但是用户控件确实很重要哦。
以前做asp的时候,经常会把一些重复使用的代码做成一个单独的页面(比如说页头,页尾等),然后用<!--#include file="xxx.asp"-->的办法把这个重复的地方放进页面,现在.net提供了更加强大的办法来实现这个功能,这就是用户控件技术。
用户控件的作用主要有:
a.分解复杂的用户界面元素,并将它们转化成可重用的组件。
b.创建适合于单个用户的个性化动态页面。
c.促进子页面级别的输出缓存—也就是说,将某一页面的静态内容放入缓存,同时允许动态呈现该页面的其他部分。
关于用户控件的详细内容,我就不在这里唠叨了,因为.net framework sdk 文档说的比我清楚啊,大家可以从这个地址
ms-help://MS.NETFrameworkSDKv1.1.CHS/cpguidenf/html/cpconwebformsusercontrols.htm
直接进入。我在这里主要说说我这两天的经验。
在vs.net里可以用“右键-添加”的方式方便的添加一个带codebehind的ascx文件,然后就可以像做普通aspx页面那样来组织页面,完事后ctrl+shift+b一下就ok了。这其中遇到的一个难点就是属性的添加。(事件的添加更是难点,今天先不说,因为我也没有看懂。最近研究“delegate和event”中……)
说到属性,先应该明白这里包含的“面向对象”的内容。我们创建了一个ascx文件,实际上是在顶端的命名空间中添加了一个新类,在aspx文件中使用usercontrol,实际上就是使用了这个类的一个实例。(而创建的usercontrol的类实际上又继承自System.Web.UI.UserControl。)既然是一个类,那自然有c#类的性质,比如说属性和公有域。
而我们所说的usercontrol的属性,实际上就是可以公共使用的性质(这里我也说不清啊,大家可以想一想webcontrols里的一些例子,比如说label的Text,这个东西就是可以公共访问),在后台实现时可以使用c#中类的公有域或属性来完成,在这里我倾向于使用属性,因为这样灵活性更大一些,易于控制。来看一个例子:
---------------------------------------------------user.ascx
<asp:Label id="labmessage" runat="server">hello user control!</asp:Label>
---------------------------------------------------user1.ascx.cs
//在同一命名空间prac下
namespace prac
{
public class user1 : System.Web.UI.UserControl
{
protected System.Web.UI.WebControls.Label labmessage;
//加一个中间量txt,看起来方便,实际使用的时候可能不需要这么麻烦
private string txt="hello c sharp world!";
private void Page_Load(object sender, System.EventArgs e)
{
labmessage.Text=txt;
}
//属性Txt,用来设置label的Text
public string Txt
{
get
{
return txt;
}
set
{
txt=value;
}
}
}
}
---------------------------------------------------msg.aspx.cs
//在同一命名空间prac下
namespace prac
{
public class msg : System.Web.UI.Page
{
//声明一个实例,该实例反映到aspx页面上就是那个usercontrol,注意prac.user1的套嵌关系写法,如果输入正确的话,vs.net的智能提示就会出现哦,另外注意是protected
protected prac.user1 msg;
private void Page_Load(object sender, System.EventArgs e)
{
//像一般的webcontrol那样设定值,同样会出现智能提示,Txt属性就在其中
msg.Txt="hello code behind world!";
}
}
}
---------------------------------------------------msg.aspx
<%@ Register TagPrefix="user" TagName="message" Src="user1.ascx"%>
<user:message Runat="server" Id="msg" Txt="hello world!"></user:message>
这个usercontrol提供了一个Txt属性,可以让用户在使用的时候改变文本值。和webcontrol一样的,有两种方法来改变这个属性,一是通过在aspx页面上直接设定,二就是在codebehind里面设定。从面向对象的角度来看两个cs文件,这是同一命名空间下的两个类之间的操作。而aspx页面和ascx页面分别是这两个类的实例,所以也可以进行这样的操作。
像这样,可以设定需要使用的其他的属性。实际上,应该尽力预测其他开发人员在使用该用户控件时的需要,然后尽可能的公开能够使用的属性,方便他们自定义控件的外观和行为。