以前我在做项目的时候,都是用的是用户自定义控件,这一回我看了一下自定义控件。
它们两者的不同点在于:用户自定义控件是基于横向的,也就是说可以用多个控件组合在一起使用;而自定义控件是纵向的,是一个已存在控件的扩展。
新建一个WEB自定义控件项目;
由于在项目中经常会用到点一个BUTTON的时候,要弹出JS的确认对话框,第一次都要在页面上加入JS,很麻烦,这个过程是可以封装的~~
新建一个“自定义控件”,取了个名字:MyButton,这时会发现这个类是继承自WebControl的,把它改成Button,也就是说只扩展BUTTON,把类中的所有代码删掉,新建一个属性,Confirm,也就是在弹出对话框时,要显示的内容。
重写Render方法,代码如下:
base.Attributes.Add("onclick", "return confirm('" + this.confirm + "')");
            base.Render(writer);

(注:Render是控件的表现方法,如果想让自定义控件表现成指定的样式,那么就得继承WebControl类,在重写的Render方法中,writer.Write(),这里输入自己想要的HTML控件就可以了。)

就这样,一个简单的控件就完成了,编译,新建一个网站,在工具箱中加入这个DLL,拖出来,运行这个页面,会发现,点击这个BUTTON的时候,发弹出一个提示框,当然,默认的情况下是空的,是因为没有设置Confirm这个属性,设个字符就可以了。
但是,认真看一下,为什么这个属性在使用的时候没有注释呢,于是马上把注释写好,编译之后发现,还是没有,怎么回事呢。
经查找,原来自定义控件是不能这样直接写注释的,要想加入注释,得加一个特性标签,Description,Category标签是表示当属性用分类形式查看的时候,这个属性显示在那个分类里面,完整代码如下:

[DefaultProperty("Text")]
    [ToolboxData("<{0}:MyButton runat=server></{0}:MyButton>")]
    public class MyButton : Button
    {
        private string confirm = "是否确定?";
        [Description("确定对话框的内容"), Category("必设属性")]
        public string Confirm
        {
            get { return confirm; }
            set { confirm = value; }
        }

protected override void Render(HtmlTextWriter writer)
        {
            base.Attributes.Add("onclick", "return confirm('" + this.confirm + "')");
            base.Render(writer);
        }
    }

用同样的原理做了一个LinkButton的控件,代码都一样,只不过所继承的是LinkButton这个类而已。
最后我还做了一个TextBox的控件,这个也是很常用的,因为在很多时候要限定只能输入数字之类的,最终我把它做成了一个可设定很多选项的控件,
如:是否允许粘贴,是否允许拖动,是否允许输入小数点,小数点之后保留多少位,是否允许切换为其它输入法,有了这几个属性之后,相信很多地方都可以直接用啦~~
代码如下:

[DefaultProperty("Text")]
    [ToolboxData("<{0}:MyTextBox runat=server></{0}:MyTextBox>")]
    public class MyTextBox : TextBox
    {
        protected override void Render(HtmlTextWriter writer)
        {
            if (this.allowPaste == AllowType.不允许)
            {
                base.Attributes.Add("onpaste", "return false");//禁止粘贴
            }
            else
            {
                base.Attributes.Add("onpaste", @"var s=clipboardData.getData('text');   if(!/\D/.test(s))   value=s.replace(/^0*/,'');   return   false;");
            }
            if (this.allowMove == AllowType.不允许)
            {
                base.Attributes.Add("ondragenter", "return false");//禁止拖动
            }
            base.Attributes.Add("onkeyup", "if(value.length>1)value=value.replace(/^0*/,   '');");//开头的0替换为空
            base.Attributes.Add("onfocus", " var e = event.srcElement; var r =e.createTextRange();    r.moveStart('character',e.value.length); r.collapse(true); r.select(); ");
            if (allowPoint == AllowType.不允许)
            {
                base.Attributes.Add("onkeypress", "return event.keyCode>=48&&event.keyCode<=57");//只能输入数字
            }
            else
            {
                base.Attributes.Add("onkeypress", "var index=value.indexOf('.');var len=index+" + this.behindPoint + "; if(index!=-1&&value.length>len){return false;} if((index==-1&&event.keyCode==46)||(event.keyCode>=48&&event.keyCode<=57)){return true;}else{return false;}");//只能输入 数字 和 一次小数点
                base.Attributes.Add("onblur", " var index=value.indexOf('.'); if(index==0)value=value.replace('.',   '0.'); ");//开头的小数点换为 "0."
            }
            if (allowInputMethod == AllowType.不允许)
            {
                base.Style.Add("ime-mode", "disabled");//禁用输入法
            }
            base.Render(writer);
        }

        private AllowType allowPaste = AllowType.不允许;
        [Description("是否允许粘贴,默认不允许"), Category("可选属性")]
        public AllowType AllowPaste
        {
            get { return allowPaste; }
            set { allowPaste = value; }
        }

        private AllowType allowMove = AllowType.不允许;
        [Description("是否允许拖动,默认不允许"), Category("可选属性")]
        public AllowType AllowMove
        {
            get { return allowMove; }
            set { allowMove = value; }
        }

        private AllowType allowPoint = AllowType.不允许;
        [Description("是否允许输入小数点,默认不允许"), Category("可选属性")]
        public AllowType AllowPoint
        {
            get { return allowPoint; }
            set { allowPoint = value; }
        }

        private int behindPoint = 2;
        [Description("小数点之后保留多少位,在允许小数点的情况下可用,默认 2位"), Category("可选属性")]
        public int BehindPoint
        {
            get { return behindPoint; }
            set { behindPoint = value; }
        }

        private AllowType allowInputMethod = AllowType.不允许;
        [Description("是否允许切换为其它输入法,默认不允许"), Category("可选属性")]
        public AllowType AllowInputMethod
        {
            get { return allowInputMethod; }
            set { allowInputMethod = value; }
        }

    }

    public enum AllowType
    {
        允许,
        不允许,
    }

这里加入了一个枚举,主要是为是在用户使用控件的时候不用输入,而是直接选择,比较方便。
最后这个自定义控件前前后后地我改了很多地方,我觉得还是非常满意了。

转载于:https://www.cnblogs.com/pointdeng/archive/2008/03/19/1112835.html

WEB自定义控件小记相关推荐

  1. CSDN中对Web自定义控件的讨论帖

    这是昨天在网上看到的非常不错的一个帖子,有很多高手都对WEB自定义控件做了很精辟的发言,值得研究.不过本人看过之后只是一知半解,就在这里收藏一下,留待以后参详吧,呵呵-- 本贴是对Web自定义控件的讨 ...

  2. 移动端Web开发小记

    之前为公司商旅频道写移动端的页面时遇到不少问题,今特来个总结,希望能为后来者带来一些帮助. 不再考虑浏览器兼容性 移动端开发主要对象是手持设备,其中绝大部分是IOS和Android系统,so,在开发此 ...

  3. 创建ASP.NET WEB自定义控件——例程2

    本文通过一段完整的代码向读者介绍复合自定义控件的制作,包括:自定义属性.事件处理.控件间数据传递等方面的技术. 作者在http://damao.0538.org有一些控件和代码,并在更新中,有兴趣的读 ...

  4. ASP.NET基础教程-Web 自定义控件的使用-根据属性值从数据库中提取数据并在页面上自动生成一个表格...

    一.新建一个Web 控件库; 二.在WebCustomControl1.cs文件中编制如下代码: using System; using System.Web.UI; using System.Web ...

  5. 在WEB自定义控件中实现自动回传功能

    在开发自定义的WEB控件时,有时我们想让自定义控件实现自动回传的功能.通常只有BUTTON这样的控件才能实现此功能.如果想实现的话,只要让我们的自定义控件实现IPostBackEventHandler ...

  6. web开发小记2:js触发css过渡

    标签: css 今天开发遇到了而一个问题,就是用原生的JavaScript实现jQuery的fadein效果. fadeIn() 方法使用淡入效果来显示被选元素,假如该元素是隐藏的 我的具体思路如下: ...

  7. java web开发小记(6)将int类型的list插入到mysql数据库

    首先要明确一点,数据库中没有直接与list对应的数据类型,因此要曲线救国,先转换成string再插入数据库 list转换为str 使用join方法 例子 a = ','.join(['abc','de ...

  8. HTML服务器控件与Web服务器控件的区别[转]

    项目 HTML服务器控件 Web服务器控件 是否映射到 HTML标签 与HTML标签存在一一对应的映射关系.runat=server属性把传统的HTML标签转换成服务器控件.这使得开发人员可以将ASP ...

  9. ZLComboBox自定义控件开发详解

    [引言]距离上一回写博客已经有一些时日了,之前的爱莲iLinkIT系列主要是讲解了如何用NodeJS来实现一个简单的"文件传送"软件,属于JavaScript中在服务器端的应用. ...

最新文章

  1. 如何面对自己不喜欢的工作?
  2. Burt’s Bees 小蜜蜂纯天然杏仁牛奶蜂蜡护手霜,56g*2罐,$13.92
  3. __try,__except,__finally,__leave异常模型机
  4. [Codevs] 1004 四子连棋
  5. 方正字体库大全(129款) 官方免费版​
  6. c语言 python rsa库_python如何调用libcrypto实现RSA解密?
  7. Base64编码及应用
  8. Kindle下载字典
  9. 【数学基础】线性方程组解情况整理
  10. 跟着Code走,详解Symbian Client/Server架构
  11. CTF-8021-题目一
  12. 从网站细节入手提高易用性
  13. xml中加html源码,XML与HTML的结合(下)_xml
  14. 520|测一测你和ta的夫妻相
  15. CISSP-AIO-快速提示内容梳理
  16. 防火墙阻止应用程序linux,win10系统下如何解除被防火墙阻止运行的应用程序
  17. 实现加减乘除任意组合的语法解析
  18. android中实现更溜的字母导航索引
  19. 培训4个月编程学什么比较好_编程,开放式硬件以及4月的更多新文章
  20. 字节跳动Web Infra发起 Modern.js 开源项目,打造现代 Web 工程体系

热门文章

  1. Android开发笔记(六十一)文件下载管理DownloadManager
  2. ekf pose使用方法 ros_【百川小课堂】第13课—ROS学习(二)
  3. 爬虫学习之-Python list 和 str 互转
  4. PIX防火墙security context配置手册(虚拟防火墙技术)
  5. 第5条:用枚举表示状态、选项、状态码
  6. [转载]多维数组与Json格式的转化
  7. HDU 3441 Rotation
  8. (2)把BlackBerry作为插件安装到已有的Eclipse中
  9. 关于不使用漫游配置文件解决方案保持登陆域后保持原来的配置文件不变
  10. html语言漂移属性,设置层的漂移_html/css_WEB-ITnose