ASP.NET控件开发基础5

 上一篇简单的讲了从WebControl继承的控件(好象我讲的都是简单的,嘿嘿).本次讲的更简单,主题是是属性,只当分享经验,希望对大家有帮助

我们根据属性的不同表现形式,把其区分为简单属性和复杂属性

下面来看下属性的表现形式

简单属性表现形式如下,大家都很熟悉

<asp:TextBox ID="TextBox1" Text="textbox控件" runat="server"></asp:TextBox>


属性中含有子属性,称之为复杂对象,如Font属性
复杂属性的表现形式如下,

(1)连字符的表现形式

<asp:TextBox ID="TextBox1" Text="textbox控件" runat="server" Font-Bold="True"></asp:TextBox>


(2)内镶属性的表现形式,如定义样式

<asp:DataList ID="DataList1" runat="server">
            
<SelectedItemStyle />
            
<EditItemStyle />
        
</asp:DataList>


(3)内镶集合属性的表现形式,如DropDownList (先不介绍,大家可看MSDN)

<asp:DropDownList ID="DropDownList1" runat="server">
            
<asp:ListItem>x</asp:ListItem>
            
<asp:ListItem>xx</asp:ListItem>
            
<asp:ListItem>xxx</asp:ListItem>
        
</asp:DropDownList>


下面得好好看

1,复杂属性基本使用方法

请看我是怎么做的,关于下面看到了一些元数据,如果你不熟悉,请参考MSDN.

下面一段代码记录一个custom的信息.

1.1 定义枚举

using System;

namespace CustomComponents
{
    
/**//// <summary>
    
/// 职业
    
/// </summary> 

    public enum Metier
    
{
        教师,程序员,作家
    }

}



1.2定义复杂属性

using System;
using System.ComponentModel;

namespace CustomComponents
{


    
/**//// <summary>
    
/// 地址集合
    
/// </summary>

    public class Address
    
{
        
private String street = null;
        
private String city = null;
        
private String state = null;
        
private String zip = null;

        
public String Street
        
{
            
get
            
{
                
return street;
            }

            
set
            
{
                street 
= value;
            }

        }



        
public String City
        
{
            
get
            
{
                
return city;
            }

            
set
            
{
                city 
= value;
            }

        }


        
public String State
        
{
            
get
            
{
                
return state;
            }

            
set
            
{
                state 
= value;
            }

        }


        
public String Zip
        
{
            
get
            
{
                
return zip;
            }

            
set
            
{
                zip 
= value;
            }

        }

    }

}




1.3 呈现控件


using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;

namespace CustomComponents
{
    
public class Custom: Control
    
{
        
private String name = null;
        Address address 
= new Address();
        
private Metier metier;
        
private int age = 0;

        
属性#region 属性
        [Description(
"年龄")]
        
public int Age
        
{
            
get
            
{
                
return age;
            }

            
set
            
{
                age 
= value;
            }

        }


        [Description(
"姓名")]
        
public String Name
        
{
            
get
            
{
                
return name;
            }

            
set
            
{
                name 
= value;
            }

        }


        [Description(
"职业")]
        
public Metier CustomMetier
        
{
            
get
            
{
                
return metier;
            }

            
set
            
{
                metier 
= value;
            }

        }

        [Description(
"地址集合")]
        
public Address CustomAddress
        
{
            
get
            
{
                
return address;
            }

        }


        
#endregion


        
protected override void Render(HtmlTextWriter output)
        
{
            output.Write(
"姓名: " + Name + "<br>");
            output.Write(
"年龄: " + Age + "<br>");
            output.Write(
"职业: " + CustomMetier + "<br>");
            output.Write(
"具体地址: " + CustomAddress.Street + "<br> 城市: "
                
+ CustomAddress.City + "<br> 国籍: " +
               CustomAddress.State 
+ "<br> 邮编: " + CustomAddress.Zip + "<br>");
        }

    }

}



1.4 在asp.net页面定义控件,

发现问题:
属性不是有效属性,如下图



打开后台代码,输入如下代码检查属性,发现属性是存在的,如下图,再打开视图,发现控件能显示属性,唯一的就是不能认识属性为有效属性,在源视图也无法找到这几个属性.



1.5 解决1.4无法显示有效属性的问题,(其实以上的测试已经实现复杂属性了).

  解决方法:请在Custom类中的CustomAddress中加入一个元数据(元数据的解释请参考MSDN),如下

        [Description("地址集合")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        
public Address CustomAddress
        
{
            
get
            
{
                
return address;
            }

        }


再次打开源视图,发现编辑器已经支持此属性了,如下图,这样有点意思吧,呵呵



虽然源视图上已经支持这个复杂属性了,打开属性面板,发现属性面板并不支持这个复杂属性(因为我们比较懒,不喜欢在源视图里编辑属性,想直接在属性面板编辑属性,下面就称复杂属性是CustomAddress),我们想要达到的效果,是让CustomAddress属性跟Font属性一样(可以折叠)显示在面板上,如下图



发现问题:属性面板并不支持这个复杂属性

1.6 实现CustomAddress属性折叠效果

解决方法:
给Address类添加一个元数据,如下

[TypeConverter(typeof(ExpandableObjectConverter))]
    
public class Address
    
{. }


编译后,再次打开属性面板,发现CustomAddress属性已经支持折叠效果,如下图



试着在属性面板编辑CustomAddress的子属性,修改好子属性以后然后运行页面,发现子属性修改数据后无效

发现问题:在属性面板编辑复杂属性的子属性无效

1.7 解决属性面板编辑复杂属性的子属性无效的问题

解决方法:
为Address类的每个属性加上一个元数据,如下

        [NotifyParentProperty(true)]
        public String Street
        {
            
get
            {
                
return street;
            }

            
set
            
{
                street 
= value;
            }

        }


编译后,回到原asp.net的页面,再次在属性面板里修改子属性,再次运行页面.发现修改后的数据生效了.

好了,以上代码就是连字符形式的复杂属性的实现,我们接着继续,我们希望把CustomAddress属性做为内镶属性使用,即如下代码的形式

        <custom:custom id="Custom1" runat="server" name="Clingingboy" CustomMetier="教师" Age="21">
         
<CustomAddress City="杭州" Street="不告诉你" State="中国" Zip="310000" />
         
</custom:custom>


发现问题:无法使用内镶属性

1.8 实现内镶属性

解决方法:在Custom类中给CustomAddress再加入一个元数据(第三个),如下

        [Description("地址集合")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        [PersistenceMode(PersistenceMode.InnerProperty)]
        public Address CustomAddress
        {
            
get
            {
                
return address;
            }

        }


打开源视图(请不要把原来的连字符属性去掉),在控件内部加入如下代码(编辑器已经支持此属性了)

        <custom:custom    
        CustomAddress
-Zip="3100001"  CustomAddress-City="杭州1" 
        CustomAddress
-State="中国1" CustomAddress-Street="不告诉你1"
         id
="Custom1" runat="server" name="Clingingboy" CustomMetier="教师" Age="21">
         
<CustomAddress City="杭州" Street="不告诉你" State="中国" Zip="310000" />
         
</custom:custom>


发现问题:查看属性面板,再次修改CustomAddress子属性,然后运行,发现修改后无效果,而且显示的数据仍然是连字符属性的数据(非内镶属性的)

1.9 让控件支持内镶属性

解决方法:
给Custom类添加元数据,如下代码

    [ParseChildren(true)]
    
public class Custom: Control
    
 }


编译后,再次测试发现属性显示的优先级发生了变化,在内镶属性存在的时候,显示内镶属性,若其中有子属性不存在,则显示连字符属性,大家可以适当更改内镶属性和连字符属性测试变化.

发现问题:在属性面板改变属性时,仍然无法使修改后的数据生效,且修改后,数据退回初始的数据,并且导致内镶属性消失

1.10 解决属性面板的问题

解决方法:
给Custom类再添加一个元数据,如下代码

    [ParseChildren(true)]
    [PersistChildren(
false)]
    
public class Custom: Control
    
 }


编译后再次修改属性面板的值,发现修改的是内镶属性的数据,而且这次修改后数据没有丢失,运行后也是修改后的效果.

好了,简单的讲完了.

总结下:上面刚开始到1.3为止,其实效果已经实现了,接下来都是添加元数据,添加以后给我们带来的是方便.以上解决问题的办法全是套用元数据.可能上面的元数据大家很熟悉,在MSDN里面字面解释的也很清楚,但你去试验过吗?我相信这样的试验可以让你明白的更加深刻.

这次讲的虽然很简单(难得我把这么简单的东西变的这么复杂),主要是学习学习方法了
但我还是希望对大家有帮助,上面如果哪里讲错了还请指出来^_^.

示例代码下载(请大家多修改):


参考文章:

ASP.NET 2.0服务器控件开发之简单属性

ASP.NET 2.0服务器控件开发之复杂属性 

转载于:https://www.cnblogs.com/mcsm/articles/1893512.html

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

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

相关文章

项目Alpha冲刺Day4

一、会议照片 二、项目进展 1.今日安排 学习熟悉前台框架且搭建前台页面框架。 2.问题困难 使用了前端的构建工具webpack&#xff0c;困难在于怎么使用gradle结合它连同后台框架中的配置一起打包&#xff0c;因为本身都才刚接触这两者。本来希望每个人下好项目能配置尽量少的东…

log4j:ERROR Could not find value for key log4j.appender.stdout.layout

Connected to the target VM, address: 127.0.0.1:65401, transport: socket log4j:ERROR Could not find value for key log4j.appender.stdout.layout 此log4j:ERROR Could not find value for key log4j.appender.XXXX类型报错与log4j.properties文件写法有关系 处理方法&a…

第十二周学习笔记

先检查有没有对应类型的接口&#xff0c;没有必须先到网上下载&#xff0c;重新开启SQL SEVER即可 64位以上的系统必须用 Microsoft Ace Oledb 12.0 版本的 要选对数据库 没有查询到表格的可以建立表格 用INSERT INTO 语句可以插入数据 ----------删除 删除格式代码&#xff0c…

TechEd2010

微软&#xff08;中国&#xff09;TechEd2010今天在北京国家会议中心开幕了&#xff0c;还是和去年一样&#xff0c;场面做的很大。今年的主题是云&#xff0c;Windows Phone 7&#xff0c;和IE9。 会上&#xff0c;也见了非常多的朋友&#xff0c;有微软的老朋友&#xff0c;也…

错误: 找不到或无法加载主程序类 错误: 找不到或无法加载主类 wc.BatchWordCount

错误描述 编写完代码以后运行main方法&#xff0c;出现错误: 找不到或无法加载主类 错误: 找不到或无法加载主类 wc.BatchWordCount 解决办法 1、点击IDEA侧边的maven栏目&#xff0c;点击compile进行编译 2:显示BUILD SUCCESS表示编译成功 3、再次运行main方法&#xff0…

BZOJ 4808: 马(二分图最大点独立集)

http://www.lydsy.com/JudgeOnline/problem.php?id4808 题意&#xff1a; 思路&#xff1a; 这图中的两个马只能选一个&#xff0c;二选一&#xff0c;很像二分图吧&#xff0c;对能互吃的两个棋子连线&#xff0c;在所选的任意两个棋子中&#xff0c;都不能互相有连线&#x…

使用Flink批处理实现WordCount

Flink作为一个非常优秀的大数据实时计算框架&#xff0c;在很多从事大数据开发的公司都是必备的技能&#xff0c;接下来我将通过Flink以批处理来实现入门案例WordCount 1:步骤一 idea新建设maven项目&#xff0c;并且自己配置好maven环境 2&#xff1a;步骤二 在pom文件中加…

Application.DoEvents

记得第一次使用Application.DoEvents()是为了在加载大量数据时能够有一个数据加载的提示&#xff0c;不至于系统出现假死的现象&#xff0c;当时也没有深入的去研究他的原理是怎样的&#xff0c;结果在很多地方都用上了Application.DoEvents()&#xff0c;今天看到了关于这方面…

Servlet交互【重定向 与 请求分派】详解

Servlet交互 在serlvet中&#xff0c;需要调用另外一个资源来对浏览器的请求进行响应&#xff0c;两种方式实现&#xff1a; 调用HttpServletResponse.sendRedirect 方法实现 重定向 调用RequestDispatcher.forward 方法来实现请求分派 &#xff08;转发&#xff09; 1.reponse…

解决Error: No such file or directory @ rb_sysopen

mac使用brew安装flink时出现报错&#xff0c;是下载openjdk11报错的 原因是openjdk11依赖包下载不成功&#xff0c;使用brew单独下载该依赖包即可 brew install openjdk11

Mac Brew install 报错Command failed with exit 128:git

问题&#xff1a; 记录一个问题&#xff0c;Mac使用Brew安装Flink报错 具体如图所示&#xff0c;执行brew install apache-flink Error: Command failed with exit 128: git 解决方式&#xff1a; 输入brew -v后会提示你执行两个配置命令&#xff0c;直接复制执行就ok了&am…

Mac上安装flink笔记

1&#xff1a;步骤一 首先要有破jdk1.8&#xff0c;查看命令&#xff1a;java -version 2:步骤二 使用brew安装flink&#xff0c;命令如下&#xff1a; brew install apache-flink 3:步骤三 我这边安装的时候报错了&#xff0c;解决方式如下 报错1 解决方式 https://blog.…

工作笔记一——杂项

近期做的项目中遇到一些棘手的问题&#xff0c;解决的过程用到很多知识&#xff0c;在此记下主要的问题与解决方法。 页面功能介绍&#xff1a;获取五张表格的大量数据&#xff08;大概有几千条记录&#xff09;&#xff0c;然后到前台显示在table里面&#xff0c;实现行列汇总…

Coolite 中GridView行按钮取行ID并调用服务器端代码

效果图&#xff1a; 关系代码&#xff1a; <Command Handler"if(commandbutSelectReocrd){strrecord.data.SessionId; #{AjaxMethods}.SelectRecord(str);}" /> 全部html代码&#xff1a; 代码 <ext:GridPanel ID"GridPanel1"Height"325&quo…

Flink的三种执行模式STREAMING和BATCH和AUTOMATIC

执行模式 执行模式三种 BATCH模式的两种配置方法 什么时候选择BATCH模式

RabbitMQ基础概念详细介绍

转至&#xff1a;http://www.ostest.cn/archives/497 引言 你是否遇到过两个&#xff08;多个&#xff09;系统间需要通过定时任务来同步某些数据&#xff1f;你是否在为异构系统的不同进程间相互调用、通讯的问题而苦恼、挣扎&#xff1f;如果是&#xff0c;那么恭喜你&#x…

信号与系统(中)

第四章 线性时不变系统的时域分析 4.1连续时间系统的时域分析 微分方程的求解 齐次解特解完全解起始状态到初始状态的转换 冲激平衡法连续时间系统的零输入响应与零状态响应 双零法4.2离散时间系统的时域分析 迭代法时域经典法双零法差分方程的求解 齐次解特解完全解离散时间系…