我确实创建了单独的内部数据源,但我遇到了另一个问题。我无法将 Where 子句设置为父实体的 ID。
请注意,FormView.DataItem 不可访问;它是 EntityDataSourceWrapper 类型,它是一个朋友类并且不可访问。
所以我创建了一个函数来通过反射来处理它。
我认为这是微软的错误,在他们修复它之前,以下内容可能对任何使用嵌套 EntityDataSource 控件的人有用。
这里是:
Module Functions
Public Function GetEntity(Of TEntity As EntityObject)(ByVal entityDataSourceWrapper As Object) As TEntity
If entityDataSourceWrapper Is Nothing Then Return Nothing
Dim type = entityDataSourceWrapper.GetType()
If Not type.FullName = "System.Web.UI.WebControls.EntityDataSourceWrapper" Then Return Nothing
Dim wrapper = type.GetProperty("WrappedEntity", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
Return DirectCast(wrapper.GetValue(entityDataSourceWrapper, Nothing), TEntity)
End Function
End Module
现在在后面的代码中,我执行以下操作:
Protected Sub fvAccounts_DataBound(ByVal sender As Object, ByVal e As EventArgs) Handles fvAccounts.DataBound
If fvAccounts.CurrentMode <> FormViewMode.ReadOnly Then Exit Sub
Dim account As Account = GetEntity(Of Account)(fvAccounts.DataItem)
If account Is Nothing Then Exit Sub
Dim edsReports As EntityDataSource = fvAccounts.Row.FindControl("edsReports")
edsReports.Where = "it.Account.AccountId = " & account.AccountId
gvReports.DataBind()
End Sub
注意模型中的层次结构:客户有很多报告。