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

我想讓dgReports開始工作。 請注意,電子郵件文本框工作得很好。如何創建一個嵌套的GridView綁定到父級的EntityDataSource的導航屬性?

回答

0

我確實創建了獨立的內部數據源,但我又遇到了另一個問題。 我無法將Where子句設置爲父實體的ID。

請注意,FormView.DataItem不可訪問;它是EntityDataSourceWrapper類型,它是一個朋友類,不可訪問。

所以我創建了一個函數來處理它的反射。

我認爲這是一個微軟的bug,直到他們解決了這個問題,對於任何使用嵌套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 

注意模型的層次結構:帳戶有很多報道。

相關問題