zoukankan      html  css  js  c++  java
  • 移动项目开发笔记(Container.DataItem的扩展)

          项目中用到了一个Repeate控件的一个ItemTemplate中嵌套了一个GridView中,这样数据绑定的时候首先就先绑定外层的Repeate控件,在Repeate控件中ItemDataBound()事件中对GridView控件进行绑定.

    从项目中提取出下面的模型:见下的Repeater嵌套一个GridView控件.

     <asp:Repeater runat="server" ID="repBalanceAudit" OnItemDataBound="repBalanceAudit_ItemDataBound">
                                                
    <HeaderTemplate>
                                                   
                                                
    </HeaderTemplate>
                                                
    <ItemTemplate>
                                                    
    <%#DataBinder.Eval(Container.DataItem,"A_Status"%>
                                                  
    <asp:GridView runat="server" ID="dgView">
                                                    
    <Columns>
                                                        
    <asp:TemplateField>
                                                            
    <ItemTemplate>
                                                                
    <%#DataBinder.Eval(Container.DataItem,"B_Status"%>
                                                            
    </ItemTemplate>
                                                        
    </asp:TemplateField>
                                                    
    </Columns>
                                                  
    </asp:GridView>
                                                
    </ItemTemplate>
                                                
    <FooterTemplate>
                                                  
                                                
    </FooterTemplate>
                                            
    </asp:Repeater>

    项目中要求在GridView控件dgView(如上)中ItemTemplate中绑定的<%#Eval("B_Status")%>改变。改变成绑定到Repeate中的数据源字段"A_Status"上,

    然而这个GridView所指向的数据源中并不包含"A_Status"这个字段,需要绑定到父级的数据源中的一个字段。改怎么写这个绑定表达式呢?

    经过不断的尝试和查找资料终于找到了这种嵌套绑定表达式的写法:

    <%# DataBinder.Eval(((RepeaterItem)((GridViewRow)Container).Parent.Parent.Parent).DataItem, "A_Status")%> 

    我们分析一下上面这段代码中含义:

    1.首先把Container转换成GridViewRow对象,因为当前的Container表示GridView的一行即是:GridViewRow.

    2.然后((GridViewRow)Container).Parent表示获取当前行的父级,即类型为ChildTable对象。因为一个GridView包含的ChildTable有很多GridViewRow对象。

    3.((GridViewRow)Container).Parent.Parent为当前的GridView控件即dgView对象。

    4.((GridViewRow)Container).Parent.Parent.Parent为当前的GridView控件的父级控件为RepeateItem。

    5.最后需要把该对象强制转换成RepeateItem对象。找它的A_Status字段。

    按照上面的代码分析就比较容易访问父级(多级)数据源中的字段了。

    下面是一些常见的写法,供朋友们分享:

    For nested Repeaters:

    <%# DataBinder.Eval(((System.Web.UI.WebControls.RepeaterItem)Container.Parent.Pðarent).DataItem, "FieldName"%> 

    For nested Repeater/Gridview\

    <%# DataBinder.Eval(((RepeaterItem)((GridViewRow)Container).Parent.Parent.Parent).DataItem, "FieldName")%> 

    For Repeater/Repeater/Gridview

    <%# DataBinder.Eval(((RepeaterItem)((GridViewRow)Container).Parent.Parent.Parent.Parent.Parent).DataItem, "FieldName")%>

    另外补充说明一下另外一些关于数据绑定格式的写法:在绑定数据时经常会用到这个句程序:<%# DataBinder.Eval(Container.DataItem,"xxxx")%>或者<%# DataBinder.Eval(Container,"DataItem.xxxx")%>

    .net 2.0出现了新的写法:<%#Eval("xxxx")%>另外不太常见的:

    <%# ((DataRowView)Container.DataItem)["xxxx"]%> 

    Microsoft说这种方法的效率要比以上两种高。

    还要记住要这样用必须要在前台页面导入名称空间System.Data,否则会生成错误信息。

    <%@ Import namespace="System.Data" %>

    最后希望朋友们提出意见,有什么问题和不正确的地方,请多多指教。

    Charles Chen

    msn:Charles.C.Chen@newegg.net

    Email:gotosunny@msn.com

  • 相关阅读:
    Debian vim没有颜色的解决办法
    第四次作业
    第三次作业
    第二次作业
    Mad Libs游戏 & 华氏温度与摄氏温度转换
    有趣故事
    Mybatis的使用及增删改查
    jdbc数据连接池
    详解MySQL数据类型
    SQL语法大全
  • 原文地址:https://www.cnblogs.com/Charles2008/p/1294824.html
Copyright © 2011-2022 走看看