日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET2.0服务器控件之类型化样式属性

發布時間:2025/3/21 asp.net 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET2.0服务器控件之类型化样式属性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
實現類型化樣式屬性的方法

  繼承自Style類的類稱為類型化樣式。Style類可以由控件開發人員來擴展,創建一個自定義類型化樣式,它重寫或者添加Style類的屬性。服務器控件也可以把自定義類型化樣式作為ControlStyle屬性的類型。例如,Table控件的ControlStyle屬性就是TableStyle類型,該類型是擴展的Style,添加了例如CellPadding、CellSpacing和GridLines屬性等。在初步了解類型化樣式屬性的基本概念之后,下面列舉了實現類型化樣式屬性的方法要點。

  (1)創建一個派生自System.Web.UI.WebControls.Style的類;

  (2)定義樣式將為控件提供的屬性。在Style的ViewState字典中保存該屬性;

  (3)重寫CopyFrom和MergeWith方法,從定義的屬性中復制或者將定義的屬性和一個給定樣式的屬性合并;

  (4)重寫Reset方法,刪除添加到ViewState中的屬性;

  (5)重寫AddAttributesToRender方法,產生HTML和CSS特性,作為控件呈現過程的一部分。

  實際上,創建類型化樣式屬性并不是一個簡單的過程。為此,下面我們將通過典型應用示例來說明創建的具體方法,以便讀者加深對于實現要點的理解。

  典型應用

  本節通過創建一個MyPanel控件以及相關聯的類型化樣式MyPanelStyle,來講解如何實現并使用自定義類型化樣式。就功能而言,MyPanel與ASP.NET 2.0內置的Panel控件是一致。開發人員可以通過把需要添加的控件嵌套在控件的標簽中,向Controls集合中添加控件。在可視化設計器中,把所需添加的控件拖放到Panel的設計界面上,就可以把控件添加到Controls集合中。然而,MyPanel并不是從Panel類繼承而來,而是自定義實現的結果,同時,該控件還提供了類型化樣式屬性MyPanelStyle,其中設置了3個樣式屬性:

  (1)BackImageUrl,用于指定背景圖片的URL;

  (2)HorizontalAlign,用于指定所添加內容的水平對其方式;

  (3)Wrap,用于指定是否允許對所添加的內容換行。

  下面列舉了示例效果圖。


圖1


  如圖1所示,圖中顯示了一個MyPanel控件,其中包括一行文字,文字的背景圖像已經定義,并且文字處于居中位置。

  下面列舉了實現自定義服務器控件的MyPanel.cs源代碼。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebControlLibrary{
 [ ParseChildren(false), PersistChildren(true) ]
 [ToolboxData("<{0}:MyPanel runat=server></{0}:MyPanel>")]

 public class MyPanel : WebControl {
  // 定義構造函數
  public MyPanel() : base(HtmlTextWriterTag.Div) { }
  // 實現屬性BackImageUrl
  [Bindable(true)] [Category("Appearance")]
  [DefaultValue("")]

  public virtual string BackImageUrl {
   get {
    if (ControlStyleCreated) {
     return ((MyPanelStyle)ControlStyle).BackImageUrl;
    }
    return String.Empty;
   }
   set {
     ((MyPanelStyle)ControlStyle).BackImageUrl = value;
   }
  }
  // 實現屬性HorizontalAlign
  [Bindable(true)]
  [Category("Layout")]
  [DefaultValue("")]

  public virtual HorizontalAlign HorizontalAlign {
   get {
    if (ControlStyleCreated) {
     return ((MyPanelStyle)ControlStyle).HorizonalAlign;
    }
    return HorizontalAlign.NotSet;
   }
   set {
    ((MyPanelStyle)ControlStyle).HorizonalAlign = value;
   }
  }
  // 實現屬性Wrap

  [Bindable(true)]
  [Category("Layout")]
  [DefaultValue("")]

  public virtual bool Wrap {
   get {
    if (ControlStyleCreated) {
     return ((MyPanelStyle)ControlStyle).Wrap;
    }
    return true;
   }
   set {
    ((MyPanelStyle)ControlStyle).Wrap = value;
   }
  }
  protected override Style CreateControlStyle() {
   return new MyPanelStyle(ViewState);
  }
 }
}
  在分析之前,為了幫助讀者更好的閱讀以上源代碼,下面列舉了MyPanel類圖。


圖2


  如上代碼所示,MyPanel繼承自WebControl基類,其中定義了3個屬性BackImageUrl、HorizontalAlign和Wrap。關于這3個屬性的說明,讀者可參考前面的內容。另外,MyPanel重寫了CreateControlStyle方法,返回一個MyPanelStyle對象。這樣返回的MyPanelStyle實例間接的賦值給ControlStyle屬性。這種實現方法的原因是由于ControlStyle屬性是只讀屬性,且它的訪問操作需要調用CreateControlStyle方法時間接進行設置。需要讀者注意的是,CreateControlStyle將MyPanel控件的ViewState傳遞給MyPanelStyle的構造函數。當在CreateControlStyle中為控件創建新樣式時,必須將控件的ViewState傳給Style構造函數,那么樣式對象則使用和控件相同的StateBag。

?

  下面列舉了實現MyPanelStyle類的源代碼,它們來自MyPanelStyle.cs文件。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebControlLibrary{
 public class MyPanelStyle : Style {
  // 定義內部常量
  internal const int PROP_BACKIMAGEURL = 1;
  internal const int PROP_HORIZONTALALIGN = 2;
  internal const int PROP_WRAP = 3;
  //構造函數一
  public MyPanelStyle() { }
  // 構造函數二
  public MyPanelStyle(StateBag bag) : base(bag) { }
  // 創建BackImageUrl屬性
  [ Bindable(true), Category("Appearance"), DefaultValue(""), Description("背景圖片的URL"), NotifyParentProperty(true) ]
  public virtual string BackImageUrl {
   get {
    if (IsSet(PROP_BACKIMAGEURL)) {
     return (string)ViewState["BackImageUrl"];
    }
    return String.Empty;
   }
   set {
    ViewState["BackImageUrl"] = value;
   }
  }
  // 實現HorizonalAlign屬性
  [ Bindable(true), Category("Layout"), DefaultValue(HorizontalAlign.NotSet), Description("所添加內容的水平對其方式"), NotifyParentProperty(true) ]
  public virtual HorizontalAlign HorizonalAlign {
   get {
    if (IsSet(PROP_HORIZONTALALIGN)) {
     return (HorizontalAlign)ViewState["HorizontalAlign"];
    }
    return HorizontalAlign.NotSet;
   }
   set {
    if (value < HorizontalAlign.NotSet || value > HorizontalAlign.Justify) {
     throw new ArgumentOutOfRangeException("value");
    }
    ViewState["HorizontalAlign"] = value;
   }
  }
  // 實現IsEmpty
  protected new internal bool IsEmpty {
   get {
    return base.IsEmpty && !IsSet(PROP_BACKIMAGEURL) && !IsSet(PROP_HORIZONTALALIGN) && !IsSet(PROP_WRAP);
   }
  }
  //實現Wrap屬性
  [ Bindable(true), Category("Layout"), DefaultValue(true), Description("是否允許對所添加的內容換行"), NotifyParentProperty(true) ]
  public virtual bool Wrap {
   get {
    if (IsSet(PROP_WRAP)) { return (bool)ViewState["Wrap"]; }
    return true;
   }
   set { ViewState["Wrap"] = value; }
  }
  //輔助方法IsSet
  internal bool IsSet(int propNumber) {
   string key = null;
   switch (propNumber) {
    case PROP_BACKIMAGEURL: key = "BackImageUrl";
     break;
    case PROP_HORIZONTALALIGN: key = "HorizontalAlign";
     break;
    case PROP_WRAP: key = "Wrap";
     break;
   }
   if (key != null) {
    return ViewState[key] != null;
   }
   return false;
  }
  //重寫AddAttributesToRender方法
  public override void AddAttributesToRender(HtmlTextWriter writer, WebControl owner) {
   if (IsSet(PROP_BACKIMAGEURL)) {
    string s = BackImageUrl;
    if (s.Length > 0) {
     if (owner != null) {
      s = owner.ResolveUrl(s);
     }
     writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundImage, "url(" + s + ")");
    }
   }
   if (IsSet(PROP_HORIZONTALALIGN)) {
    System.Web.UI.WebControls.HorizontalAlign hAlign = this.HorizonalAlign;
    if (hAlign != System.Web.UI.WebControls.HorizontalAlign.NotSet) {
     TypeConverter hac = TypeDescriptor.GetConverter(typeof(HorizontalAlign));
     writer.AddAttribute(HtmlTextWriterAttribute.Align, hac.ConvertToInvariantString(hAlign));
    }
   }
   if (IsSet(PROP_WRAP)) {
    bool wrap = Wrap;
    if (!Wrap) {
     writer.AddAttribute(HtmlTextWriterAttribute.Nowrap, "nowwrap");
    }
   }
   base.AddAttributesToRender(writer, owner);
  }
  //重寫CopyFrom方法
  public override void CopyFrom(Style s) {
   if (s != null) {
    base.CopyFrom(s);
    if (s is MyPanelStyle) {
     MyPanelStyle mps = (MyPanelStyle)s;
     if (!mps.IsEmpty) {
      if (mps.IsSet(PROP_BACKIMAGEURL))
       this.BackImageUrl = mps.BackImageUrl;
      if (mps.IsSet(PROP_HORIZONTALALIGN))
       this.HorizonalAlign = mps.HorizonalAlign;
      if (mps.IsSet(PROP_WRAP))
       this.Wrap = mps.Wrap;
     }
    }
   }
  }
  // 重寫MergeWith方法
  public override void MergeWith(Style s) {
   if (s != null) {
    if (IsEmpty) {
     CopyFrom(s);
     return;
    }
    base.MergeWith(s);
    if (s is MyPanelStyle) {
     MyPanelStyle mps = (MyPanelStyle)s;
     if (!mps.IsEmpty) {
      if (mps.IsSet(PROP_BACKIMAGEURL) && !this.IsSet(PROP_BACKIMAGEURL))
       this.BackImageUrl = mps.BackImageUrl;
      if (mps.IsSet(PROP_HORIZONTALALIGN) && !this.IsSet(PROP_HORIZONTALALIGN))
       this.HorizonalAlign = mps.HorizonalAlign;
      if (mps.IsSet(PROP_WRAP) && !this.IsSet(PROP_WRAP))
       this.Wrap = mps.Wrap;
     }
    }
   }
  }
  //重寫Reset方法
  public override void Reset() {
   base.Reset();
   if (IsEmpty) return;
   if (IsSet(PROP_BACKIMAGEURL))
    ViewState.Remove("BackImageUrl");
   if (IsSet(PROP_HORIZONTALALIGN))
    ViewState.Remove("HorizontalAlign");
   if (IsSet(PROP_WRAP)) ViewState.Remove("Wrap");
  }
 }
}
  下面列舉了MyPanelStyle類圖。


圖3


  可能部分讀者感覺MyPanelStyle類實現有些復雜,然而,還是有據可尋的。該類的實現嚴格按照前文所述的類型化樣式屬性創建方法來進行。

  首先,MyPanelStyle類繼承了Style類,這是創建類型化樣式屬性的關鍵,接著定義了3個屬性BackImageUrl、HorizontalAlign和Wrap。這3個屬性支持MyPanel中對應的樣式屬性。然后,代碼重寫了AddAttributesToRender方法,以便當控件呈現時準確生成相關的HTML和CSS代碼。需要注意的是,該方法的第二個參數不可為空,其表示擁有Style對象的具體控件。最后,代碼中重寫了3個來自Style的方法,CopyFrom、MergeWith和Reset。重寫前兩個方法是為了復制給定的MyPanelStyle或者把給定的MyPanelStyle與自身合并。這兩個方法都調用了基類方法,然后執行自身的邏輯。重寫Reset方法主要目的是為了刪除添加到ViewState中的屬性,它的實現思路與前兩個方法差不多,都是調用基類方法,然后執行自身邏輯。

  下面列舉了為測試MyPanel控件而創建的Default.aspx文件源代碼。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register TagPrefix="wcl" Assembly="WebControlLibrary" Namespace="WebControlLibrary" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>類型化樣式屬性</title>
</head>
<body>
<form id="form1" runat="server">
<wcl:MyPanel ID="demo1" runat="server" BackImageUrl="pic1.jpg" HorizontalAlign="Center" Height="145" Width="160">
<br />
<br />
這是一行位于MyPanel控件中的文字。
</wcl:MyPanel>
</form>
</body>
</html>
  如上代碼所示,開發人員可以像使用Panel控件一樣,將需要添加的控件設置在MyPanel標簽中。這樣所設置的控件將自動的顯示出來,并且由于MyPanel控件自身的屬性設置,其顯示的外觀和樣式將發生相應變化。

  小結

  本文針對類型化樣式屬性的實現方法進行了介紹,并且通過一個典型示例加強了讀者對于實現方法的理解。在接下來的文章中,我們將繼續討論利用ASP.NET 2.0技術,實現控件客戶端功能的內容。

轉載于:https://www.cnblogs.com/greateast/archive/2007/01/24/629158.html

總結

以上是生活随笔為你收集整理的ASP.NET2.0服务器控件之类型化样式属性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国内精品在线观看视频 | 日韩在线视频观看免费 | xxx日本黄色| 老妇裸体性猛交视频 | 欧美1314| 美女视频久久久 | jlzzjlzz国产精品久久 | 国产亚洲视频在线观看 | 看日本黄色录像 | 好吊妞视频在线 | 精产国品一二三区 | 欧美日韩生活片 | 香港黄色网 | 西西人体44www大胆无码 | 香蕉视频免费在线 | 四虎一国产精品一区二区影院 | 国产乱码一区二区三区播放 | 日韩在线不卡av | 国产理论片在线观看 | 国产精品成人久久电影 | 一二三四区在线 | 美女天天操 | 日本视频网 | 久久99精品久久久久久水蜜桃 | 性爱一级视频 | 日本大乳奶做爰 | 日韩精品在线电影 | 国产二区一区 | 久草天堂 | 操久久久 | 天堂中文在线免费观看 | 天天想你在线观看完整版高清 | 男操女视频网站 | 久久久久中文字幕亚洲精品 | 波多野结衣中文字幕一区二区 | 国产精品丝袜视频 | 久久免费大片 | 超能一家人电影免费喜剧在线观看 | 久久精品在线 | 一级中文字幕 | 久久久久亚洲av片无码 | 午夜67194| 亚洲欧美日韩中文在线 | 快播视频在线观看 | 欧美日韩亚洲国产一区 | 波多野结衣电影免费观看 | 久久久久久久免费 | 宝贝乖h调教灌尿穿环 | 日韩综合在线观看 | 97碰碰视频 | 日韩中出在线 | 在线观看欧美一区二区三区 | 依人在线视频 | 免费毛片小视频 | 国产微拍精品一区 | 91国产免费看 | 蜜桃av导航 | 日韩福利视频在线观看 | 国产东北女人做受av | 亚洲高h| 日本一区二区在线 | 激情91视频 | 日韩中文字幕有码 | 青青视频在线免费观看 | 国产亚洲视频在线 | 丰满人妻一区二区三区免费视频棣 | 国产66页 | 青娱乐极品在线 | 国产免费av网 | 国产午夜伦鲁鲁 | 国产精品18久久久久久vr下载 | 天天插av| 国内精品嫩模av私拍在线观看 | 乌克兰极品av女神 | 色欲av永久无码精品无码蜜桃 | 亚洲福利精品视频 | 波多在线视频 | 色伊人影院 | 日韩 欧美 精品 | 欧美精品一区二区在线观看 | 大色综合 | 梦梦电影免费高清在线观看 | 国产日本在线 | 国产国产乱老熟女视频网站97 | 国产又大又黄视频 | 国产三级黄色 | 国产精品成人无码专区 | 亚洲国产图片 | 欧美在线观看一区二区 | 久久国产视频网 | 综合久久2o19 | 五月天在线播放 | 国产69精品一区二区 | 国产伦理在线 | 免费观看一区二区三区视频 | 国产女无套免费视频 | 久久青草免费视频 | 青青青视频免费观看 | 久久久久久国产精品三区 |