Comment puis-je créer un GridView imbriqué lié à la propriété de navigation des parents?
Question
<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" />
Je veux que les DGREPORTS de commencer à travailler. Notez que la zone de texte de courrier électronique fonctionne très bien.
La solution
Je créé en effet datasources intérieur séparés, mais je suis un autre problème. Je ne pouvais pas régler la clause Where à l'ID de l'entité mère.
Notez que le FormView.DataItem n'est pas accessible; il est de type EntityDataSourceWrapper qui est une classe ami et inaccessible.
Je créé une fonction pour y faire face par la réflexion.
Je pense qu'il est un bug de Microsoft, jusqu'à ce qu'ils le réparer, ce qui suit pourrait être utile à tous ceux qui utilise des contrôles EntityDataSource imbriqués.
Ici, il est:
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
dans le code derrière je fais ce qui suit:
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
Notez la hiérarchie dans le modèle. Compte a de nombreux rapports