Discuz!NT控件剖析 之 Button [原创: 附源码] 收藏

在开源之后,还没什么文章来说明 Discuz!NT项目的一些特点。作为这个控件库的设计者,本人将在接下来的时间里用连载的方式来向大家解释其中一些控件的设计思想,实现功能以及一些未曾使用过的功能展示(因为管理后台只使用控件的部分功能)。同时因为这组控件开发的周期很短(当时仅用一个半月,后不断增强功能),有不少思路和控件设计的规范相驳,但当时只考虑为后台程序开发和订制方便,因此就暂且开发成了这个样子,但本人日后会不断完善和规范这些代码:)

         为了便于大家下载和使用这组控件,本人在源代码的基本上去掉了与项目相关的一些令人费解的的代码。同时把相关的控件与具体运行实例相绑定,这只是为了让大家使用和分析方便,必定不是库中所有控件大家都愿意用或感兴趣。正所谓投其所好嘛。另外下载包中的文件所在的项目和文件位置也是与开源项目中的配置相一致的,这么搞可以方便大家按图索骥,以便于同步开源项目中的文件。
同时,本人也希望园子里同行在使用和测试这组代码时将您的意见或建议提出来,以便改进和优化代码。还有就是这些控件代码是能在.net1.0 .net2.0框架上运行。欢迎大家使用:)
好了,今天就先说一下 Button 控件。
先贴一张运行效果图让大家看一下:
开发动机:在去年10月底时,后台UI进行了一次重构,因为对.net 中的button控件和图片按钮控件感到控制不灵活(项目需要一个既有text 属性,又有img字段属性的按钮)。在看到了CS项目中所使用的按钮后,决定尝试实现与其类似的功能设计。另外因为当时设计部无法对我们直接进行支持,所以决定样式(css)直接采用cs中所使用的样式(偷个赖)。
实现功能:希望提供两种或以上的按钮样式,同时支持JS脚本注册,以及在客户端表单验证等。
    
         因为要求做出多个显示样式,所以使用枚举方式显示可能选择的样式类型,相关代码如下:
 1  properytyButtontypeMode 按钮样式#region properytyButtontypeMode 按钮样式
 2        public enum ButtonType
 3        {
 4            Normal,   //普通
 5            WithImage,  //带图
 6            XpStyle  //不带图
 7        }
 8
 9
10        public ButtonType ButtontypeMode
11        {
12            get
13            {
14                object obj = ViewState["ButtontypeMode"];
15                return obj == null ? ButtonType.WithImage : (ButtonType)obj;
16            }
17            set
18            {
19                ViewState["ButtontypeMode"] = value;
20            }
21        }
22        #endregion
23
24

    而脚本注册属性为string ,用于输入和保存相关脚本信息
      
 1  [Description("图版按钮链接"), DefaultValue("../p_w_picpaths/")]
 2        public string ScriptContent
 3        {
 4            get
 5            {
 6                object obj = ViewState["ScriptContent"];
 7                return obj == null ? "" : (string)obj;
 8            }
 9            set
10            {
11                ViewState["ScriptContent"] = value;
12            }
13        }
14
是否支持客户端表单验证的属性如下:
      
 1  定义是否调用js函数validate(this.form);进行数据校验#region 定义是否调用js函数validate(this.form);进行数据校验
 2        private bool _validateForm = false;
 3        //定义是否调用js函数validate(this.form);进行数据校验
 4        public bool ValidateForm
 5        {
 6            set
 7            {
 8                this._validateForm = value;
 9            }
10            get
11            {
12                return this._validateForm;
13            }
14        }
15        #endregion
16
有了这几个属性,就可以在控件的Render函数中使用相关的设置了
     
 1protected override void Render(HtmlTextWriter output)
 2     {
 3             //如果应用系统样式,这里只为当没有CSS文件时,则直接将样式写到控件中
 4            if (ApplyDefaultStyle)
 5            {
 6                if (this.ButtontypeMode == ButtonType.Normal)
 7                {
 8                    output.Write("<span><a href=\"javascript:void(0);\" style=\"BORDER-RIGHT: 
 9                    #999999 1px solid; PADDING-RIGHT: 10px; BACKGROUND-POSITION: 1px 1px; BORDER-TOP:
10                    #cccccc 1px solid; DISPLAY: inline-block; PADDING-LEFT: 10px; FONT-WEIGHT: bold; 
11                    
12                }
13
14                if (this.ButtontypeMode == ButtonType.WithImage)
15                {
16                    output.Write("<span><a href=\"javascript:void(0);\"  style=\"BORDER-RIGHT: #999999 1px solid;
17                    PADDING-RIGHT: 3px; BACKGROUND-POSITION: 1px 1px; BORDER-TOP: #cccccc 1px solid; 
18                    DISPLAY: inline-block; PADDING-LEFT: 22px; FONT-WEIGHT: bold; FONT-SIZE: 12px; 
19                    PADDING-BOTTOM: 3px; MARGIN: 1px; BORDER-LEFT: #cccccc 1px solid; CURSOR: pointer; 
20                    
21                }
22
23                if (this.ButtontypeMode == ButtonType.XpStyle)
24                {
25                    output.Write("<span style=\"BACKGROUND-POSITION: left top; DISPLAY: inline-block;
26                    display: -moz-inline-box; PADDING-LEFT: 4px; FONT-WEIGHT: bold; FONT-SIZE: 12px; 
27                    BACKGROUND-IMAGE: url(" + this.XpBGImgFilePath + "/xpbuttonbg_l.gif); 
28                    
29                }
30            }
31            
32
33            //表单验证属性判断,(注:要在web页面上FORM的submit中加入该函数,并进行相关声明
34            //即可,参见webtest页面)
35              if (ValidateForm)
36                {
37                    sb.Append("if(validate(this.form)){");
38                    //当验证通过后则执行向服务器提交内容的JS代码
39              sb.Append(Page.GetPostBackEventReference(this,"") + ";}"); 
40            
41
42            //用户希望进行注册的JS代码,这块代码可放在表单验证属性判断之前。
43            if (ScriptContent != "")
44            {
45                sb.Append(ScriptContent);
46            }
47
48            //将上来的设置写入到客户端的onlick事件中。
49            output.WriteAttribute("onclick", sb.ToString());
50     }
51
52
53
54
现在可以说从服务器端设置到客户端脚本生成基本上都开发完了。
接下来是做服务器端事件的绑定处理,
      
 1  protected static readonly object EventClick = new object();
 2
 3          public event EventHandler Click
 4           {
 5            add
 6            {
 7                Events.AddHandler(EventClick, value);
 8            }
 9            remove
10            {
11                Events.RemoveHandler(EventClick, value);
12            }
13        }
14
15        protected virtual void OnClick(EventArgs e)
16        {
17            EventHandler clickHandler = (EventHandler)Events[EventClick];
18            if (clickHandler != null)
19            {
20                clickHandler(this, e);
21            }
22        }
23
24
25        public void RaisePostBackEvent(string eventArgument)
26        {
27            OnClick(new EventArgs());
28        }
29
30
31        void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
32        {
33            this.RaisePostBackEvent(eventArgument);
34        }
35
36

          这样就完成了这个控件的主干部分,而其它的一些属性,如图片路径之类的代码大家可参见一下源码,这里就不多做说明了。
未来实现的功能,应该说主要还是在UI表现上,希望能让用户的接受起来更快,色调也更加柔和等等......

转载于:https://blog.51cto.com/daizhj/230126

Discuz!NT控件剖析 之 Button [原创: 附源码]相关推荐

  1. Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]

    自从 9月未开始写关于"ICONIX方法"的系列文章以来,到今天已有两个多月了,当初因为兴趣点的转移才划一 段落的Discuz!NT 系列文章,从今天开始又要开始续写了.这写这个系 ...

  2. asp.net服务器端对话框控件的简单实现(附源码)

    最近项目要用到一个对话框控件,正好自己从前写了一个,拿了出来,看着自己从前写的东西,唏嘘不已. 下面是一个精简版的源代码,release在这里,谁喜欢,自己编译成dll吧. http://files. ...

  3. 【Kivy自学笔记】Python开发App必备!Kivy基础控件详解(含视频源码)

    文章目录 基础控件 窗口坐标系 尺寸(通用) 位置(通用) Python与kv文件如何实现互相访问(Kivy中的特殊关键字) Button 按钮 Label 标签 Image 图片 TextInput ...

  4. 【办公-Word-VB】Word中VB控制ActiveX控件转换人民币大写并填充-源码带完整注释

    2019.03.15更新:已经将个人做好的完整docm 代码附在文后,先上图. 记录几个开发过程中遇到的难点和注意点. Word中添加ActiveX控件,如输入框,需要放置在  文本框 中,或者放置在 ...

  5. Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一.单点触摸 dispatchTouchEvent onInterceptTouchEvent onTouchEvent三个方法的输入参数都是手势 ...

  6. PHP疫情防控隔离酒店管理系统-计算机毕设 附源码96326

    PHP隔离酒店管理系统 摘  要 随着科学技术的飞速发展,社会的方方面面.各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,隔离酒店当然也不例外.隔离酒店管理系统是以实际运用为开发背 ...

  7. android如何创建进度条,Android控件ProgressBar--自定义进度条及源码分析

    这里用SeekBar做演示,SeekBar继承自ProgressBar,拥有其一切特性,并且其支持拖动以及DPAD左右键的进退.一起学习吧! 一.自定义SeekBar进度条样式 原生SeekBar效果 ...

  8. Springboot疫情防控学生自助申报系统 毕业设计-附源码260839

    springboot疫情防控学生自助申报系统 摘  要 随着社会的发展,社会的各行各业都在利用信息化时代的优势.计算机的优势和普及使得各种信息系统的开发成为必需. 自从2020年新冠疫情爆发以来,防疫 ...

  9. opic4:Qt入门之常用qt控件认知之Button系列

    opic4:Qt入门之常用qt控件认知之Button系列 2013-06-27 18:21:54 标签:QAbstractButton QPushButton QRadioButton 原创作品,允许 ...

最新文章

  1. Python求解最速降线问题
  2. 为什么大多数IP地址通常以192.168开头?
  3. 行业「趋轻」,尚美“共创品牌”推动酒店业进入春天
  4. 《机器学习》 周志华学习笔记第五章 神经网络(课后习题) python实现
  5. linux账号前有个base,安装 aconda 后Linux的终端界面前部出现(base)字样
  6. JavaWeb学习过程 之c3p0的使用
  7. Web框架——Flask系列之蓝图Blueprint(二十一)
  8. 纷享销客完成新一轮数亿元融资,持续领跑中国CRM产业发展
  9. syslog发送日志而docker容器接收不到的问题
  10. 编译pluma: pluma/Makefile.am:192: error: HAVE_INTROSPECTION does not appear in AM_CONDITIONAL
  11. 初等模型---交通流和道路通行能力
  12. 如何防御DOS和DDOS攻击
  13. 梅宫主:穷人的命富人的命
  14. 在PlatEMO v2.9中增加多模态多目标算法(1)
  15. 通识,修 还是不修?——多选一门通识课对绩点影响几何?
  16. 严格模式、混杂模式与怪异模式
  17. gps和惯性组合matlab程序,北航卡尔曼滤波与组合导航 第三次作业 SINS/GPS组合动态实验...
  18. Nest.js 怎样使用 hbs 的 partials?
  19. RESTClient 使用教程
  20. STK的CZML Exporter插件

热门文章

  1. geometry java_java程序操作Geometry对象(示例代码)
  2. 喜讯丨神策数据四大客户案例斩获大数据“星河”案例
  3. 精华自取:神策 2019 数据驱动大会亮点回顾
  4. 亲和属性和链路管理组的TE隧道路径控制原理
  5. java 网站源码 四套模版 兼容手机平板PC 在线编辑模版 freemaker 静态引擎
  6. Node.js Promise.all 限制并发数量
  7. change to port 80 instead of 8069
  8. php和mvc的认识
  9. 转)微软Olap服务MDX函数应用举例
  10. finite state machine drawer online