【问题标题】:Connecting a gridview to multiple tables linqdatasource将gridview连接到多个表linqdatasource
【发布时间】:2009-11-27 19:25:26
【问题描述】:

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

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

我有正常的 aspnet_membership 和 aspnet_profle,但我还有一个 tblUserProfile 表,其中存储了一堆用户配置文件信息,如名字、电话号码等。tblUserProfile 中还有一个 companyID,指的是单独的表格,其中包含公司列表。

所有表都有一个 GUID UserId 作为它们的键。 我创建了一个数据模型图,其中包含我正在使用的所有表,它显示了正确连接的键等。

所以现在我有一个使用连接到 aspnet_membership 表的 LinqDataSource 的 gridview。到目前为止,这一点效果很好,我能够显示 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 中。似乎我可以从通过外键连接的其他表中检索/显示值,但我也可以更新这些表中的值吗?

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

感谢大家的指点

【问题讨论】:

    标签: asp.net linq


    【解决方案1】:

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

    【讨论】:

    • 啊对...是的,我正在尝试使用自动更新。我一直在关注一个使用更简单的数据库的教程,但试图将其调整为我自己的。我应该能够找出处理额外更新的代码,因为我知道这是需要做的。您是否知道任何有关自动更新限制的文档?
    • 我不确定文档虽然我确定它在那里,但一般来说,如果它涉及连接,或者基本上任何“花哨”的东西,它不适用于自动更新和你至少得写一些代码。
    【解决方案2】:

    您可以创建自定义数据绑定控件来编辑子对象

        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

    【讨论】:

      猜你喜欢
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多