Wie kann ich eine geschachtelte Gridview gebunden Eltern EntityDataSource Navigationseigenschaft erstellen?
Frage
<asp:FormView DataSourceId="edsAccounts">
<ItemTemplate>
<asp:TextBox Text='<%# Eval("Email") %>' />
<asp:DataGrid ID="dgReports" DataSource='<%# Eval("Reports") %>'>
</ItemTemplate>
</asp:FormView>
<asp:EntityDataSource ID="edsAccounts" runat="server" ConnectionString="name=Entities" DefaultContainerName="Entities" EntitySetName="Accounts" EntityTypeFilter="Account" Include="Reports" />
Ich möchte die dgReports zu arbeiten. Beachten Sie, dass das E-Mail-Textfeld funktioniert gut.
Lösung
ich in der Tat separate innere Datenquellen erstellt, aber ich habe ein anderes Problem. Ich war nicht in der Lage, die Where-Klausel auf das Mutterunternehmens der ID.
Beachten Sie, dass das FormView.DataItem nicht zugänglich ist; es ist vom Typ EntityDataSourceWrapper, die ein Freund der Klasse ist und nicht zugänglich.
Also habe ich eine Funktion erstellt mit ihm durch Reflexion befassen.
Ich denke, es ist ein Microsoft Bug, bis sie es zu beheben, die die folgenden sein könnte sehr nützlich für jeden verschachtelten 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
Jetzt im Code hinter mir 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