项目中用到了一个Repeate控件的一个ItemTemplate中嵌套了一个GridView中,这样数据绑定的时候首先就先绑定外层的Repeate控件,在Repeate控件中ItemDataBound()事件中对GridView控件进行绑定.
从项目中提取出下面的模型:见下的Repeater嵌套一个GridView控件.
<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"这个字段,需要绑定到父级的数据源中的一个字段。改怎么写这个绑定表达式呢?
经过不断的尝试和查找资料终于找到了这种嵌套绑定表达式的写法:
我们分析一下上面这段代码中含义:
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字段。
按照上面的代码分析就比较容易访问父级(多级)数据源中的字段了。
下面是一些常见的写法,供朋友们分享:
<%# 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")%>另外不太常见的:
Microsoft说这种方法的效率要比以上两种高。
还要记住要这样用必须要在前台页面导入名称空间System.Data,否则会生成错误信息。
<%@ Import namespace="System.Data" %>
最后希望朋友们提出意见,有什么问题和不正确的地方,请多多指教。
Charles Chen
msn:Charles.C.Chen@newegg.net
Email:gotosunny@msn.com