Как мне создать вложенный GridView, привязанный к свойству навигации родительского EntityDataSource?

StackOverflow https://stackoverflow.com/questions/992035

Вопрос

<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" />

Я хочу, чтобы dgReports начали работать.Обратите внимание, что текстовое поле электронной почты работает просто отлично.

Это было полезно?

Решение

Я действительно создал отдельные внутренние источники данных, но у меня возникла другая проблема.Мне не удалось установить предложение Where в качестве идентификатора родительской сущности.

Обратите внимание, что FormView.Элемент данных недоступен;это тип EntityDataSourceWrapper, который является дружественным классом и недоступен.

Поэтому я создал функцию, чтобы справиться с этим путем отражения.

Я думаю, что это ошибка Microsoft, пока они ее не исправят, следующее может быть полезно всем, кто использует вложенные элементы управления EntityDataSource.

Вот оно:

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

Теперь в приведенном ниже коде я делаю следующее:

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

Обратите внимание на иерархию в модели:Учетная запись имеет много отчетов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top