移动项目开发笔记(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

原文地址:https://www.cnblogs.com/Charles2008/p/1294824.html