国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET 2.0中層次數據的處理

2024-07-10 13:06:14
字體:
來源:轉載
供稿:網友

 數據源控件可以同時暴露平面表格式的或層次的數據。前面演示的sqldatasource和objectdatasource控件都是平面表格式的數據源控件。asp.net 2.0還包含兩個層次數據源控件:用于連接xml文件的xmldatasource和用于連接站點導航數據的sitemapdatasource。這一部分將介紹這些控件的使用技術。

  treeview和menu控件

  數據綁定控件與數據源控件類似,也可以是層次的。表格式數據綁定控件顯示數據列表或表格,層次數據綁定控件能夠用遞規方式獲取層次數據,在ui中用父-子關系顯示數據。asp.net 2.0中的分層數據綁定控件的例子有treeview和menu控件。下面將介紹把這些控件綁定到層次數據源的一些技術,包括很多示例。

  綁定到xml

  xmldatasource控件允許其它控件綁定到xml數據。xmldatasource支持datafile屬性,它被用于指定作為輸入(input)的xml數據文件的路徑。你還可以指定tranformfile屬性,給數據應用xslt轉換;設置xpath屬性來指定需要暴露的數據源節點的子集。

  下面的例子演示了一個通過xmldatasource控件綁定到xml文件的treeview控件。這個treeview把每個treenode對象的屬性與分層樹中的xml節點的屬性關聯起來了(為了進行數據綁定,xml節點的屬性都被處理為數據項的屬性)。在默認情況下,treeview控件通過調用對象的tostring()方法簡單地顯示數據項。它顯示了xml節點的元素(element)名稱,這樣你就可以看到treeview所綁定的節點層次。它不一定能夠顯示出你所需要的內容,但它提供了一個很好的出發點,未來你將更容易定制xml數據的顯示方式。

<asp:xmldatasource id="mysource" datafile="~/app_data/bookstore.xml" runat="server"/>
<asp:treeview id="treeview1" skinid="bookstore" datasourceid="mysource"
expanddepth="3" maxdatabinddepth="3" runat="server" />

  為了讓treeview顯示更有意義的內容,你可以為樹中的每個節點指定不同的數據綁定。為了定義層次數據項的字段如何映射到treenode屬性,你可以把treenodebinding對象添加到treeview的databindings集合中。treenodebinding的兩個重要屬性決定了如何在層次數據項集合上使用綁定。datamember屬性指定了數據項的類型或者xml數據中用于綁定的元素名稱。depth屬性指定了應用于層次樹的數據綁定的深度。你可以設置datamember或depth,或者兩個屬性都設置。例如,如果要定義xml文件中的所有book元素的數據綁定,只需要把datamember設置為"book"。為了定義所有深度為1的節點的數據綁定,只需要把depth設置為1。如果要定義深度為1的所有book節點,需要把treenodebinding對象的datamember設置為"book",同時把depth設置為1。

  當你設置了datamember或depth用于匹配節點集合之后,就可以定義treenodedatabinding的另外一些屬性來定制數據項的屬性(或xml數據中的xml節點屬性)如何映射到treeview控件的treenode的屬性。例如,textfield屬性定義了顯示為treenode文本的屬性名稱;類似地,valuefield屬性定義了作為treenode值的數據項屬性;navigateurlfield屬性定義了treenode導航鏈接的字段/屬性,等等。你還可以為一個已有數據綁定的treenode屬性指定靜態值。例如,指定book元素的treenode使用"book.gif"圖像、設置datamember屬性是"book"的treenodebinding的imageurl屬性。

  下面的例子演示了一個綁定到xml數據的treeview,數據綁定只應用在xml層次樹的特定元素上。

<databindings>
 <asp:treenodebinding datamember="bookstore" text="bookstore" imageurl="~/images/xp/folder.gif" />
 <asp:treenodebinding datamember="genre" textfield="name" imageurl="~/images/xp/folder.gif" />
</databindings>

  xmldatasource支持xpath屬性,你可以用它來過濾數據源所暴露的節點集合。在下面的例子中,xpath屬性被設置為bookstore/genre[@name='business']/book,以過濾數據源的節點,僅顯示"business"類型下的book元素。在指定xpath屬性的語法時要特別小心,否則可能出現數據源任何節點都不暴露的情況(相關的數據綁定控件也不會顯示)。

<asp:xmldatasource id="mysource" datafile="~/app_data/bookstore.xml" xpath="bookstore/genre[@name='business']/book" runat="server"/>

  請注意,treeview樹準確地匹配了源xml中的層次。由于這個原因,通常會為了綁定到treeview而具體構造xml,或者為了綁定到treeview而使用xsl轉換重新把數據構造為適當的分層結構。

<asp:xmldatasource id="mysource" datafile="~/app_data/bookstore2.xml" transformfile="~/app_data/bookstore2.xsl" xpath="bookstore/genre[@name='business']/book" runat="server"/>

  把表格式數據綁定控件綁定到分層數據源也是可行的,但是它只能顯示第一層數據。在下面的例子中,模板化的datalist控件綁定到bookstore xml文件。由于數據源暴露的頂層節點是<book/>節點,datalist可以在自己的itemtemplate模板中使用eval數據綁定語法綁定到這些節點的屬性。

<asp:datalist id="mydatalist" datasourceid="mysource" runat="server">
 <itemtemplate>
  <img alt="cover image" src='<%#"images/" + eval("isbn") + ".gif"%>'>
  <%# eval("title") %>
  isbn: <%# eval("isbn") %>
  price: <%# eval("price") %>
 </itemtemplate>
</asp:datalist>


  雖然只顯示一層也是有用的,但是如果能夠用嵌套的表格式數據綁定控件來顯示下面的層次應該會更好。幸運的是,asp.net 2.0允許你實現這種功能。除了eval數據綁定語法之外,asp.net 2.0還提供了基于xpath的數據綁定語法,在實現了ixpathnavigable接口的任何數據項上都可以使用它。有兩種可用的表達式類型:

  · xpath(expression, [formatstring]) - 根據數據項計算xpath表達式的值,返回單個值。

  · xpathselect(expression, [formatstring]) - 根據數據項計算xpath表達式的值,返回節點列表。

下面的例子是建立在前面的例子基礎之上的,它用xpath數據綁定表達式代替eval表達式綁定到book節點的屬性。從表面上看,這樣的操作與每個表達式的"@"前綴相比沒有什么更多功能,只是用于引用節點屬性的xpath語法。但是,xpath的真正靈活性就是依賴于這種引用層次中的任意項(不僅僅是屬性)的能力的。

  這個示例給外部datalist的itemtemplate模板另外增加了一個datalist,并把這個內部datalist的屬性綁定到一個描述當前book節點的chapter子節點的xpathselect表達式。在內部datalist的itemtemplate模板中,xpath數據綁定表達式根據這些"chapter"內容節點來計算值。asp.net 2.0利用這種技術,使你能夠通過組合表格式數據綁定控件簡便地構造出豐富的、分層的數據顯示方式。

 

<asp:datalist id="mydatalist" datasourceid="mysource" runat="server">
<itemtemplate>
 <img alt="cover image" src='<%# "images/" + xpath("@isbn") + ".gif" %>'>
 <%# xpath("@title") %>
 isbn: <%# xpath("@isbn") %>
 price: <%# xpath("@price") %>

 <asp:datalist id="mydatalist" datasource='<%# xpathselect("chapter") %>' runat="server">
 <itemtemplate>
 chapter <%# xpath("@num") %>:
 <%# xpath("@name") %>
 <%# xpath(".") %>
</itemtemplate>
</asp:datalist>

</itemtemplate>
</asp:datalist>

  為了處理數據綁定控件對特定位置的節點的請求,xmldatasource等層次數據源控件讓層次中的每個節點與唯一的路徑相對應。這樣就帶來了一些特性,例如treeview的按需求填充(popoulateondemand)特性,當某個節點被擴展的時候,來自數據源的節點才被發送到客戶端,而不是一次性地發送所有的節點。它也允許你在頁面代碼中用這種方式配置數據源來顯示特定位置的節點。不同的數據類型的路徑語法是不同的,而且不能在代碼中構造。但是,你可以使用treenode的datapath屬性來訪問綁定到treeview的節點的數據路徑。由于xmldatasource把xpath表達式作為自己的數據路徑語法,這些路徑也可以指定給xmldatasource的xpath屬性來進行節點列表的過濾。下面的例子演示了 這種技術,它使用xmldatasource實現了一個主-從表。例子中有兩個xmldatasource控件,其中一個綁定到treeview(主表控件),另一個綁定到datalist(從表控件)。當用戶點擊treeview節點的時候,就檢索它的datapath屬性,并把它賦予綁定到datalist的xmldatasource控件,以顯示被點擊的節點的詳細信息。

sub mytreeview_selectednodechanged(sender as object, e as eventargs)
 dim path as string = mytreeview.selectednode.datapath
 mydetailssource.xpath = path
 mydatalist.datasource = mydetailssource
 mydatalist.databind()
end sub
  綁定到站點導航數據(site navigation)

  站點導航數據是asp.net中的另外一種層次數據。asp.net 2.0不僅支持使用asp.net中的站點導航api編程訪問站點地圖數據,還支持使用sitemapdatasource控件進行宣告式的數據綁定。當你把treeview(或menu)控件綁定到sitemapdatasource的時候,站點地圖的text和url屬性可以綁定到treenode(或menuitem)。盡管你可以用一個數據綁定集合來建立這種綁定,但是這樣的操作不是必要的。treeview和 menu控件自動地把treenode或 menuitem的text和navigateurl屬性綁定到相關的站點地圖屬性(這是使用sitemapnode的inavigateuidata接口實現的)。當treeview和menu綁定到sitemapdatasource的時候,它們還有一個特性,會自動地把selectednode或selecteditem屬性設置為站點地圖中的當前節點。

  下面的例子演示了一個綁定到sitemapdatasource控件的treeview。盡管這個例子使用的是數據綁定集合,但是如果你只需要綁定到節點的text和url屬性,這樣的操作就是沒必要的。

<asp:sitemapdatasource id="sitemapsource" runat="server"/>
 <asp:treeview id="mytreeview" skinid="bulletedlist3"
 datasourceid="sitemapsource" runat="server">
 <databindings>
  <asp:treenodebinding textfield="title" navigateurlfield="url" />
 </databindings>
</asp:treeview>

 

 綁定到關系數據庫

  當關系數據庫中的多個表通過外部鍵相關聯的時候,也可以用層次結構來表現。例如,在產品數據庫中,產品與產品類別關聯,它們就可以用類別和產品之間的層次(1對多)關系來表現。盡管當前的asp.net版本沒有包含一個用于把關系數據顯示為層次結構的控件,你仍然可以通過編程填充層次的數據綁定控件(例如treeview或menu)的節點/數據項來實現這種目的。下面的例子顯示了一個用關系數據庫填充的treeview控件。這個例子利用treeview的populateondemand特性,按需求(客戶端上擴展某個treenode的時候)來填充子節點。

 

sub getproductcategories(byval node as treenode)
 dim categories as categorylist = warehousedb.getproductcategories()
 dim c as category
 for each c in categories
  dim newnode as treenode = new treenode(c.name, c.id)
  newnode.selectaction = treenodeselectaction.expand
  newnode.populateondemand = true
  node.childnodes.add(newnode)
 next
end sub

sub getproductsforcategory(byval node as treenode)
 dim categoryid as string = node.value
 dim products as productlist = warehousedb.getproductsforcategory(categoryid)
 dim p as product
 for each p in products
  dim newnode as treenode = new treenode(p.name, p.id)
  node.childnodes.add(newnode)
 next
end sub

sub populatenode(byval source as object, byval e as treenodeeventargs)
 select case e.node.depth
  case 0
   getproductcategories(e.node)
  case 1
   getproductsforcategory(e.node)
 end select
end sub

<asp:treeview id="treeview1" ontreenodepopulate="populatenode" skinid="simple" width="250" expanddepth="0" runat="server">
<nodes>
<asp:treenode text="inventory" selectaction="expand" populateondemand="true"/>
</nodes>
</asp:treeview>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 钦州市| 旌德县| 台安县| 福建省| 晋江市| 扶风县| 鹿泉市| 乐昌市| 格尔木市| 邳州市| 绩溪县| 根河市| 平武县| 巩留县| 阿图什市| 铁岭市| 正安县| 桐庐县| 买车| 咸阳市| 邵武市| 沾益县| 岫岩| 苍南县| 原平市| 嫩江县| 晋江市| 嵊州市| 通榆县| 锦州市| 许昌市| 叙永县| 屏山县| 京山县| 榆树市| 镇坪县| 兴隆县| 抚远县| 兴隆县| 白沙| 金平|