ASP.NET控件开发基础之为子控件添加样式

上一篇讨论了视图状态的用法,让我们再回到第八篇的时候.从第八篇的时候跳了很大篇幅来继续讲属性,然后接着讲类型转换器,再接着讲视图状态.绕到现在才接着讲复合控件的样式的使用,因为上面讲的东西是紧密联系的.如果已经理解自定义视图状态管理,那这一篇则看起来相关的简单.

创新互联是专业的阿瓦提网站建设公司,阿瓦提接单;提供网站设计制作、网站设计,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行阿瓦提网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

ASP.NET控件开发基础之为子控件添加样式1.复合控件中样式属性概述

在第六篇的时候已经介绍过样式的使用了,在复合控件中你同样可以用此方法给控件定义多个样式属性,但此方法很适合像label这样非复合控件.

当然复合控件可以适当的定义其自身的样式属性,同时你还需要为其子控件提供样式,典型的控件如GridView控件,如下图

它有很多不同种类的列,而每种不同的列则有不同的样式集合属性,如果将其每个样式属性均暴露为***属性,那样式属性将变得很混乱.

我们可以用此方法为复合控件的子控件定义样式,实现每个子控件对应Style类型的复杂样式属性,将样式属性暴露为复合控件的***属性,这样更容易管理复合控件样式属性.

ASP.NET控件开发基础之为子控件添加样式2.复合控件中样式属性实现(为子控件提供样式)

Style类本身继承IStateManager 接口,并实现了接口方法.在第五篇我们曾重写CreateControlStyle方法,如下

 
 
 
 
  1. protected override Style CreateControlStyle()  
  2. {  
  3.  
  4.     return new Style(ViewState);  

其初始化的时候即存储样式信息在视图状态中,而其自定义的样式的状态管理机制则跟上一篇非常的相似.你需要重写Control类的状态管理的几个方法来实现样式的状态管理.还是以登录控件为例.

(1)先自定义样式集合属性

定义方法跟上一篇视图状态中的Address属性很相似

如下代码

 
 
 
 
  1. #region 样式属性  
  2.       [  
  3.       Category("Styles"),  
  4.       DefaultValue(null),  
  5.       DesignerSerializationVisibility(  
  6.           DesignerSerializationVisibility.Content),  
  7.       PersistenceMode(PersistenceMode.InnerProperty),  
  8.       Description(  
  9.           "应用于按钮的样式")  
  10.       ]  
  11.       public virtual Style ButtonStyle  
  12.       {  
  13.           get 
  14.           {  
  15.               if (_buttonStyle == null)  
  16.               {  
  17.                   _buttonStyle = new Style();  
  18.                   if (IsTrackingViewState)  
  19.                   {  
  20.                       ((IStateManager)_buttonStyle).TrackViewState();  
  21.                   }  
  22.               }  
  23.               return _buttonStyle;  
  24.           }  
  25.       }  
  26.  
  27.       [  
  28.       Category("Styles"),  
  29.       DefaultValue(null),  
  30.       DesignerSerializationVisibility(  
  31.           DesignerSerializationVisibility.Content),  
  32.       PersistenceMode(PersistenceMode.InnerProperty),  
  33.       Description(  
  34.           "应用于文本框的样式")  
  35.       ]  
  36.       public virtual Style TextBoxStyle  
  37.       {  
  38.           get 
  39.           {  
  40.               if (_textBoxStyle == null)  
  41.               {  
  42.                   _textBoxStyle = new Style();  
  43.                   if (IsTrackingViewState)  
  44.                   {  
  45.                       ((IStateManager)_textBoxStyle).TrackViewState();  
  46.                   }  
  47.               }  
  48.               return _textBoxStyle;  
  49.           }  
  50.       }  
  51.       #endregion 

(2)自定义视图状态管理

因为此处定义了两个样式集合属性,所以用到了Triplet这个辅助类,其跟Pair类一样都是辅助类,而其可以存储三个相关对象的基本结构.如果你要储存三个以上就不能用这两个辅助类了,实现方法还是很简单的.

如下代码

 
 
 
 
  1. #region 自定义视图状态  
  2.  protected override void LoadViewState(object savedState)  
  3.  {  
  4.      if (savedState == null)  
  5.      {  
  6.          base.LoadViewState(null);  
  7.          return;  
  8.      }  
  9.      else 
  10.      {  
  11.          Triplet t = savedState as Triplet;  
  12.  
  13.          if (t != null)  
  14.          {  
  15.              base.LoadViewState(t.First);  
  16.  
  17.              if ((t.Second) != null)  
  18.              {  
  19.                  ((IStateManager)ButtonStyle).LoadViewState(t.Second);  
  20.              }  
  21.  
  22.              if ((t.Third) != null)  
  23.              {  
  24.                  ((IStateManager)TextBoxStyle).LoadViewState(t.Third);  
  25.              }  
  26.          }  
  27.          else 
  28.          {  
  29.              throw new ArgumentException("Invalid view state .");  
  30.          }  
  31.      }  
  32.  }  
  33.  
  34.  protected override object SaveViewState()  
  35.  {  
  36.      object baseState = base.SaveViewState();  
  37.      object buttonStyleState = null;  
  38.      object textBoxStyleState = null;  
  39.  
  40.      if (_buttonStyle != null)  
  41.      {  
  42.          buttonStyleState =  
  43.              ((IStateManager)_buttonStyle).SaveViewState();  
  44.      }  
  45.  
  46.      if (_textBoxStyle != null)  
  47.      {  
  48.          textBoxStyleState =  
  49.              ((IStateManager)_textBoxStyle).SaveViewState();  
  50.      }  
  51.  
  52.      return new Triplet(baseState,  
  53.          buttonStyleState, textBoxStyleState);  
  54.  
  55.  }  
  56.  
  57.  protected override void TrackViewState()  
  58.  {  
  59.      base.TrackViewState();  
  60.      if (_buttonStyle != null)  
  61.      {  
  62.          ((IStateManager)_buttonStyle).TrackViewState();  
  63.      }  
  64.      if (_textBoxStyle != null)  
  65.      {  
  66.          ((IStateManager)_textBoxStyle).TrackViewState();  
  67.      }  
  68.  }  
  69.  #endregion 

(3)为子控件添加样式集合属性

上面工作做好后,然后你就可以在呈现方法Render方法或RenderContent方法中为子控件添加样式集合属性,如下代码

 
 
 
 
  1. if (_buttonStyle != null)  
  2.             {  
  3.                 submitButton.ApplyStyle(ButtonStyle);  
  4.             }  
  5.  
  6.             if (_textBoxStyle != null)  
  7.             {  
  8.                 nameTextBox.ApplyStyle(TextBoxStyle);  
  9.                 emailTextBox.ApplyStyle(TextBoxStyle);  
  10.             } 

来看一下效果,属性面板已经有子控件样式集合属性了,这样就更容易管理样式了.

定义子控件样式就这么的简单,主要难点还是在于自定义视图状态管理,对自定义视图状态管理熟悉的话,看到这里肯定很简单,如果没看明白就须先弄懂如何自定义视图状态管理.

注意点:ASP.NET中复合控件可以直接继承CompositeControl类即可,大家可以了解一下此类。

ASP.NET控件开发基础之为子控件添加样式的基本情况就向你介绍到这里,希望你对ASP.NET控件开发基础之为子控件添加样式有所了解。

【编辑推荐】

  1. ASP.NET控件开发基础之复合控件浅析
  2. ASP.NET控件开发基础之复合控件事件处理浅析
  3. ASP.NET控件开发基础之类型转换器浅析
  4. ASP.NET控件开发基础之实现控件集合属性
  5. ASP.NET控件开发基础之自定义视图状态管理

标题名称:ASP.NET控件开发基础之为子控件添加样式
URL标题:http://www.shufengxianlan.com/qtweb/news48/235048.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联