DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> XML在.net平台下的自定義控件的應用
XML在.net平台下的自定義控件的應用
編輯:XML詳解     
  Xml全稱可擴展標記語言(extensible marked language),這套語言系統由於在數據處理,跨平台等方面的獨特優勢,在近幾年風靡全球。XML語言系統把任何數據都作為“鍵”和“值”來進行處理,這一點類似於很多數據庫管理系統(DBMS),而且它與具體的機器指令無關,其存儲方式是純文本文件,因此具有出色的跨平台性。另外它允許用戶創建自己的數據指令系統,在這套指令系統的框架下,用戶可以把所有信息轉換成易於存取的數據,大大加快了開發的周期和代碼的可移植性。

  既然XML這麼好,那它到底是什麼樣子的呢?最近筆者因為課題的需要,開發了一個基於.Net平台下的menu控件,並且加入了XML特性。制作的步驟如下:

  第一步:制作一個.Net平台下的menu控件

  .Net平台下面的自定義控件的工作原理如下:控件對應於一個類(class),控件的所有屬性通過類的成員變量來暴露,而控件的方法對應於class的成員函數。在控件被加載的手,系統會調用class的render方法,制作控件的時候,應該重載(override)這個render方法,使得在控件被加載的那 一刻,控件可以自己“繪制”自己,一般來說,在render方法裡面要將關於控件界面繪制的那些Javascript文件放入到輸出流中。

  由於這裡重要是講解後面XML的應用,所以這裡只是把自定義控件的原來簡要說明一下,下面羅列出相關對象,屬性,方法。

  整個menu控件分為Topmenu,Submenu,Childrenmenu,MenuItem四個對象,其相應的信息為:

  控件屬性:

   ID:標識控件名字

   MenubarHeight:菜單攔的高度

   MenubarWidth::菜單攔的寬度

   BorderWidth::邊框寬

   AutoDropdown:true表示自動下拉,false表是單擊鼠標下拉

   DropdownDelay:下拉時間

   Menufont:字體

   LocationX:菜單的x位置

   LocationY:菜單的y位置

   XmlFile:XML文件

   XmlStream:XML流

   topmenu對象屬性:

   ID:同上

   Text:頂層菜單的文本

   Isparent:true表示有下一級菜單,否則為false(false默認)

   Islink:需要用事件處理用true,否則false(false默認);

   Bgcolor:背景色

   Forecolor:前景色

   HoveredBackcolor:鼠標放在上面的顏色

   Topmenufont:字體

   Linkurl:當isparent為false才有效,表示連接的url

   Borderwidth:topmenu的邊框寬

   Itemheight:下一級菜單的高度(必須isparent為true才有效)

   Itemwidth: 下一級菜單的寬度(必須isparent為true才有效)

   Submenus:含有下一級菜單的數組列表

   Submenu,Childrenmenu 和MenuItem的所有屬性跟上面Topmenu一樣,這裡就不贅述了。

 第二步,就是加入XML特性

  注意,任何xml文檔在其被處理之前最好先進行有效性驗證,提供驗證一般有兩種重要的途徑。其一就是提供DTD(文檔類型定義),實際上就是讓用戶提供指令集,然後在xml文檔加載的時候對其進行有效性分析,看是否有無效指令,簡單說就是創建一個編譯環境;另外一個就是提供一個所謂的schema。.其作用跟DTD完全一樣,只是在表現形式上好於DTD,因為它本身也是一個XML文檔。這裡我采用了schema的形式,當然了,讀者用興趣也可以將其替換問相應的DTD版本。下面列出該schema的關於控件和topmenu對象的代碼,如果要看該文檔的詳細代碼,請看 “代碼.doc”。

  menu.xdr:

<?XML version="1.0" encoding="UTF-8"?>

<Schema name="menus" xmlns="urn:schemas-microsoft-com:xml-data" XMLns:dt="urn:schemas-microsoft-com:datatypes">

<description>

menus schema used to validate menu.XML

</description>

<ElementType name="menu" model="closed" content="empty">

<AttributeType name="id" dt:type="string" required="yes"/>

<atttibute type="id"/>

<element name="topmenu" model="closed" minOccurs="0" maxOccurs="*" content="empty"/>

</ElementType>



<ElementType name="topmenu" model="closed" content="empty">

<AttributeType name="id" dt:type="string" required="yes"/>

<AttributeType name="text" dt:type="string" required="yes"/>

<AttributeType name="linkurl" dt:type="string" required="yes"/>

<AttributeType name="isparent" dt:type="string" required="yes"/>

<atttibute type="id"/>

<atttibute type="text"/>

<atttibute type="linkurl"/>

<atttibute type="isparent"/>

<element name="submenu" model="closed" minOccurs="0" maxOccurs="*" content="empty"/>

</ElementType>



<ElementType name="submenu" model="closed" content="empty">

<AttributeType name="id" dt:type="string" required="yes"/>

<AttributeType name="text" dt:type="string" required="yes"/>

<AttributeType name="linkurl" dt:type="string" required="yes"/>

<AttributeType name="isparent" dt:type="string" required="yes"/>

<atttibute type="id"/>

<atttibute type="text"/>

<atttibute type="linkurl"/>

<atttibute type="isparent"/>

<element name="childrenmenu" model="closed" minOccurs="0" maxOccurs="*" content="empty"/>

</ElementType>



<ElementType name="childrenmenu" model="closed" content="empty">

<AttributeType name="id" dt:type="string" required="yes"/>

<AttributeType name="text" dt:type="string" required="yes"/>

<AttributeType name="linkurl" dt:type="string" required="yes"/>

<AttributeType name="isparent" dt:type="string" required="yes"/>

<atttibute type="id"/>

<atttibute type="text"/>

<atttibute type="linkurl"/>

<atttibute type="isparent"/>

<element name="menuitem" model="closed" minOccurs="0" maxOccurs="*" content="empty"/>

</ElementType>

<ElementType name="menuitem" model="closed" content="empty">

<AttributeType name="id" dt:type="string" required="yes"/>

<AttributeType name="text" dt:type="string" required="yes"/>

<atttibute type="id"/>

<atttibute type="text"/>

</ElementType>

</Schema>

  如果您對html比較熟悉的話,相信上面的代碼即使是以前沒有接觸過也應該清楚了,在.xdr中,有兩個對象,其一是元素,用前綴 ElementType 來定義,另外一個是該元素所對應的屬性,用前綴atttibuteTpye,定義完這兩個對象後,就是要將它們實例化,對應的前綴分別是Element 和atttibute,然後您就可以使用這兩種已經實例化了的對象,就象使用Html中<a>,<l>,<body>,<head>等標記一樣。

  為了更加清晰的說明上面的代碼,我們這裡舉一個例子,相信讀者一目了然:

<menus XMLns='x-schema:Menu.xdr'>

<menu id='menuBar1'>

<topmenu id="xjtu" text="xjtu" isparent="true" linkurl="xjtu"></topmenu>

<submenu id="sina" text="sina" isparent="false" linkurl="sina"></submenu>

<topmenu id="sohu" text="sohu" isparent="false" linkurl="sohu"></topmenu>

</menu></menus>


  創建完xml文檔後,就要在程序裡面讀取XML文檔,這裡如果采用微軟的vs.Net平台開發的話,建議可以使用XMLTextReader來讀取相關信息,具體細節可以查閱MSDN。

  第三步:使用控件

  創建完了menu控件,現在就是在.net平台下面來使用它。首先要在vs.net平台下面編譯該控件,如果編譯成功就可以使用它了。使用.net自定義控件和使用一般的ActiveX控件很相似,啟動vs.net平台下面的部件箱(可以直接在ToolBar上右擊鼠標來得到),注意我們制作是不是基於COM組件,而是ASP.Net組件,所以從這點上它與COM組件有本質的不同,通過Browse按鈕可以選擇該控件對應的dll文件,將其添加進你的工程。下面你還要在你的程序代碼中加入下面的代碼(其他代碼略)

  using 你的名字空間 ; (A)

  還應該在behind code加入該控件的聲明 (B)

  事實上,無論是A處的代碼還是B處的說明,都可以由VS.Net平台自動生成,如果使用其他平台並且不支持這種代碼的自動添加的話,就可以手動添加。添加完之後,這樣就可以和其他控件來進行使用了。而且在控件類代碼中的所有的公有的成員變量,函數分別對應於控件的屬性和方法。

  這裡需要指明的就是控件必須提供兩個屬性,那就是XmlStream和XmlFile,如果用戶已經制作好了控件的XML文件(該文件描述了控件的數據),或者是已經寫好了一個xml代碼的話,可以把代碼和文件分別傳給XmlStream和XmlFile,後台程序(就是dll文件)通過調用一些XML的閱讀器比如XmlTextReader來讀取xml數據,這樣就達到了控件支持XML屬性了,進而也增強了控件的移植性和通用性。

  本文主要討論了XML在.Net平台下控件制作方面的應用,從上面的例子可以看出,xml在數據的整合,處理方面確實有它獨特的優勢,如果你的項目中涉及到數據處理和跨平台的問題,可以考慮應用XML.。
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved