移动项目开发笔记(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:[email protected]

Email:[email protected]

 

 

你可能感兴趣的:(contain)