数据控件的嵌套问题

private   void  DL1_ItemDataBound( object  sender, System.Web.UI.WebControls.DataListItemEventArgs e)
        
{
            Repeater rpt
=(Repeater)e.Item.FindControl("Rp1");
            SqlCommand cm
=new SqlCommand("PWebShowzhuanti2",conn);
            cm.CommandType
=CommandType.StoredProcedure;
            cm.Parameters.Add(
"@w1id",SqlDbType.Int);
            cm.Parameters[
"@w1id"].Value=DL1.DataKeys[(int)e.Item.ItemIndex].ToString();
            
//DataKeys返回的是此行中无论哪一列的key,而且是DataKey,就是数据库中的主键值,当然前提是此数据控件还必须绑定DataKeyFild.
            
//上例中keys加s,是因为每行都会有key,所以多行当然是s了。
            
//好像加了Data就返回数据库中的某些东东。
            
//Item是指一行或一列,有时出现items,是因为这是一个横竖都有的表格。
            
//在上例中,e.Item返回的就是当前行。
            
//页面前台的容器(Container),实际上就是后台的:e.Item,如:Container.DataItem就是e.Item.DataItem
            SqlDataReader dr=cm.ExecuteReader(); 
            rpt.DataSource
=dr;
            rpt.DataBind();
            dr.Close();

        }

 而前台代码:

 

< asp:datalist  id ="DLlie"  runat ="server"  ShowFooter ="False"  ShowHeader ="False"  CellPadding ="0"
                BorderWidth
="0px"  RepeatDirection ="Horizontal"  RepeatColumns ="2"  Width ="720" >
                
< ItemStyle  Height ="22px"  CssClass ="xuxian" ></ ItemStyle >
                
< ItemTemplate >
                    
< href ='moreweb.aspx?wid=<%#  DataBinder.Eval(Container.DataItem,"w1id") % > '> < b >
                            
<% # DataBinder.Eval(Container.DataItem,"leixing" %>
                        
</ b ></ a >
                    
< asp:repeater  id ="Rp2"  runat ="server"  datasource ='<%#  ((DataRowView)Container.DataItem).Row.GetChildRows("myRelation") % > '>
                        
< ItemTemplate >
                            |
< href ='Moreweb.aspx?wid=<%#  DataBinder.Eval(Container.DataItem,"["w1id"]") % > '> <% # DataBinder.Eval(Container.DataItem,"["leixing"]" %> </ a >
                        
</ ItemTemplate >
                    
</ asp:repeater >
                
</ ItemTemplate >
            
</ asp:datalist >

上面的:页面前台的容器(Container),实际上就是后台的:e.Item,如:Container.DataItem就是e.Item.DataItem

其实,数据控件返回的就是DefaultView,所以,前台最好用DataRowView 来处理各种数据。

从《ADO.NET》书中看的:DataView其实与DataTable的select()方法作用一样,只是DataView是独立的类,是一个视图。每个DataTable都有一个默认的视图,即:DefaultDataView,每一行也有一个默认的View。所以ADO.NET中的每一行实际就是一个DataRowView。那上面中出现这个词也就不稀罕了。
DataRowView只是一行记录而已(DataView相当于表),所以不存在rows的属性,只有row属性。
上面的DataRowView实际上和数据控件中的Item或DataItem是一样的,都是一行记录。

另外,同样是前台引用后台数据:

    • <@% DataBinder.Eval(Container.DataItem, "ColumnName") %>
    • <@% DataBinder.Eval(Container.DataItem, "ColumnName", null) %>
    • <@% DataBinder.Eval(Container, "DataItem.ColumnName", null) %>
    • <@% ((DataRowView)Container.DataItem)["ColumnName"] %>
    • <@% ((DataRowView)Container.DataItem).Row["ColumnName"] %>

关于常见于数据绑定表达式中的Container、DataItem、DataBinder.Eval是这样:DataBinder是System.Web里面的一个静态类,它提供了Eval方法用于简化数据绑定表达式的编写,但是它使用的方式是通过Reflection等开销比较大的方法来达到易用性,因此其性能并不是最好的。而Container则根本不是任何一个静态的对象或方法,它是ASP.NET页面编译器在数据绑定事件处理程序内部声明的局部变量,其类型是可以进行数据绑定的控件的数据容器类型(如在Repeater内部的数据绑定容器叫RepeaterItem),在这些容器类中基本都有DataItem属性,因此你可以写Container.DataItem,这个属性返回的是你正在被绑定的数据源中的那个数据项。如果你的数据源是DataTable,则这个数据项的类型实际是DataRowView。

乍一看1-3都是使用DataBinder.Eval方法来进行数据绑定计算,而4-5是使用strong type直接获取数据绑定的值。按照我之前的推理,很多朋友会认为4-5都会比1-3快,而实际上第4种用法也是在网上很常见的一种针对DataBinder.Eval而进行的“优化”。

实际上根据我们的测试,第4种写法的效率在某些很常见的情形下(即传入的字段名与数据表内部的字段名大小写有出入时)甚至比不上最普遍的第1种写法。不过原理还是对的,就是避免通过reflection或类似机制(如System.ComponentModel中的PropertyDescriptor机制)获得数据,然而使用DataRowView的indexer的效率在字段数量较多导致Hashtable产生寻址冲突时不如使用其Row属性(DataRow类型)的indexer的效率。原因是DataRowView的indexer实现了view的功能,而这个功能对于大多数应用在这个场合都是不需要的,且它的开销甚至比DataBinder.Eval还要大!(本段内容过于武断,在被反复质疑之下我又做了若干试验寻得正确原因)因此简单的使用第五种写法通常是可以获得较佳的性能的,而最好不要在不必要的时候直接使用DataRowView的indexer。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值