0
<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 starten zu arbeiten. Beachten Sie, dass das E-Mail-Textfeld einwandfrei funktioniert.Wie erstelle ich ein verschachteltes GridView, das an die Navigationseigenschaft der EntityDataSource des übergeordneten Elements gebunden ist?

Antwort

0

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.