Ich habe zwar separate innere Datenquellen erstellt, aber ich habe ein anderes Problem. Ich konnte die Where-Klausel nicht auf die ID der Entität des übergeordneten Elements festlegen.
Beachten Sie, dass auf das FormView.DataItem nicht zugegriffen werden kann; Es ist vom Typ EntityDataSourceWrapper, das eine Freundesklasse ist und auf die nicht zugegriffen werden kann.
Also habe ich eine Funktion erstellt, um damit durch Reflexion umzugehen.
Ich denke, es ist ein Microsoft-Bug, bis sie es beheben, könnte das folgende nützlich für jeden sein, der verschachtelte EntityDataSource-Steuerelemente verwendet.
Hier ist sie:
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
nun im Code hinter ich folgendes tun:
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
Beachten Sie die Hierarchie im Modell: Konto viele Berichte hat.