惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Latest news
Latest news
T
Troy Hunt's Blog
V
Vulnerabilities – Threatpost
L
LINUX DO - 热门话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
V
V2EX
博客园 - 司徒正美
B
Blog RSS Feed
AWS News Blog
AWS News Blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
Cisco Talos Blog
Cisco Talos Blog
Last Week in AI
Last Week in AI
NISL@THU
NISL@THU
博客园 - Franky
P
Proofpoint News Feed
博客园_首页
C
CERT Recently Published Vulnerability Notes
雷峰网
雷峰网
S
Schneier on Security
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
G
GRAHAM CLULEY
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
WordPress大学
WordPress大学
The Hacker News
The Hacker News
T
Threatpost
阮一峰的网络日志
阮一峰的网络日志
A
Arctic Wolf
Microsoft Azure Blog
Microsoft Azure Blog
T
The Exploit Database - CXSecurity.com
Engineering at Meta
Engineering at Meta
罗磊的独立博客
T
The Blog of Author Tim Ferriss
D
Darknet – Hacking Tools, Hacker News & Cyber Security
I
Intezer
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
K
Kaspersky official blog
SecWiki News
SecWiki News
云风的 BLOG
云风的 BLOG
美团技术团队
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Security Latest
Security Latest
C
Cyber Attacks, Cyber Crime and Cyber Security
B
Blog
S
Security Affairs

博客园 - xiaolei1982

asp.net的ajax的实现 spring:bean生命周期(转贴) 在myeclipse下整合spring和hibernate(转贴) Struts+Spring+Hibernate练习(转贴) spring:bean注入(转贴) - xiaolei1982 - 博客园 解析eclipse下生成Hibernate DAO中的几个方法(转贴) ASP.NET ViewState 实现分析(转贴) 自定义控件源码(转贴) ASP.NET服务器控件的开发(4)(转贴) ASP.NET服务器控件的开发(3)(转贴) ASP.NET服务器控件的开发(1)(转贴) Web 页本是无状态而断续的(转贴) asp.net控件开发基础(3)(转贴) asp.net控件开发基础(6)(转贴) asp.net控件开发基础(5)(转贴) asp.net控件开发基础(4)(转贴) asp.net控件开发基础(2)(转贴) asp.net控件开发基础(1)(转贴) C#中使用反射显示程序集的所有类型和属性(转贴)
ASP.NET服务器控件的开发(2) (转贴)
xiaolei1982 · 2008-04-19 · via 博客园 - xiaolei1982

3.2         System.Web.UI.WebControls.WebControl类介绍

    该类是继承自基本控件类Control类的,我们可以使用Control类所有可被继承的属性和方法等。当然从
该类派生要比从Control类派生要好,我们可以利用WebControl类提供的属性来控制服务器控件的外观和行为,
比如,我们可以控制背景颜色,边框宽度和样式等。下面我们就来大概介绍下WebControl类。
 
3.2.1     AddAttributesToRender方法
 
    该方法是保护类型的,只被继承该类的派生类调用。通过重写AddAttributesToRender方法可以联合构造
函数指定的HTML标记符为呈现指定额外的特性和CSS样式。在介绍该方法前我们先来看下从Control类中继承并重
写了的Render方法我们先来
看下他的代码!
protected override void Render(HtmlTextWriter writer)
{
      this.RenderBeginTag(writer);
      this.RenderContents(writer);
      this.RenderEndTag(writer); //结束构造函数中指定的HTML标记符
}
在执行体中调用了3个方法,这3个方法加上AddAttributesToRender方法是呈现服务器控件内容的关键方法,
我们再来看下RenderBeginTag方法的代码!
public virtual void RenderBeginTag(HtmlTextWriter writer)
{
      this.AddAttributesToRender(writer);
      HtmlTextWriterTag tag1 = this.TagKey;
      if (tag1 != HtmlTextWriterTag.Unknown)
      {
            writer.RenderBeginTag(tag1);
      }
      else
      {
            writer.RenderBeginTag(this.TagName);
      }
}
在该方法的执行体中首先调用了AddAttributesToRender方法为控件添加HTML特性和值
this.AddAttributesToRender(writer);
下面我们看下构造函数的代码
protected WebControl() : this(HtmlTextWriterTag.Span) //默认的HTML标记符为Span
{
}
public WebControl(HtmlTextWriterTag tag)
{
      this.tagKey = tag;
}
接着指定HTML标记符HtmlTextWriterTag tag1 = this.TagKey;
最后调用RenderBeginTag方法将标记符写入输出流中。看到这里我们在回到正题来看
AddAttributesToRender方法,同样我们来看看执行体中的部分代码!
protected virtual void AddAttributesToRender(HtmlTextWriter writer)
{
      string text1;
      if (this.ID != null)
      {
            writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID); //添加ID特性和值
      }
……
……
……
      if (this.ControlStyleCreated && !this.ControlStyle.IsEmpty)
      {
          //添加样式特性,该方法我们会在讲Style类时讲到
            this.ControlStyle.AddAttributesToRender(writer, this); 
      }
      if (this.attrState != null)
      {
          //得到包含了HTML特性的属性,该属性我们在讲WebControl类属性时讲到
            AttributeCollection collection1 = this.Attributes
            IEnumerator enumerator1 = collection1.Keys.GetEnumerator();
            while (enumerator1.MoveNext())
            {
                  string text2 = (string) enumerator1.Current;
                    //将特性添加到输出流
                  writer.AddAttribute(text2, collection1[text2]);
            }
      }
}
看下我对该方法执行体的注释应该就能很快了解AddAttributesToRender方法的用途,其实简单的说来就为构造函数中
指定的HTML标记符添加特性。一样我们会重写该方法为标记符添加更多的特性,但我们要记住,当我们重写该方法时一
定要调用基类该方法。
下面我们使用该方法来修改下例3-1(例3-5)
例3-5:

using System;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.ComponentModel;

namespace WebControlLibrary3

{

     [DefaultProperty("Text"),

         ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]

     [ParseChildren(true)]

     public class WebCustomControl1 : System.Web.UI.WebControls.WebControl

     {

         [Bindable(true),

              Category("Appearance"),

              DefaultValue("")]

         public WebCustomControl1(): base(HtmlTextWriterTag.Input) //添加HTML标记符

         {

         }

         public string Text

         {

              get

              {

                   if(this.ViewState["text"]!=null)

                   {

                       return this.ViewState["text"].ToString();

                   }

                   return string.Empty;

              }

              set

              {

                   this.ViewState["text"] = value;

              }

         }

         protected override void AddAttributesToRender(HtmlTextWriter writer) //重写

         {

              writer.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Type,"text");

              writer.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Class,"class1");

              writer.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Name,"text1");

              writer.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Value,this.Text);

              writer.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Height,"30");

              writer.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Width,"160");

              writer.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.FontSize,"24");

              base.AddAttributesToRender (writer);

         }

     }

}
我们对代码做了下修改,但调用代码不变,显示结果还是不变(图3-1)
 
3.2.2     RenderContents方法
 
    对于该方法我们就稍稍讲一下因为实在是太简单了,就相当于在例3-1代码

              writer.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.Input);

RenderContents方法中的代码相当于就是加在这里的代码

              writer.RenderEndTag();     

     当然我们在重写该方法是最好调用写base.RenderContents (writer);这样就相当与调用了基本控件Control类
RenderChildren方法,可以呈现控件的子控件。
 
3.2.3     ApplyStyle方法与MergeStyle方法
 
     这两个方法是用来把样式添加到服务器控件的,看下他们的代码!
public void ApplyStyle(Style s)
{
      if ((s != null) && !s.IsEmpty)
      {
            this.ControlStyle.CopyFrom(s); //ControlStyle属性我们会在讲属性时讲到
      }
}
public void MergeStyle(Style s)
{
      if ((s != null) && !s.IsEmpty)
      {
            this.ControlStyle.MergeWith(s);
      }
     这2个方法分别调用的样式类的2个方法CopyFromMergeWith,他们的区别在于,使用CopyFrom方法是从一个
样式对象复制样式到调用的样式对象,覆盖当前已有的值。而MergeWith方法只是合并2个样式,第1个样式已有的样式
特性值不会被第2个样式对象的样式值所覆盖。
 
3.2.4     CreateControlStyle方法
 
     该方法是保护成员。当我们的控件有自定义的样式时,我们一般会对该方法进行重写,以得到我们自定义的样式
类的实例对象。
看下他的代码:
protected virtual Style CreateControlStyle()
{
   return new Style(this.ViewState); //使用当前的ViewState属性创建Style类的ViewState
}
在WebControl类中用Style返回类的构造函数Style类的实例对象。
 
3.2.5     WebControl类中的属性
 
Attributes属性,该属性使只读的。利用该属性我们可以为利用构造函数添加的HTML标记符添加特性。该属性是
AttributeCollection类型的,我们可以利用该类的Add方法或索引为HTML标记符添加特性,
如Attributes.Add("name", "name1")或使用索引
This.Attributes["name "]= "name1 "
ControlStyle属性,该属性也是只读的。我们在前面对该属性已经使用了,该属性是样式属性,一般我们在编写
自己的控件时不用人为使用该属性,当我们调用ApplyStyle方法或MergeStyle方法时就会读取该属性了。
     ControlStyleCreated属性,该属性是只读的。我们可以读取该属性确定我们的控件样式是否被指定。
     Style属性,该属性是只读的,类型为CssStyleCollection类。利用该属性我们可以为控件定义CSS样式,使用
方法和Attributes属性一样可以用Add方法和索引指定样式。在页面显示时添加的所有名-值对都会在指定的HTML标记符的
style特性里面。
     TabIndex属性,通过该属性我们可以设置或获取在构造函数中指定的HTML标记符的Tabindex特性的值,该值是
short类型的,
我们在读写是要注意。
     TagKey属性,该属性是只读的,而且是保护成员。通过该属性我们可以得到构造函数中指定的HTML标记符。
当然因为该属性是虚属性我们还可以重写它来改变HTML标记符。
     Enabled属性,该属性可读写,当我们设置该属性为false时,就相当与为构造函数中指定的HTML标记符特性
Disabled设置的值为disabled。当为true时,将不设置该特性。
     ToolTip属性,该属性也是可读写的,设置该属性可以为构造函数中指定的HTML标记符设置Title特性的值。

    在WebControl类还定义了一些控件的样式属性,如:BackColor,BorderColor,BorderStyle,BorderWidth,Height,Width。当然因为WebControl类时从Control类继承的,所以WebControl类还具有Control类中定义的属性,如:ViewState,ID等。