2009-11-27 35 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