asp.net 自定义框架中 .net 用户自定义控件件 的修改和增加。

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
阅读(456)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_083064',
blogTitle:'开发asp.net自定义控件',
blogAbstract:'&& 学习自定义控件的开发不仅可以使你开发出更灵活的系统,更重要的是它可以使你加深对已有服务器控件的理解,得以更灵活的应用。
&& 较之于asp',
blogTag:'用户控件,自定义控件,服务器控件',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:1,
publishTime:1,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}查看: 1585|回复: 2
ASP.NET自定义控件实例
TA的每日心情开心7&小时前签到天数: 628 天[LV.9]以坛为家II主题帖子积分
马上加入IBC,查看更多教程
才可以下载或查看,没有帐号?
本文通过实现一个服务端控件来讲解一下控件开发,该控件的功能如下:
1.显示服务端时间,并不停更新
2.通过手动点击刷新按钮以AJAX获取服务端最新时间
4.能记住在页面上的位置,页面回传后位置不变
5.能配置一个定时时间,一到这个时间,自动回传触发用户自定义的事件首先新建一个类库项目HampWebControl,再新建一个类叫TipTime1,继承WebControl类。如果不是从已有控件中继承,一般就继承WebControl类,
它是所有ASP.NET服务端控件的基类。我们编译这个项目,再新建一个网站项目,引用HampWebControl项目,新建页面,在工具箱中拖一个TipTime1控件到页面上。我们运行该页面,就会发现HTML代码如下:就是说默认是呈现成一个span标签,可以通过重载WebControl基类的TagKey属性来改变。这样呈现在页面上就是个DIV。 HtmlTextWriterTag是个枚举,包含了很多HTML标签。WebControl基类的Render用来呈现内容,重载它便可以往页面上呈现任何自定义的标签。这样在页面上就显示了一个a标签,如下图所示:注意看,这时a标签是在DIV外面,如何将它放到DIV里面呢?这就要重载WebControl基类的RenderContents方法这样这个a标签就在div里面了,如下图所示:接下来为最外围的DIV加一些样式,重载基类的AddAttributesToRender方法这里有两种写法,利用HtmlTextWriterStyle枚举或者直接写CSS属性名。到这里大家了解了自定义控件如何呈现在页面上。我们再新建一个类TipTime2,把依旧重载TagKey为DIV,然后重载RenderContents,
显示一个span标签与一个input标签。
这样页面上显示了当前服务端的时间与一个按钮,如图所示:& &
接下来我们来让用户可以配置按钮上的文字,为类TipTime2增加一个Text属性:同时将呈现按钮的代码改成:这样Text属性便出现在设计视图的属性窗口。修改Text的值,页面上按钮上的文本也跟着变了。注意Text属性是存储在ViewState中,这样保证了回发后值不会丢失。
现在的问题是时间不会变,我们得用javascript来改变它的值。新建一个JS文件TipTime2.js。
这里先要说明的是,项目中已有一个JS文件__WebControlBase.js,里面是一些公用的JS方法,比如绑定事件、获取控件坐标等,所有的方法都是
该方法的扩展方法:var HampWebControl=function(){ }
[C#] 纯文本查看 复制代码 //停止事件冒泡
HampWebControl.prototype.StopBubble = function(e) {
if (e && e.stopPropagation) {
e.stopPropagation();
window.event.cancelBubble =
这样可以减少全局变量,尽可能避免与其它js代码的变量重名。我将每个控件作为HampWebControl方法的一个扩展方法存在,同时每个控件对
应一个数组,用以存储页面上所有该控件的js对象。每个控件对应一个Refresh方法,用以重新绑定事件,这是为了解决回传后的问题。
现在控件呈现成HTML的结构是&div&&span/&&input/&&/div&,有3个标签,我们需要用3个变量来分别存储它们的DOM对象,方便以后操作。后台对HTML标签命名时以当前控件的ClientID开头,后面根据需要加后缀,这样可以一定程度上防止标签重名。由后台将控件的ClientID传过来,
这样便可以获取所有DOM对象。拖动效果利用的是现成js方法,属于纯javascript效果,这里就不展开讨论了,有兴趣的童鞋可以查看示例项目源码。该方法是由后台注册脚本来调用的,如果在数组中已存在就取该对象,否则重新new一个。并调用初始化与绑定事件方法。
这时需要在后台注册该js文件才行。关键的操作时将该文件的“生成操作”属性设置为“嵌入的资源”,使得编译的时候该js文件会作为DLL文件的一部分。接下来需要声明所需的资源文件,严格按文件夹的结构来命名。这里注册了2个JS文件:公用JS文件__WebControlBase.js与控件专用的JS文件TipTime2.js。然后在代码中注册脚本即可。在《道不远人 深入解析ASP.NET2.0控件开发》这本书中,注册脚本文件的代码是放在OnPreRender方法中,但是实际应用中我发现,如果将自定义
控件放在UpdatePanel控件中,就会引发一些问题,所以我都放在OnLoad方法中去注册脚本文件。
注意注册脚本文件这里用了2种不同的方法。
第1种是循环Head标签里面是否存在了脚本,如果不存在,就插入一个&script&标签。
第2种直接调用.NET的注册方法。
[C#] 纯文本查看 复制代码
/// &summary&
/// 向页面注册公共jacascript文件
/// &/summary&
/// &param name=&control&&控件对象&/param&
internal static void RegisterCommonJSFile(Control control)
//注册jacascript文件
String jslink = &&script src='& +
control.Page.ClientScript.GetWebResourceUrl(control.GetType(),
&HampWebControl.includes.__WebControlBase.js&)
+ &' type='text/javascript' &&/script&&;
Register(jslink,control);
/// &summary&
/// 注册资源
/// &/summary&
/// &param name=&strLink&&资源字符串&/param&
private static void Register(string strLink, Control control)
//为了保证资源只注册一次,循环比较,已存在了就不添加
Boolean flag =
for (Int32 i = 0; i & control.Page.Header.Controls.C i++)
LiteralControl lc = control.Page.Header.Controls[i] as LiteralC
if (lc != null)
if (lc.Text == strLink)
if (!flag)
LiteralControl include = new LiteralControl(strLink);
control.Page.Header.Controls.Add(include);
第1种是用于注册公用的资源文件,第2种用于注册该控件特有的资源文件。 因为第2种方法只能保证多个该控件对象只注册一个脚本,但不能保证其它控件也
重复注册了该脚本,所以为了保证公用的资源文件只注册一次,就用第1种方式。
下一步就是注册要执行的脚本代码:
这里如果控件是隐藏的,就不注册。其实如果控件时放在其它容器控件中,比如Panel,而父容器控件设置为隐藏,那么该控件也不可见,但是依旧执行了注册上面的脚本的
代码,所以要在前台Init方法中去判断相应的DOM对象是否存在,这里就没有多做判断。
最后设置一下样式,使之变为浮动,则控件在页面上便能拖动了。
先讲到这里,归纳一下,主要讲了如何呈现自定义控件,如何添加属性,如何增加资源文件。下一讲介绍如何调用AJAX与实现自定义事件。
IBC编程社区
TA的每日心情慵懒 00:44签到天数: 12 天[LV.3]偶尔看看II主题帖子积分
金牌会员, 积分 1220, 距离下一级还需 1780 积分
金牌会员, 积分 1220, 距离下一级还需 1780 积分
谢谢分享!!!
该用户从未签到主题帖子积分
新手上路, 积分 4, 距离下一级还需 46 积分
新手上路, 积分 4, 距离下一级还需 46 积分
积极宣传本站,为本站带来更多注册会员
积极宣传本站,为本站带来更多的用户访问量
长期对论坛的繁荣而不断努力,或多次提出建设性意见
活跃且尽责职守的版主
曾经为论坛做出突出贡献目前已离职的版主
为论坛做出突出贡献的会员
IBC编程社区通知
IBC微信公众号:ibcbcsq
IBC编程社区群号
Powered by第三章 为控件添加事件&&&&&&&&&
&&&&&&好了,我们之前以前开发一个控件。而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件。
&&&&&系列文章链接:
&&&&&ASP.NET的开发都是事件驱动的,现在我们就来为控件添加事件。在说事件之前,希望大家对C#的语法要熟悉,对委托
很事件要懂。
&&&&&其实定义事件的步骤很简单:
&&&&&&&&&&<font color="#.声明一个委托。
&&&&&&&&&&<font color="#.定义一个携带事件信息的类。
&&&&&&&&&&<font color="#.定义事件
&&&&&&&&&&4.定义一个通事件发生后,通知其他对象的方法
&&&&&&&&&首先来理清一下我们的思路:
&&&&&&&&&&
&&&&&&&&&&1.在下拉框中选中一个值,并且在输入框中也输入相应的值。
&&&&&&&&&&2.我们在页面点击&#8220;提交&#8221;按钮,按钮就触发我们自定义的一个事件Validate(验证输入信息的正确行)。
&&&&&&&&&我们在提交的时候要把控件的信息传给服务器,所以我们要定义一个事件信息类,来携带事件发生时,把个信息类送
到服务器。
&&&&&事件定义如下:
&&&&&&&&&&1.定义一个携带事件信息的类。
&&&&&&&&&&&&&&&
&1&using&S
&2&using&System.Collections.G
&3&using&System.T
&5&namespace&CreditCardForm
&7&&&&&public&class&ValidateCreditCardFormEventArgs:EventArgs&
&9&&&&&&&&&private&string&paymentM
10&&&&&&&&&public&string&PaymentMethod
11&&&&&&&&&{
12&&&&&&&&&&&&&get
13&&&&&&&&&&&&&{
14&&&&&&&&&&&&&&&&&return&this.paymentM
15&&&&&&&&&&&&&}
16&&&&&&&&&}
19&&&&&&&&&private&string&creditCardNo;
20&&&&&&&&&public&string&CreditCardNo
21&&&&&&&&&{
22&&&&&&&&&&&&&get
23&&&&&&&&&&&&&{
24&&&&&&&&&&&&&&&&&return&this.creditCardNo;
25&&&&&&&&&&&&&}
26&&&&&&&&&}
29&&&&&&&&&private&string&cardholderN
30&&&&&&&&&public&string&CardholderName
31&&&&&&&&&{
32&&&&&&&&&&&&&get
33&&&&&&&&&&&&&{
34&&&&&&&&&&&&&&&&&return&this.cardholderN
35&&&&&&&&&&&&&}
36&&&&&&&&&}
38&&&&&&&&&private&DateTime&expirationD
39&&&&&&&&&public&DateTime&ExpirationDate
40&&&&&&&&&{
41&&&&&&&&&&&&&get
42&&&&&&&&&&&&&{
43&&&&&&&&&&&&&&&&&return&this.expirationD
44&&&&&&&&&&&&&}
45&&&&&&&&&}
48&&&&&&&&&public&ValidateCreditCardFormEventArgs(string&paymentmenthod,&string&creditcardno,
49&&&&&&&&&&&&&string&cardholdername,&DateTime&expirationdate)
50&&&&&&&&&{
51&&&&&&&&&&&&&this.paymentMethod&=&
52&&&&&&&&&&&&&this.creditCardNo&=&
53&&&&&&&&&&&&&this.cardholderName&=&
54&&&&&&&&&&&&&this.expirationDate&=&
55&&&&&&&&&}
&&&&&&&&&&&&&&&2.声明一个委托。
2&using&System.Collections.G
3&using&System.T
5&namespace&CreditCardForm
7&&&&&public&delegate&void&ValidateCreditCardFormEventHandler(object&sender,ValidateCreditCardFormEventArgs&args);
&&&&&&&&&&
&&&&&&&&&&3.定义事件
1&&public&event&ValidateCreditCardFormEventHandler&ValidateCreditCardF
&&&&&&&&&&4.通事件发生后,通知其他对象的方法
2&//这个方法是受保护的虚方法
3&protected&void&OnValidateCreditCardForm(ValidateCreditCardFormEventArgs&args)
4&&&&&&&&&{
5&&&&&&&&&&&&&&if&(ValidateCreditCardForm&!=&null)
6&&&&&&&&&&&&&&&&&handler(this,&args);
7&&&&&&&&&}
&&&&&&&&&&这样几个步骤之后,控件的事件就写完了。大家试试! 有问题,我们下篇接着说!
&&&&&&&&&&今天写到这里,希望大家反馈信息,听听大家的想法!
阅读(...) 评论()}

我要回帖

更多关于 .net 用户自定义控件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信