asp.net控件开发(二)-简单属性

本文介绍了如何通过属性和状态机制实现自定义控件与用户的交互。详细解释了属性设置、视图状态和控件状态的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源:http://it.hywxfashion.cn/p/c/2008/05/15/81061569-a64f-4c2b-9e9a-76358aaf46fe.shtml

我们开发出来的控件一般都需要跟使用控件的人编程人员交互,其中交互有两个途径:一个是属性还有就是事件。属性可能是简单的类型如:int、string等并不太复杂的类型,也有比较复杂的类型如:集合。

一、属性实现交互

我们还是沿用上面的例子来添加属性 picshow示例:

 

public class picshow : control
{
private string _imgurl;
//属性
public virtual string imgurl
{
get
{
return this._imgurl;
}
set
{
this._imgurl = value;
}
}

protected override void render(htmltextwriter writer)
{
writer.addstyleattribute(htmltextwriterstyle.textalign, "center");
writer.addstyleattribute(htmltextwriterstyle.height, "100px");
writer.addstyleattribute(htmltextwriterstyle.width, "100px");
writer.renderbegintag(htmltextwritertag.div);

//create img tag
writer.addattribute(htmltextwriterattribute.src, this.imgurl);
writer.addstyleattribute(htmltextwriterstyle.width, "80px");
writer.addstyleattribute(htmltextwriterstyle.height, "80px");
writer.renderbegintag(htmltextwritertag.img);
writer.renderendtag();
//end of div
writer.renderendtag();
}
}

上面的示例就是改变了上次的控件只能指定死了图片,这样图片的地址就可以由控件的使用人员自己去指定了。控件中定义了一个私有字段,通过属性 imgurl来设置其值,因为我们允许重写其属性,所以定义成了virtual类型的。这里的属性定义跟一般类的定义是一样的,就不多做说明。

二、视图状态

底下我们在一个项目中应用此控件,但我们发现,这样的控件的属性的状态是没法维持的。也就是说,它永远只能维持我们初始给它的值。
举个例子:

 

<%@ page language="c#" autoeventwireup="true" codefile="controlsatepic.aspx.cs"

inherits="controlsatepic" %>

<%@ register assembly="henllyeeconrol" namespace="myconrol1" tagprefix="cc1" %>

http://www.w3.

org/tr/xhtml1/dtd/xhtml1-transitional.dtd">







imgurl="images/1109508867.jpg">

/>


 

我们通过按钮来改变其属性:

protected void btnchange_click(object sender, eventargs e)
{
if (this.psdemo.imgurl == "images/1109508867.jpg")

this.psdemo.imgurl = "images/bg.jpg";

else

this.psdemo.imgurl = "images/1109508867.jpg";

}


运行后我们会发现,我们的图片只能改变一次。原因很简单,客户端发出http请求后,服务器端并没有帮我们去维持上一次的请求信息。
在有的时候我们必须要求其维持状态。状态分为两种:一个是视图状态,一个是控件状态。

视图状态在脚本中的表现为:保存到一个叫"_viewstate"的隐藏域中去,这样来实现保存上次的用户请求。视图状态是一个集合(viewstate)。
我们来继承一个picshow

 

public class viewstatepic : picshow
{
public override string imgurl
{
get
{
string strimgurl = (string)viewstate["imgurl"];
return (strimgurl == null) ? string.empty : strimgurl;
}
set
{
viewstate["imgurl"] = value;
}
}
}


这里我们只是把imgurl重写了,通过视图的状态来实现的,这下子我们在使用时就可以维持上次用户的请求。

三、控件状态

我们会发现如果用户禁止使用了视图状态的话(在<%page%>中添加enableviewstate="false"),我们还是维持不了用户的上次请求,这时我们可以通过控件状态来永远地维持。
控件状态的维持一般分为三步:
1、通过page.registerrequirescontrolstate()方法来通知控件运行时所在的页面,把此控件维持成控件状态。
2、重写savecontrolstate()方法来保存控件状态的值。
3、最后再将控件状态的值返回到属性中去。
控件状态示例:

 

public class controlstatepic : albumn
{
protected override void oninit(eventargs e)
{
page.registerrequirescontrolstate(this);
base.oninit(e);
}

protected override object savecontrolstate()
{
return this.imgurl;
}

//从保存的控件视图中取出来
protected override void loadcontrolstate(object savedstate)
{
this.imgurl = savedstate as string;
}
}

注意的一点,我们在重写oninit方法时,我们只是需要要添加额外的功能,去注册控件状态,所以一定要调用base.oninit(e)方法,来保存以前的初始化工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值