web控件开发系列(四) 自定义控件属性(下)

控件在WEB开发时经常要用到,虽然有部分已经存在工具箱里,但有时总需要根据自己的要求,开发一些合适自己的控件。接上一节,已经说过了控件的属性, 例如,我们需要一组属性的集合时,这时我们需要用到的就是复杂属性了,简单的属性满足不了我们的要求,例如:大家熟悉的字体信息设置那栏。下面为大家介绍一下实现的几种代码与注意细节

一、连字符形式的复杂属性标记
<asp:Button ID="Button1" runat="server" Font-Bold="True" Font-Italic="True" Font-Names="Arial" Font-Overline="True" Font-Size="20pt" Text="Button" />
例如上面就是一个Font的复杂属性,通过这个属性可以设置一系列相关的值。
在ServerControl中添加一个类ComplexAttribute,然后输入下面代码:

ContractedBlock.gifExpandedBlockStart.gifCode
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;


namespace ServerControl
{
    [DefaultProperty(
"Text")]
    [ToolboxData(
"<{0}:ComplexAttribute runat=server></{0}:ComplexAttribute>")]
    
public class ComplexAttribute: WebControl 
    {
        
private Student _student;

        
public ComplexAttribute()
        {
            _student 
= new Student();
        }        

        [Description(
"Student属性")]
        [Category(
"Student属性")]
        [PersistenceMode(PersistenceMode.Attribute)]   
//指定如何将服务器控件属性或事件保持到ASP.NET页面的元数据属性
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]  //指定属性是否以及如何在代码中序列化
        [TypeConverter(typeof(ExpandableObjectConverter))]  //指定用作此特性所绑定到的对象的转换器的类型
        [NotifyParentProperty(true)]
        
public Student Student
        {
            
get 
            {
                
if (_student == null)
                {
                    _student 
= new Student();
                }
                
return _student;
            }
        }

        
/// <summary>
        
/// 输出控件
        
/// </summary>
        
/// <param name="writer"></param>
        protected override void Render(HtmlTextWriter writer)
        {
            writer.Write(
"姓名:");
            writer.Write(_student.Name);
            writer.WriteBreak();
            writer.Write(
"年龄:");
            writer.Write(_student.Age.ToString());
            writer.WriteBreak();
            writer.Write(
"分数:");
            writer.Write(_student.Cost.ToString());
            writer.WriteBreak();
        }

    }

    
/// <summary>
    
/// 密封类,封装文本的字体属性。无法继承此类。
    
/// </summary>
    public sealed class Student
    {
        
private string _Name = "Name";
        
private int _Age = 0;
        
private int _Cost = 0;
        [NotifyParentProperty(
true)]   //这个是为了实现在属性窗口中更新属性值时将通知其父属性,不然修改了属性窗口的值,但不通知你属性,等于没修改
        public string Name
        {
            
get { return _Name; }
            
set { _Name = value; }
        }
        [NotifyParentProperty(
true)]
        
public int Age 
        {
            
get { return _Age; }
            
set { _Age = value; }
        }
        [NotifyParentProperty(
true)]
        
public int Cost 
        {
            
get { return _Cost; }
            
set { _Cost = value; }
        }
    }
}

注意细节,不然你会感觉到很多地方不明白:
1、Student类,在设计时最好封装起来,添加密封限制,让这个类无法继承。
2、Student类的属性添加特性[NotifyParentProperty(true)]
3、构造函数ComplexAttribute时初始化Student类,不然设计器中你的控件会出现未引用对象的错误提示。
4、ComplexAttribute类的属性添加特性[PersistenceMode(PersistenceMode.Attribute)]   //指定如何将服务器控件属性或事件保持到ASP.NET页面的元数据属性
5、ComplexAttribute类的属性添加特性[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]  //指定属性是否以及如何在代码中序列化
6、ComplexAttribute类的属性添加特性[TypeConverter(typeof(ExpandableObjectConverter))]  //指定用作此特性所绑定到的对象的转换器的类型
7、ComplexAttribute类的属性添加特性[NotifyParentProperty(true)]

PersistenceMode详解:
指定如何将服务器控件属性或事件保持到ASP.NET页面的元数据属性,共存在4种枚举设置方式:
1、PersistenceMode(PersistenceMode.Attribute)指定属性或事件保持为属性;
2、PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty)指定属性作为服务器控件的唯一内部文本,如果属性值是HTML编码的,只能对字符串作这种指定;
3、PersistenceMode(PersistenceMode.InnerDefaultProperty)指定属性在服务器控件中保持为内部文本,还指示将该属性定义为元素的默认属性,只能指定一个属性为默认属性;
4、PersistenceMode(PersistenceMode.InnerProperty)指定属性在服务器控件中保持为嵌套标记,通常用于复杂对象,它们具有自己的持久性属性。
DesignerSerializationVisibility详解:
指定属性是否以及如何在代码中序列化,其值为DesignerSerializationVisibility的枚举值,存在3种设置方式:
1、DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)指定序列化程序不应该序列化属性值;
2、DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)指定应该允许序列化程序序列化属性的值;
3、DesignerSerializationVisibility(DesignerSerializationVisibility.Content)指定序列化程序应该序列化属性的内容,而不是属性本身。此字段为只读。Visible为其默认值。

编译,在页面上拖进控件,再看一下属性窗口,你自己定义的属性就在里面了,如下图:


设置Student属性,到页面代码视图,就会出现下面的代码:
 <cc1:ComplexAttribute ID="ComplexAttribute1" runat="server" Student-Age="10" Student-Cost="95" Student-Name="ASP.NET" />

二、内部嵌套复杂属性标记

<asp:GridView ID="GridView1" runat="server">
    <RowStyle BackColor="#EFF3FB" />
</asp:GridView>
例如上面的代码,BackColor属性RowStyle是内部嵌套。
在ServerControl中添加一个类InRowAttribute然后输入下面代码:

ContractedBlock.gifExpandedBlockStart.gifCode
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace ServerControl
{
    [DefaultProperty(
"Text")]
    [ToolboxData(
"<{0}:InRowAttribute runat=server></{0}:InRowAttribute>")]
    [ParseChildren(
true), PersistChildren(false)]
    
public class InRowAttribute : CompositeControl
    {
        
private Style _Style;

        
public InRowAttribute()
        {
            _Style 
= new Style();
        }

        [PersistenceMode(PersistenceMode.InnerProperty)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        [NotifyParentProperty(
true)]
        [Category(
"复杂属性")]
        [Description(
"复杂属性——内部嵌套形式")]
        
public Style BackColorStyle
        {
            
get
            {
                
if (_Style == null)
                {
                    _Style 
= new Style();
                }
                
return _Style;
            }
        }

        
/// <summary>
        
/// 输出控件
        
/// </summary>
        
/// <param name="writer"></param>
        protected override void Render(HtmlTextWriter writer)
        {
            writer.Write(_Style.BackColor.ToString());
        }

    }

    [TypeConverter(
typeof(ExpandableObjectConverter))]  
    
public class Style
    {
        
private Color _BackColor;

        [NotifyParentProperty(
true)]
        
public Color BackColor
        {
            
get { return _BackColor; }
            
set { _BackColor = value; }
        }

    }
}

编译后在设计器中拖进这个控件,在属性窗口设置值,在代码视图中可以看到下面的代码
<cc1:InRowAttribute ID="InRowAttribute1" runat="server">
    <BackColorStyle BackColor="ActiveBorder"></BackColorStyle>
</cc1:InRowAttribute>

属性定定义方面还有好多类型,例如我们常用的ListItem组合, CheckBox组合, 或自己需要时定义的边框线条,边框大小,颜色等等,这些都是大家在开发中慢慢摸索(举一反百)吧,如果大家有好的控件,不防也与我分享一下。

转载于:https://www.cnblogs.com/whtydn/archive/2009/09/15/1566818.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

23设计模式学习

1.什么设计模式 1.1模式是解决相似问题的核心1.2设计模式软件设计过程中解决一类问题的方案总结来说&#xff1a;设计模式 &#xff1a;软件设计过程中解决一类问题的一种方案&#xff1b; 2.什么是面向对象的设计模式 面向对象设计模式描述了面向对象设计过程中、特定场景下…

移植u-boot-2012.04.01到jz2440开发板

今天我给大家分享一下如何移植一个纯净的uboot到jz2440开发大版&#xff0c;通过记录学习分享&#xff0c;与大家一起进步&#xff01;&#xff01;&#xff01; 1.首先我们在uboot官网下载u-boot-2012.04.01.tar.bz2&#xff0c;建立source insight工程。将下载好的uboot通过…

温习了一下java线程状态方面的知识总结一

好长时间没有复习线程状态这块&#xff0c;读并发编程实战正好看着这块&#xff0c;顺便复习一下&#xff1a; 1.线程的五种状态&#xff1a; 2.线程五种状态的转换图&#xff1a; wait()会立刻释放synchronized(obj)中的锁以便其它线程可以执行obj.notify 但是notify() 不会立…

WinForm:进度条的实现(异步)

在WinForm中经常遇到一些费时的操作界面&#xff0c;比如统计某个磁盘分区的文件夹或者文件数目&#xff0c;如果分区很大或者文件过多的话&#xff0c;处理不好就会造成“假死”的情况&#xff0c;或者报“线程间操作无效”的异常&#xff0c;为了解决这个问题&#xff0c;可以…

移植u-boot-2012.04.01到jz2440开发板之修改代码支持NAND启动

上一篇文章我们已经修改了uboot源码使其能够正常打印输出了&#xff0c;但是输出停到了nand启动那里&#xff0c;所以这篇文章就来记录如何修改源码使uboot支持NAND启动。 原来的代码在链接时加了”-pie”选项, 使得u-boot.bin里多了”(.rel)”, “*(.dynsym)”使得程序非常大…

【C++深度剖析教程4】C++的二阶构造模式

今天学习的是C中的二阶构造模式&#xff0c;二阶构造模式只是设计模式中的简单的模式&#xff0c;是一种软件设计的方法&#xff0c;并没有我们想象的那么高深&#xff0c;设计模式也是一样&#xff0c;只不过是一系列的设计方法&#xff0c;只要我们懂得了原理&#xff0c;那么…

【C++深度剖析教程5】C++中类的静态成员函数

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff08;已满&#xff09;&#xff1a; 780902027学习交流资源…

eclipse 工程中使用引入maven项目遇到maven-resources-plugin:2.6 找不到

1.开始eclipse 配置本地库 首先是从maven 官网下载maven 组件 其次是配置 maven 环境和java 配置jdk 类似这里就不做介绍了 配置完环境后修改\apache-maven-3.3.9\conf\settings.xml 中的<localRepository> 设置本地仓库 然后配置eclipse 下面图中执行较为重要&#xff…

移植uboot之修改代码支持NorFlash记录

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天我们的任务是修改uboot源码支持NorFlash。 上两篇关于uboot移植的文章&#xff0c;我们修改了uboot源代码&#xff0c;支持了串口的输出&#xff…

移植uboot之修改代码支持NorFlash记录续集

接着上一篇文章写的内容&#xff08;上一篇文章链接&#xff1a;移植uboot之修改代码支持NORFLASH&#xff09;&#xff0c;上一篇结尾测试flash的擦除读写功能&#xff0c;结果无法写flash&#xff0c;卡在了这里&#xff1a; 前面已经擦除成功&#xff0c;这里写内容写不进…

C#开发终端式短信的原理和方法

本文示例源代码或素材下载 简介 没发过短信的年轻人肯定是属于那种受保护的稀有动物&#xff0c;通讯发达的今天短信已经成为人们交流的重要手段&#xff0c;其中也蕴含着巨大的市场和经济利益&#xff0c;掌握短信技术的人才也受到各大公司的追捧是目前职场上耀眼的明星。本文…

移植uboot之修改代码支持NorFlash记录续集二

先说一个事&#xff1a;我会在最后把移植好的uboot&#xff0c;内核&#xff0c;分别做一个补丁文件&#xff0c;以后如果用到相同的uboot以及内核都可以直接下载我这个补丁进行打补丁操作就可以直接用~ 上一个移植uboot续集&#xff0c;我们解决了无法写flash的问题&#xff…

Mysql function(函数)

1.mysql 拼接函数 1. 1CONCAT(string1,string2,…) 说明 : string1,string2代表字符串,concat函数在连接字符串的时候&#xff0c;只要其中一个是NULL,那么将返回NULL 1.2 CONCAT_WS(separator,str1,str2,...)说明 : string1,string2代表字符串,concat_ws 代表 conca…

【C++深度剖析教程6】C++之友元

这几天在复习数学考试&#xff0c;都没有学C&#xff0c;今天抽空来学一点。 什么是友元&#xff1f; 友元是C中的一种关系友元发生在函数与类之间或者类与类之间友元关系是单向的&#xff0c;不能传递 在具体讲解友元的性质之前&#xff0c;我们先来看看一个程序&#xff…

call stack and stack buffer overflow

http://en.wikipedia.org/wiki/Call_stack http://en.wikipedia.org/wiki/Stack_buffer_overflow Stack_buffer_overflow里提到的frame pointer 的位置不一样&#xff0c;不同的系统实现应该是不一样的。 运行时的栈是从高地址向低地址分配的&#xff0c;堆是从低地址向高地址…

【C++深度剖析教程8】C++的操作符重载的概念

之前学习了类的函数重载的概念&#xff0c;今天学习操作符重载的概念。在这之前我们先看一个例子&#xff1a; 上面是一个复数的加法&#xff0c;a为复数的实部&#xff0c;b为复数的虚部&#xff0c;在main函数里我想实现复数c1与c2的加法。很显然&#xff0c;正常的号操作符…

大数据开发者应该知道的分布式系统 CAP 理论

无论你是一个系统架构师&#xff0c;还是一个普通开发&#xff0c;当你开发或者设计一个分布式系统的时候&#xff0c;CAP理论是无论如何也绕不过去的。本文就来介绍一下到底什么是CAP理论&#xff0c;如何证明CAP理论&#xff0c;以及CAP的权衡问题。 CAP理论概述 CAP理论&a…

设计模式记--Observer Pattern观察者模式

观察者模式——定义了对象之间的一对多依赖&#xff0c;这样一来&#xff0c;当一个对像改变状态时&#xff0c;它的所有依赖者都会收到通知并自动更新. 从定义可以看出,OBSERVER(观察者)模式逻辑上需要两组对象来实现.首先它必需要有发布者(Publish),也可称为被观察的目标 (…

【C++深度剖析教程9】初探C++标准库

在这之前&#xff0c;我写的C程序不能叫做标准的C程序&#xff0c;因为里面写的大多数还带有C语言的影子。今天我们来学习C标准库。 首先看一下例子&#xff1a;操作符<<的原生意义是按位左移。那么我们重载这个操作符&#xff0c;将变量或者常量&#xff0c;左移到一个…