关于VB.NET中实现嵌套数据控件中数据绑定的问题(原创)
关于VB.NET中实现嵌套数据控件中数据绑定的问题LanFan [原创]
在ASP.NET中经常会用到嵌套的数据控件,比如Repeater、DataList、DataGrid等的相互嵌套。在嵌套的数据控件中通常采用父表和子表的形式绑定数据,将父表数据绑定到最外层数据控件,子表数据绑定到内层数据控件。对于该数据绑定问题网上已有很多讨论,但用C#实现的居多,在VB.NET中很多人遇到了一些问题。
我使用比较简单的Repeater嵌套Repeater做为例子,在此我借用kwklover在《ASP.NET的层次数据显示技术》中的例子。在数据绑定中关键的一句语句在C#中是如下形式:
<asp:repeater id="ChildRepeater" datasource='<%# ((DataRow)Container.DataItem).GetChildRows("RelationName") %>' runat="server">
<itemtemplate>
职员:<%# DataBinder.Eval(Container.DataItem, "[/"lname/"]")%>=
<%# DataBinder.Eval(Container.DataItem, "[/"fname/"]")%><br>
</itemtemplate>
</asp:repeater>
我们把该句转换到VB中则为:
<asp:repeater id="ChildRepeater" datasource='<%# CType(Container.DataItem,DataRowView).Row.GetChildRows("RelationName") %>' runat="server">
<itemtemplate>
职员: <%# DataBinder.Eval(Container.DataItem, "lname")%> =
<%# DataBinder.Eval(Container.DataItem, "fname")%> <br>
</itemtemplate>
</asp:repeater>
编译时将会出现 "DataBinder.Eval:“System.Data.DataRow”不包含名称为 lname 的属性" 的错误
经过多次试验,得到了解决这个问题的两种方法:
一、就是kwklover在《ASP.NET的层次数据显示技术》中采用的,使用CreateChildView方法:
完整的例子是这样
import System.Data
import System.Data.SqlClient
dim objConn as new SqlConnection("Data Source=Localhost;Database=Pubs;userid=sa;password=sa")
objConn.Open()
dim strSql as string="Select * from jobs;Select * from employee"
dim objAdapter as new SqlDataAdapter(strSql,objConn)
dim objDs as new DataSet()
objAdapter.Fill(objDs)
objConn.Close()
'设定两个表的名称
objDs.Tables(1).TalbeName="jobs"
objDs.Tables(0).TableName="employee"
'为这两个表添加关系
dim Parent as DataColumn=objDs.Tables("jobs").Columns("job_id")
dim Child as DataColumn=objDs.Tables("employee").Columns("job_id")
objDs.Relations.Add("RelationName",Parent,Child)
'数据绑定到ParentRepeater:
ParentRepeater.DataSource=objDs.Tables("jobs").DefaultView
ParentRepeater.DataBind()
在html里加入下面的代码:
<asp:repeater id="ParentRepeater" runat="server">
<itemtemplate>
职位:<%# DataBinder.Eval(Container.DataItem,"job_desc") %><br>
<asp:repeater id="ChildRepeater" runat="server" DataSource='<%# CType(Container.DataItem,DataRowView).CreateChildView("RelationName") %>'>
<itemtemplate>
职员:<%# DataBinder.Eval(Container.DataItem,"lname") %>
<%# DataBinder.Eval(Container.DataItem,"fname") %>
</itemtemplate>
</asp:repeater>
</itemtemplate>
</asp:repeater>
二、将<%# DataBinder.Eval(Container.DataItem, "lname")%>改为
<%# DataBinder.Eval(Container.DataItem, "(lname)")%>
即:
<asp:repeater id="ChildRepeater" datasource='<%# CType(Container.DataItem,DataRowView).Row.GetChildRows("RelationName") %>' runat="server">
<itemtemplate>
职员: <%# DataBinder.Eval(Container.DataItem, "(lname)")%> =
<%# DataBinder.Eval(Container.DataItem, "(fname)")%> <br>
</itemtemplate>
</asp:repeater>
我个人认为因为GetChildRows返回的是DataRow集合不是DataTable,子表中Container.DataItem中的内容是DataRow,DataBinder.Eval把"lname"作为DataRow的属性连接成DataRow.lname,因此出现"DataBinder.Eval:“System.Data.DataRow”不包含名称为 lname 的属性"的错误,而当我们"lname"改为"(lname)"后DataBinder.Eval则把二者连接为DataRow("lname")因此能正确编译,改为"[lname]"也可以。
另外,还可以直接写成: <%# Container.DataItem("lname") %>
- 点赞
- 收藏
- 分享
- 文章举报
- 我是才开始学习VB的,哪位好心的耐心的朋友愿意收我作学生?
- vba笔记
- VBA字典
- 关于Xldown和Xlup的用法(Excel VBA)
- excel vba 快速获取某工作表最后行数(首列不为空值)
- VB 通过进程PID获取该程序的窗口句柄函数
- VB 通过进程PID获取该程序的窗口句柄函数
- VB 中自定义弹出提示框的位置
- VBA,两个sheet根据 4000 第一列id相同比较其余列,不同的值放到sheet3中
- solaris vbs巡检脚本
- vb的LINQ实现
- VB.NET 使用CHART控件做实时曲线
- VB总结
- 用VB制作文件下载程序(转)
- LGT8F328P-SSOP20 MiniEVB与USB--TTL烧录器连接
- VB调用.NET DLL(一)
- VB.NET水晶报表Crystal Reports学习(开发环境安装+程序示例+报表示例+客户端运行环境)
- 【求助】如何将循环检测中的代码检测到后只循环一次(vbs语言)
- VB6.0的DllFunctionCall
- VB程序中如何找到自定义函数