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

  • 相关阅读:
    RecyclerView 数据刷新的几种方式 局部刷新 notify MD
    【图片】批量获取几万张图片
    RV BaseRecyclerViewAdapterHelper 总结 MD
    RecyclerView.ItemDecoration 间隔线
    Kotlin【简介】Android开发 配置 扩展
    Kotlin 特性 语法糖 优势 扩展 高阶 MD
    一个十分简洁实用的MD风格的UI主框架
    折叠伸缩工具栏 CollapsingToolbarLayout
    FloatingActionButton FAB 悬浮按钮
    Glide Picasso Fresco UIL 图片框架 缓存 MD
  • 原文地址:https://www.cnblogs.com/Charles2008/p/1294824.html
Copyright © 2011-2022 走看看