将gridview连接到多个表linqdatasource

时间:2009-11-27 19:25:27

标签: asp.net linq

我只是在玩一些linq和asp.net - 绝对是初学者,所以我甚至不确定如何问我的问题。

无论如何,我有一个带有asp成员信息的MSSQL数据库。由于各种原因(主要是将配置文件信息存储在清除列中而不是全部存储在一起)我正在使用自定义配置文件提供程序,因此我的配置文件信息分布在我的数据库中的几个表中。

我有正常的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。我似乎可以从通过外键连接的其他表中检索/显示值,但是我是否还可以更新这些表中的值?

很抱歉这是一个冗长的问题,但我对此很陌生,所以不确定问题究竟在哪里,否则我会更具体。

感谢您的任何指示

2 个答案:

答案 0 :(得分:1)

听起来您正在尝试使用LinqDataSource提供的自动更新,但正如您所指出的那样,这对于已连接的数据无效。这是自动更新的限制。但是,您可以订阅其中一个OnUpdating事件并编写一些代码来处理其他更新。应该如何写出来取决于你的关键值的名称等等,但是在这个网站和其他地方应该有关于它的一些信息。

答案 1 :(得分: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"/>

然后将其添加到web.config:

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

让我知道这是否有助于我给我一个检查。可以为复选框或其他类型创建其他绑定字段。这可能是此方法的原始作者/来源:

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