¿Cómo se crea un GridView anidada con destino a los padres EntityDataSource propiedad de navegación?
Pregunta
<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" />
Quiero que los DGREPORTS para empezar a trabajar. Tenga en cuenta que el cuadro de texto de correo electrónico funciona bien.
Solución
Yo a la verdad creado fuentes de datos internas separadas, pero tengo otro problema. Yo era incapaz de establecer la cláusula Donde Identificación de la Entidad de los padres.
Tenga en cuenta que la FormView.DataItem no es accesible; que es de tipo EntityDataSourceWrapper que es una clase de amigo y de difícil acceso.
Así que creé una función para tratar con él por la reflexión.
Creo que es un error de Microsoft, hasta que lo fijan, lo siguiente podría ser útil para cualquier persona que utiliza controles anidados EntityDataSource.
Aquí 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
Ahora en el código detrás hago lo siguiente:
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
Tenga en cuenta la jerarquía en el modelo. Cuenta tiene muchos informes