logo

以 XML 文件为数据源进行嵌套绑定

作者:孟宪会 阅读:919 发表于:2011-07-05 10:17:25

在实际的应用中,经常使用 XML 数据源进行绑定,对于单层的数据绑定比较简单,如果进行嵌套绑定,该如何实现呢?下面的方法就是在绑定事件里得到数据项,然后进行嵌套绑定的例子。XmlDataSOurce数据源的数据项类型是 System.Web.UI.WebControls.XmlDataSourceNodeDescriptor,它实现了IXPathNavigable 接口,因此可以创建 XPathNavigator 对象。例如下面的方法:

C# 代码
System.Xml.XPath.XPathNavigator nav = ((System.Xml.XPath.IXPathNavigable)e.Item.DataItem).CreateNavigator();
System.Xml.XPath.XPathNodeIterator it
= nav.Select("./District");
也可以以 IEnumerable 形式的 XmlNodeList 返回,然后进行绑定:
C# 代码
IEnumerable em = XPathBinder.Select(e.Item.DataItem, "District") as IEnumerable;
em.GetEnumerator();
Repeater Repeater4
= e.Item.FindControl("Repeater4") as Repeater;
Repeater4.DataSource
= em;
Repeater4.DataBind();
完整的例子代码如下:
ASPX 代码
<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
  protected
void Page_Load(object sender, EventArgs e)
  {
    XmlDataSource xds
= new XmlDataSource();
    xds.DataFile
= "~/2.xml";
    xds.ID
= "XmlDataSource1";
    form1.Controls.Add(xds);
    Repeater1.DataSourceID
=  Repeater3.DataSourceID = "XmlDataSource1";
    Repeater1.DataBind();
    Repeater3.DataBind();
  }

  protected
void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
  {
    
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {
      System.Xml.XPath.XPathNavigator nav
= ((System.Xml.XPath.IXPathNavigable)e.Item.DataItem).CreateNavigator();
      System.Xml.XPath.XPathNodeIterator it
= nav.Select("./District");
      Repeater Repeater2
= e.Item.FindControl("Repeater2") as Repeater;
      Repeater2.DataSource
= it;
      Repeater2.DataBind();
    }
  }
  protected
void Repeater3_ItemDataBound(object sender, RepeaterItemEventArgs e)
  {
    
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {      
      IEnumerable em
= XPathBinder.Select(e.Item.DataItem, "District") as IEnumerable;
      em.GetEnumerator();
      Repeater Repeater4
= e.Item.FindControl("Repeater4") as Repeater;
      Repeater4.DataSource
= em;
      Repeater4.DataBind();
    }
  }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
  
<form id="form1" runat="server">
  
<h1>方法1</h1>
  
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
    
<ItemTemplate>
      
<h2 style="background: #ede">
        
<%#XPath("@text")%></h2>
      
<asp:Repeater ID="Repeater2" runat="server">
      
<HeaderTemplate><table border="1"></HeaderTemplate><FooterTemplate></table></FooterTemplate>
        
<ItemTemplate>
          
<tr><td><%#XPath("@value")%></td><td><%#XPath("@text")%></td></tr>
        
</ItemTemplate>
      
</asp:Repeater>
    
</ItemTemplate>
  
</asp:Repeater>
  
<h1>方法2</h1>
  
<asp:Repeater ID="Repeater3" runat="server" OnItemDataBound="Repeater3_ItemDataBound">
    
<ItemTemplate>
      
<h2 style="background: #ede">
        
<%#XPath("@text")%></h2>
      
<asp:Repeater ID="Repeater4" runat="server">
      
<HeaderTemplate><table border="1"></HeaderTemplate><FooterTemplate></table></FooterTemplate>
        
<ItemTemplate>
          
<tr><td><%#((System.Xml.XmlNode)Container.DataItem).Attributes["value"].Value %></td><td><%#XPath("@text")%></td></tr>
        
</ItemTemplate>
      
</asp:Repeater>
    
</ItemTemplate>
  
</asp:Repeater>
  
</form>
</body>
</html>
xml 文件格式如下:
XML 代码
<?xml version="1.0" encoding="utf-8"?>
<Cities>
  
<City text="北京" value="bj">
    
<District value="haidian" text="海淀区"></District>
    
<District value="changping" text="昌平区"></District>
    
<District value="chaoyang" text="朝阳区"></District>
    
<District value="pinggu" text="平谷区"></District>
  
</City>
  
<City text="上海" value="sh">
    
<District value="pudong" text="浦东区"></District>
    
<District value="xuhui" text="徐汇区"></District>
  
</City>
  
<City text="郑州" value="zz">
    
<District value="erqi" text="二七区"></District>
    
<District value="huiji" text="惠济区"></District>
    
<District value="jinshui" text="金水区"></District>
  
</City>
</Cities>