dataView妙用

有个xml文件以前用循环,然后用StringBuilder拼接输出到页面,这种写法却不被人认可,首先就是繁琐,其次,性能不一定好。

今天想着写了另外一种写法。

Xml结构分三层

ContractedBlock.gif ExpandedBlockStart.gif xml
 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 2<valumes bid="8738">
 3  <valume vid="48035" title="卷一 地球,中国,2009">
 4    <chapter>
 5      <cid>1634944</cid>
 6      <name>第一章 反穿越:皇上飞升啦</name>
 7    </chapter>
 8    <chapter>
 9      <cid>1634946</cid>
10      <name>第二章 地球,中国,2009</name>
11    </chapter>
12   </valume>
13<valume vid="48035" title="卷一 地球,中国,2009">
14    <chapter>
15      <cid>1634944</cid>
16      <name>第一章 反穿越:皇上飞升啦</name>
17    </chapter>
18    <chapter>
19      <cid>1634946</cid>
20      <name>第二章 地球,中国,2009</name>
21    </chapter>
22   </valume>
23</valumes>

上面只是实例,一看这个结构,很不利于dataset的绑定,后来一个个的试,发现到 dataset.read()可以为每层xml结构生成一个datatable,datatable中又为每个节点生产一个节点Id,我如果要绑定到repeater中很不好帮,上面的三层,生产三个datatable,既然有生成节点id,那就好办了,就像表的外连接呗,用两个repeater嵌套

ContractedBlock.gif ExpandedBlockStart.gif repeater
 1<table width="100%"> 
 2         <asp:Repeater ID="rep1" runat="server" OnItemDataBound="rep1_ItemDataBound">
 3         <ItemTemplate >
 4        
 5            <tr>
 6ExpandedBlockStart.gifContractedBlock.gif                <td colspan="2" style="text-align:center"> 目录:<%Eval("title"%></td>                
 7            </tr>
 8           
 9         <asp:Repeater ID="rep2" runat="server">
10         <ItemTemplate>
11             <tr>
12ExpandedBlockStart.gifContractedBlock.gif                <td><%Eval("cid"%></td>
13ExpandedBlockStart.gifContractedBlock.gif                <td><%Eval("name"%></td>
14               
15            </tr>
16         </ItemTemplate>
17         </asp:Repeater>
18         </ItemTemplate>           
19    </asp:Repeater>
20</table>

外层repeater绑定时传入内层repeater节点id,然后内层使用dataview 加工,分层绑定

ContractedBlock.gif ExpandedBlockStart.gif cs
 DataSet ds = null;
    
protected void Page_Load(object sender, EventArgs e)
    {
        
if (!IsPostBack)
        {

            BindGv();
        
        }


    }


    
public void BindGv()
    {
         ds 
= Xml.ReadXml(Server.MapPath("47.xml"));
      
        Response.Write(ds.Tables.Count
+"");
        
this.gv.DataSource = ds.Tables[1];
        gv.DataBind();
        
if (ds.Tables.Count != 0)
        {
            
this.rep1.DataSource = ds.Tables[1];
            rep1.DataBind();
        }
    
    }
    
protected void rep1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        Repeater rep2 
= e.Item.FindControl("rep2"as Repeater;
        
string valumeid = (e.Item.DataItem as DataRowView)["valume_Id"].ToString();
        
if (ds.Tables.Count >= 2)
        {           
            DataView dv 
=new DataView(ds.Tables[2]);            
            dv.RowFilter 
= " valume_Id="+valumeid;
            rep2.DataSource 
= dv.ToTable();
            rep2.DataBind();
        }
    }

上面的有个获取valume_id的字段就是节点id,相当于外键。

结果:

 

转载于:https://www.cnblogs.com/IT-Cristian/archive/2009/07/16/1525005.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值