程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET 2.0服務器控件之復合控件樣式

ASP.NET 2.0服務器控件之復合控件樣式

編輯:關於ASP.NET

為了設置復合控件的外觀,復合控件必須提供一些樣式屬性,尤其是針對子控件的樣式屬性。在本文中,我們將重點介紹為復合控件實現樣式屬性的兩種方法。

1、上傳部分樣式屬性

在為復合控件實現樣式屬性之前,讀者應首先了解"樣式冒泡"的基本概念。樣式冒泡多用於實現復合控件的樣式屬性。由於在復合控件中包含多個子控件,因此,這些子控件的樣式屬性可能在一定情況下,干擾復合控件的樣式屬性,引起樣式屬性混亂。為了更加明確的定義復合控件的樣式屬性,可以采取將子控件的樣式屬性上傳為頂級樣式屬性的方法,這就是所謂的"樣式冒泡"。

通常情況下,開發人員可能面對兩種情況:一種是上傳子控件中少數樣式屬性,另一種是上傳子控件中所有樣式屬性。本小節只介紹針對第一種情況的實現方法,而另外一種將在後面一節中進行講解。

本節說明的這種實現樣式屬性的方法,其關鍵是通過為子控件的Attributes指定鍵/值對,引入樣式屬性,由此將子控件的樣式屬性上傳為復合控件頂級屬性。為了方便讀者理解這一方法,下面列舉了一個典型應用。

在本示例中,實現了一個復合控件MyControl,其子控件集合中包括一個Table控件。當前,需要將Table子控件的樣式屬性CellPadding和Border上傳為MyControl的頂級樣式屬性。具體源代碼如下所示。

public class MyControl : CompositeControl{
 // 相關代碼 ......
 // 定義初始值

 private int _cellPadding = 0;
 private int _border = 1;
 ......
 // 定義樣式屬性,它和Table控件的樣式屬性CellPadding和Border類似
 public int CellPadding{
  get { return _cellPadding; }
  set { _cellPadding = value; }
  // 實現屬性Border
  public int Border{
   get { return _border; }
   set { _border = value; }
   ......
   // 重寫CreateChildControls方法
   protected override void CreateChildControls() {
    //相關代碼
    ......
    Table t = new Table(); //將前面定義的屬性添加到鍵/值對中
    t.AddAttributes.Add("CellPadding",_cellPadding.ToString());
    t.AddAttributes.Add("Border",_border.ToString());
    ......
   }
 }

以上代碼顯示了MyControl的一些關鍵源代碼,其重點在於說明實現部分樣式屬性冒泡的關鍵步驟。(1)初始化頂級樣式屬性的字段,如果有必要可以定義初始值。(2)定義與需要升級的子控件的樣式屬性相同名稱的屬性。上面的代碼中定義了屬性CellPadding和Border。(3)在子控件的Attributes的鍵/值對中引入第2步中定義的屬性。

當設置MyControl中的樣式屬性CellPadding和Border的屬性值時,實際是設置Table子控件的CellPadding和Border的屬性值。通過以上3個關鍵步驟就可實現樣式冒泡。

如果讀者仔細觀察可以發現,以上介紹的這種實現樣式冒泡的方法存在一些問題:一、這種方法只適用於升級子控件中少數樣式屬性。如果需要將子控件的所有樣式屬性都升級,而仍然使用這種方法,則實現起來非常繁瑣,容易產生錯誤。二、所實現的樣式屬性缺乏邏輯性和組織性。在某種情況下,例如,多個子控件的同一樣式屬性都需要升級為頂級屬性,這時使用該方法將會引起混亂。

為了解決這些問題,下面介紹一種上傳子控件全部樣式屬性的實現方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved