【问题标题】:display field in gridview from another sqldatasource从另一个 sqldatasource 在 gridview 中显示字段
【发布时间】:2011-07-01 08:20:15
【问题描述】:

我正在尝试使用来自另一个表的数据来实现 gridview 字段,表中名为“LocationID”的字段之一是 Locations 表的外键。 我不想在 gridview 上显示数字我只想查看 Locations 表中的地址字段并使用下拉列表控件编辑值。

这是与 gridview 和 sqldatasource 一起使用的主表

Net-Items

 [ID],[Name]
,[Model]
,[SerialNumber]
,[Company]
,[PurchaseDate]
,[PurchasePrice]
,[MonthPrice]
,[CommitmentPrice]
,[Status]
,[CommitmentDate]
,[Free]
,[TillDate]
,[LocationID]

这是辅助表

Net-Locations

[ID]
,[ContactName]
,[Address]
,[City]

谢谢

【问题讨论】:

    标签: asp.net gridview sqldatasource


    【解决方案1】:

    请尝试以下代码。

        <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
    
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head runat="server">
        <title></title>
        </head>
        <body>
        <form id="form1" runat="server">
        <h3>Items Details</h3>
        <div>
            <asp:SqlDataSource ID="sds_Items" runat="server" 
                ConnectionString="<%$ ConnectionStrings:Local %>" 
                ProviderName="<%$ ConnectionStrings:Local.ProviderName %>" 
                SelectCommand="select * from Items"></asp:SqlDataSource>
            <asp:SqlDataSource ID="sds_Location" runat="server" 
                SelectCommand="select * from location" 
                ConnectionString="<%$ ConnectionStrings:Local %>" 
                ProviderName="<%$ ConnectionStrings:Local.ProviderName %>"></asp:SqlDataSource>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                DataSourceID="sds_Items" AutoGenerateEditButton="True" ShowFooter="True">
                <Columns>
                <asp:TemplateField HeaderText="ID" >
                    <itemtemplate>
                        <asp:Label ID="ID" runat="server" Text='<%# Bind("ID") %>'></asp:Label>
                    </itemtemplate>
                    <edititemtemplate>
                        <asp:TextBox ID="txtID" runat="server" Text='<%# Bind("ID") %>' Width="98%" MaxLength="6"></asp:TextBox>
                    </edititemtemplate>
                    <footertemplate>
                       <asp:TextBox ID="txtNewID" runat="server" Text='<%# Bind("ID") %>' Width="98%" MaxLength="6"></asp:TextBox>
                    </footertemplate>
                    <itemstyle width="80px" /> 
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Location" >
                    <ItemTemplate>
                        <asp:Label ID="lblLocation" runat="server" Text='<%# LookupLocation(DataBinder.Eval(Container.DataItem, "LocationID")) %>'></asp:Label> 
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="ddlLocation" runat="server" DataSourceID="sds_Location" DataTextField="ID" DataValueField="ID" SelectedValue='<%#Bind("LocationID")%>' Width="98%">
                        </asp:DropDownList> 
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:DropDownList ID="ddlNewLocation" runat="server" DataSourceID="sds_Location" DataTextField="Address" DataValueField="ID" SelectedValue='<%#Bind("LocationID")%>' Width="95%">
                        </asp:DropDownList> 
                    </FooterTemplate>
                   <ItemStyle Width="25%" /> 
               </asp:TemplateField> 
                </Columns>
            </asp:GridView>
        </div>
        </form>
        </body>
        </html>
    
    
    
    
    
    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Collections;
    using System.Data;
    
    public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
        protected string LookupLocation(object idObj)
        {
            if (string.IsNullOrEmpty(idObj.ToString()))
                return null;
    
            // store the permissionID passed as an input parameter
            string LocationId = idObj.ToString();
    
            // find the corresponding name
            IEnumerator enumos = sds_Location.Select(new DataSourceSelectArguments()).GetEnumerator();
            while (enumos.MoveNext())
            {
                DataRowView row = enumos.Current as DataRowView;
    
                if ((string)row["ID"].ToString() == LocationId)
                    return string.Concat(row["Address"].ToString());
            }
    
            return LocationId;
        }
    }
    

    【讨论】:

      【解决方案2】:

      请参考以下tutorial 来了解如何配置 SqlDatasource 控件。尤其是第 4 步:使用自定义 SQL 语句或存储过程。

      【讨论】:

        【解决方案3】:

        创建一个单独的 SQL 数据源并查询 Location 表的详细信息。

        <edititemtemplate>
            <asp:DropDownList ID="ddl_Address" runat="server" DataSourceID="sqlDS_Location" SelectedValue='<%# Bind("Address") %>' DataTextField="Address" DataValueField="Address">
            </asp:DropDownList>                          
        </edititemtemplate>
        

        把上面的代码放在gridview列中。

        【讨论】:

        • 谢谢,但我已经尝试过了。出于某种原因,当我选择它不会更新表的值时。请注意,我只需要数据库中的 ID 字段而不是地址字段,因为我使用的是位置表的外键,并且我正在尝试更新数据库中的“LocationID”字段
        • 你为什么不尝试从后端更新值。可能您可以使用 RowCommand 并从 Location 表中获取值并更新它。
        • 这是个好主意,但我该如何实施呢?你能给我一个起点吗?也许我可以从那里继续
        猜你喜欢
        • 1970-01-01
        • 2021-12-12
        • 2015-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多