2009-11-27 34 views
0

我只是玩一些LINQ和asp.net - 絕對初學者,所以我甚至不知道如何問我的問題。將gridview連接到多個表linqdatasource

無論如何,我有一個MSSQL數據庫與ASP會員信息。出於各種原因(主要是爲了將簡介信息存儲在清晰的列中而不是一個一個)我使用的是自定義配置文件提供程序,因此我的配置文件信息分佈在數據庫中的幾個表中。

我有正常的aspnet_membership和aspnet_profle,但我也有一個tblUserProfile表,其中我存儲了一堆用戶配置文件信息,如名字,電話號碼等。tblUserProfile也有一個companyID,指的是一張帶有公司名單的獨立表格。

所有表都有一個GUID UserId作爲它們的鍵。 我創建了一個數據模型圖,其中包含我正在使用的所有表格,並顯示了正確鏈接等的鍵。

所以現在我有一個GridView使用連接到aspnet_membership表的LinqDataSource。這一點到目前爲止效果很好,我可以顯示aspnet_membership表中的所有信息。我也想通了如何顯示公司用戶是這樣的:

    <asp:TemplateField HeaderText="Company" SortExpression="tblUserProfile.Company.CompanyName"> 
         <ItemTemplate> 
          <%#Eval("tblUserProfile.Company.CompanyName") %> 
         </ItemTemplate> 

我無法弄清楚是如何更改此保存到數據庫中。如果我在aspnet_membership表中更改直接字段,它們會正確更新。

我創建顯示所有可用的公司下拉,可以選擇該公司直接在網格改變,但是當我嘗試更新它恢復爲原始值。

    <asp:TemplateField HeaderText="Company" SortExpression="tblUserProfile.Company.CompanyName"> 
         <ItemTemplate> 
          <%#Eval("tblUserProfile.Company.CompanyName") %> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <asp:DropDownList ID="CompanyDropDownList" 
               DataSourceID="CompanyDataSource" 
               DataValueField="Id" 
               DataTextField="CompanyName" 
               SelectedValue='<%#Bind("tblUserProfile.CompanyID") %>' 
               runat="server"> 
               </asp:DropDownList> 

         </EditItemTemplate> 
        </asp:TemplateField> 

我不知道這是否是因爲我的數據源是連接到一個表(aspnet_membership),但我試圖改變值在tblUserProfile。似乎我可以從其他通過外鍵連接的表中檢索/顯示值,但是我也可以更新那些表中的值嗎?

對不起了長篇大論的問題,但我是很新,這使不能確定究竟在何處的問題,否則我會更具體。

感謝任何指針

回答

1

這聽起來像你要使用由提供的LinqDataSource自動更新,但正如你指出,這並不與連接的數據正常工作。這是自動更新的限制。但是,您可以訂閱其中一個OnUpdating事件並編寫一些代碼來處理額外的更新。究竟應該如何編寫取決於您的鍵值的名稱等,但應該有關於它在這個網站和其他地方的一些信息。

+0

啊對...是啊,我試圖使用自動更新。我一直在跟着一個簡單的數據庫的教程,但試圖適應我自己的。 我應該能夠找出代碼來處理額外的更新,現在我知道這是需要做的。 您是否知道任何有關自動更新限制的文檔? – Adam 2009-11-28 23:56:32

+0

儘管我確信它的確存在,但我一般都不確定,但總的來說,如果它涉及到連接,或者基本上任何「幻想」,它都不會與自動更新一起工作,而且您必須在至少一些代碼。 – 2009-11-29 00:04:49

0

您可以創建自定義數據綁定控件編輯的子對象

public class CompositeBoundField : BoundField 
{ 
    protected override object GetValue(Control controlContainer) 
    { 
     object item = DataBinder.GetDataItem(controlContainer); 
     return DataBinder.Eval(item, this.DataField); 
    } 
} 

然後用這個在頁面像這樣:

  <cc:CompositeBoundField DataField="aspnet_Membership.Email" HeaderText="Email"/> 

然後將其添加到網絡。配置:

<pages> 
     <controls> 
      <add assembly="App_Code" namespace="CustomControls" tagPrefix="cc"/> 
     </controls> 

讓我知道,如果這有助於給我一個了檢查。可以爲複選框或其他類型創建其他綁定字段。這可能是該方法的原作者/來源:

http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx