Technological achievements dream
技术成就梦想
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 14 文章- 0 评论- 70
asp.net控件开发(二)--------简单属性
我们开发出来的控件一般都需要跟使用控件的人编程人员交互,其中交互有两个途径:一个是属性还有就是事件。属性可能是简单的类型如: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
"
%>
<!
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
>
示例
</
title
>
</
head
>
<
body
>
<
form id
=
"
form1
"
runat
=
"
server
"
>
<
div
>
<
cc1:PicShow ID
=
"
"
runat
=
"
server
"
ImgUrl
=
"
Images/1109508867.jpg
"
>
</
cc1:PicShow
>
<
asp:Button ID
=
"
btnChange
"
Text
=
"
Change Picture
"
runat
=
"
server
"
onclick
=
"
btnChange_Click
"
/>
</
div
>
</
form
>
</
body
>
</
html
>
我们通过按钮来改变其属性:
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 : PicShow
{
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)方法,来保存以前的初始化工作。
Tag标签:
asp.net 控件开发
posted @ 2008-05-15 09:30
Henllyee Cui
阅读(1335)
评论(11)
编辑
收藏
所属分类:
Asp.net 控件开发
发表评论
回复
引用
查看
#1楼
2008-05-15 10:15 |
王孟军!
呵呵,学习了
回复
引用
查看
#2楼
2008-05-15 11:51 |
生鱼片
学习
回复
引用
查看
#3楼
2008-05-15 13:00 |
Ivan-Yan
不知道学习控件开发对学习asp.net有什么实际的帮助?
准备学这个东西
请lz指教??
回复
引用
#4楼
2008-05-15 13:31 |
Rzzzz [未注册用户]
楼主刚刚看完ASP.NET控件开发大全吧?
回复
引用
查看
#5楼
[
楼主
]2008-05-15 13:36 |
Henllyee Cui
@Ivan-Yan
我感觉能把一些常用而且能整合的功能整合在一起,
方便开发。
其次能加深我们对asp.net底层的认识。
回复
引用
查看
#6楼
[
楼主
]2008-05-15 13:37 |
Henllyee Cui
@生鱼片
正打算向你学习wf呢。
回复
引用
查看
#7楼
[
楼主
]2008-05-15 13:39 |
Henllyee Cui
@王孟军!
推荐看《道不远人》,我基本上是看thin的这本书的。
回复
引用
查看
#8楼
2008-05-15 17:51 |
镜涛
学习
回复
引用
#9楼
2008-05-16 09:23 |
allies [未注册用户]
this._picImg 和 _picImg 有什么差别吗。。为什么要特意加个 this ?
回复
引用
查看
#10楼
[
楼主
]2008-05-16 09:56 |
Henllyee Cui
@allies
没什么区别,个人习惯而已。我个人感觉加上this后代码清晰点
回复
引用
查看
#11楼
2008-05-18 13:25 |
wayne D.S.
写得很清楚,期待下一篇
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-05-27 14:14 编辑过
另存
打印
所属分类的其他文章:
·
Asp.net 控件开发(四) 数据回传
·
asp.net 控件开发(三)------处理标签间内容
·
asp.net控件开发(二)--------简单属性
·
asp.net 控件开发(一)---显示控件内容
最新IT新闻:
·
微软推新型搜索技术"BrowseRank"挑战谷歌
·
2008年7月26日IT博客精选
·
微软每年向Apache捐10万美元支持开源软件
·
AOL将关闭3个网站以降低成本 集中发力广告
·
谷歌网页索引数量突破1万亿个
博客园新闻频道
博客园首页
社区
公告
本博客所有资源无说明外都为原创,转载请说明出处。
This blog without all the resources that are outside the original, reproduced Please indicate the source.
职业:经常丢人的程序员
城市:苏州 昆山
msn:Henllyee@hotmail.com
网名:小猪
我的最新闪存
打算在这个星期写个模态显示的控件
7-9 14:36
<
2008年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
与我联系
发短消息
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
给我留言
查看留言
我参加的小组
jQuery
.NET 3.x
LINQ
ASP.NET AJAX
我参与的团队
Silverlight学习与研究(0/277)
WCF技术研究团队(0/122)
我的标签
asp.net 控件开发(4)
WCF技术(3)
Asp.net Ajax(2)
设计模式(1)
IT人生(1)
随笔分类
Asp.net Ajax(2)
(rss)
Asp.net 控件开发(4)
(rss)
asp.net技术(1)
(rss)
javascript、css 浏览器兼容问题(1)
(rss)
sql Server
(rss)
WCF学习笔记(3)
(rss)
个人感悟(2)
(rss)
设计模式(1)
(rss)
随笔档案
2008年7月 (5)
2008年6月 (2)
2008年5月 (4)
2008年4月 (2)
2008年3月 (1)
相册
My Picture
搜索
最新随笔
1. Asp.net 控件开发(四) 数据回传
2. Asp.net Ajax WebService 实现循环引用(自定义JavascriptConverter)
3. WCF学习(三)-------数据契约1
4. 简单工厂
5. C# 反射机制(转)
6. WCF学习(二)-------服务契约
7. wcf学习(一):预览
8. asp.net 控件开发(三)------处理标签间内容
9. asp.net控件开发(二)--------简单属性
10. 女人嫁IT的十大理由
最新评论
1. re: Asp.net 控件开发(四) 数据回传
这个不错 支持一下 (guojing)
2. re: Asp.net 控件开发(四) 数据回传
就是委托 (北京)
3. re: Asp.net 控件开发(四) 数据回传
呵呵,不好意思,,代码太多,X来X去居然是这样。。你还是看我的文字好了。 (真见)
4. re: Asp.net 控件开发(四) 数据回传
[ AspNetHostingPermission ( SecurityAction.Demand, Level = AspNetHostingPermissionLevel... (真见)
5. re: Asp.net 控件开发(四) 数据回传
@真见
没有完全明白你的意思,你是说你的在CompositeControl中定义了属性,然后设置了属性的值,但是获取不了?能给点源代码吗? (Henllyee Cui)
阅读排行榜
1. wcf学习(一):预览(1936)
2. WCF学习(二)-------服务契约(1481)
3. asp.net 控件开发(三)------处理标签间内容(1449)
4. asp.net 控件开发(一)---显示控件内容(1349)
5. asp.net控件开发(二)--------简单属性(1335)
评论排行榜
1. 女人嫁IT的十大理由(11)
2. asp.net控件开发(二)--------简单属性(11)
3. wcf学习(一):预览(11)
4. WCF学习(三)-------数据契约1(11)
5. asp.net 控件开发(一)---显示控件内容(8)