開發asp.net自定義控制元件(asp.net學習筆記三) (轉)

amyz發表於2007-08-14
開發asp.net自定義控制元件(asp.net學習筆記三) (轉)[@more@]

 :namespace prefix = o ns = "urn:schemas--com::office" />

By Cash

.4.25

 

上一章我們寫了一個最簡單的自定義,此次讓我們拋開理論,實際開發一個具有實用意義的自定義控制元件:一個可以設定的選單。

在這個專案中我們將不採用任何未學到的理論知識,只需要具有基本的知識就可以。如你所知,控制元件不過是對一些HTML及script的封裝罷了。至於其它的技巧,將來我們會逐漸提及並應用,最終生產出具有商業水準的控制元件來。

製作這個控制元件的思路很簡單:首先使用DHTML寫出一個選單來,然後把其中的屬性提取出來,接著封裝起指令碼與HTML顯示程式碼,最後將其作為引數重寫Render方法。你看,就這麼簡單。

如果不想透過閱讀程式碼(那實在很討厭),你可以到如下地址這個專案的原始碼,其中包括這個自定義控制元件的及各類測試:不同的資料來源以及許可權設定。

 

首先在名稱空間CashControls中宣告一個列舉型別MainMenuAlign:

public enum MainMenuAlign

  {

  ///

  /// 左

  ///

    left=0,

  ///

  /// 中間

  ///

    center=1,

  ///

  /// 右

  ///

    right=2

  }

接著宣告繼承自Controls的類CashMenu,宣告如下變數及屬性:

變數:

private System.Web.HttpContext context;

    private System.Xml.XmlDocument oXmlDoc=new XmlDocument();

    private string menuData;

    private MainMenuAlign mainMenuAlign=MainMenuAlign.center;

    private string ruleString="admin";

    private int cellspacing;

    private int mainMenuHeight;

屬性:

///

  /// 屬性MenuData用於指定資料來源,可以是某個XML檔案,

///也可以是XML格式之字串

  ///

    [Bindable(true),

    Category("Data"),Description("為Menu提供XML資料來源.")]

    public string MenuData

  {

    get

  {

    return menuData;

  }

 

    set

  {

    menuData = value;

    Build();

  }

  }

 

......

 

宣告輔助方法:

///

  /// 方法Build用於綁寫資料來源,將其繫結到Context上,在屬性MenuData中

  ///

    private void Build()

  {

    if (menuData!=null)

    try

    {

      contextObject = this.Context;

    if (contextObject!=null)

      oXmlDoc.Load(contextObject.Server.MapPath(menuData));

    }

    catch

    {

    try

    {

      oXmlDoc.LoadXml(menuData);

    }

    catch (Exception e)

    {

      contextObject.Response.Write("開啟資料來源失敗!
");

      contextObject.Response.Write(e.Message);

    }

    }

    return;

  }

  ///

  /// 方法GenerateHtml用於生成Html程式碼,呼叫TraverseMenuTree方法,傳遞Context中oXmlDoc的一個節點進去

  ///

  ///

    private string GenerateHtml()

  {

    string tempHtml = "";

    if (oXmlDoc.ChildNodes.Count !=0) 

  {

    try

    {

      tempHtml = tempHtml + TraverseMenuTree(oXmlDoc.ChildNodes.Item(1).FirstChild);

    }

    catch

    {

    throw new ArgumentException("發生錯誤."); 

    }

  }

    return(tempHtml);

 

  }

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-956468/,如需轉載,請註明出處,否則將追究法律責任。

相關文章