首页 > 解决方案 > 在所选数据源上找不到名为“X”的字段或属性

问题描述

这可能是一个很长的帖子,但我已经尝试了很多来修复它并且还没有弄清楚。

我正在为用户创建一个 ASP GUI 来查找员工信息。它有一个他们所在团队的下拉列表,然后有 18 个复选框列表用作用户想要搜索的过滤器。我有一个数据源,它从一个表中获取 19 列员工信息,因此这里没有连接。

在此处输入图像描述

我的问题:

当我只使用下拉列表让用户选择一个团队并且没有选中任何复选框时,它工作正常。它从我选择的团队中返回所有员工及其信息以及数据库中的所有列。但是,当我选中诸如“名字”之类的任何框(在我的数据库中具有列名称 Fname)时,我会收到一条错误消息,指出“在所选数据源上找不到名为“Lname”的字段或属性。” Lname 是我表中的下一列(在我的 GUI 中使用别名“姓氏”)。如果我再次运行 GUI 并选中框“名字”和“姓氏”,它将返回相同的错误,但它不会说在数据源上找不到“Lname”,它会说下一列是用户身份。如果我选中所有框,它将返回相同的错误,但未找到列名“团队”。“团队”列用于下拉列表。

在错误发生后查看底部的 SQL 命令,它显示了正确的 SQL 语句,"SELECT Fname, Lname FROM Info WHERE Team = 'DB2'"那是我从下拉列表中选择团队 DB2 并选择复选框 Fname 和 Lname 时。

这是我的cs代码:

public partial class WebForm1 : System.Web.UI.Page
{
    string SQLCmd = "SELECT *";

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void btnSearch_Click(object sender, EventArgs e)
    {
        SQLQueryBuilder();
        SqlDataSource1.SelectCommand = SQLCmd;
        GridView1.DataBind();
    }

    private void SQLQueryBuilder()
    {
        foreach (ListItem i in CheckBoxList1.Items)
        {
            if (i.Selected == true)
            {
                SQLCmd = SQLCmd.Remove(SQLCmd.Length - 1);
                SQLCmd += i.Value + ",  ";                                     
            }                                                                    
        }

        if (SQLCmd.EndsWith(",  "))
        {
            SQLCmd = SQLCmd.Remove(SQLCmd.Length - 3);
        }

        SQLFromClause();

        if (DropDownList1.SelectedValue != "Please Select a Team...")
        {
            SQLWhereClause();
            SQLCmd += " Team = '" + DropDownList1.SelectedValue + "'";
        }                        
    }

    private void SQLFromClause()
    {
        SQLCmd += " FROM Info";
    }

    private void SQLWhereClause()
    {
        SQLCmd += " WHERE";            
    }
}
}

我试过在这里和那里修改我的 SQL 语句,但它返回了正确的列名和正确的 SQL 语句,所以我不认为是这样。

这是我的 GUI 源代码:

<%@ Page Title="" Language="C#" MasterPageFile="~/PhoneList.Master" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="PhoneList.WebForm1" %>

    <asp:CheckBoxList ID="CheckBoxList1" runat="server" Height="16px" RepeatColumns="3" style="position:absolute; top: 118px; left: 7px; z-index: 1; height: 152px; width: 350px;">
        <asp:ListItem Value="Fname" Selected="True">First Name</asp:ListItem>
        <asp:ListItem Value="Lname" Selected="True">Last Name</asp:ListItem>
        <asp:ListItem Value="UserID" Selected="True">User ID</asp:ListItem>
        <asp:ListItem Value="Deskphone" Selected="True">Desk Phone</asp:ListItem>
        <asp:ListItem Value="Cellphone" Selected="True">Cell Phone</asp:ListItem>
        <asp:ListItem Value="Home" Selected="True">Home Phone</asp:ListItem>
        <asp:ListItem Value="Workhours" Selected="True">Work Hours</asp:ListItem>
        <asp:ListItem Value="RDO" Selected="True">RDO</asp:ListItem>
        <asp:ListItem Value="Telework" Selected="True">Telework</asp:ListItem>
        <asp:ListItem Value="Laptopnum" Selected="True">Laptop #</asp:ListItem>
        <asp:ListItem Value="Desktopnum" Selected="True">Desktop #</asp:ListItem>
        <asp:ListItem Value="Monitor1" Selected="True">Monitor 1</asp:ListItem>
        <asp:ListItem Value="Monitor2" Selected="True">Monitor 2</asp:ListItem>
        <asp:ListItem Value="USB" Selected="True">USB</asp:ListItem>
        <asp:ListItem Value="WorkspaceID" Selected="True">Workspace ID</asp:ListItem>
        <asp:ListItem Value="Birthday" Selected="True">Birthday</asp:ListItem>
        <asp:ListItem Value="IP" Selected="True">IP Address</asp:ListItem>
        <asp:ListItem Value="Laptopmodel" Selected="True">Laptop Model</asp:ListItem>
     </asp:CheckBoxList>

    <asp:Label ID="lblFilter" runat="server" Text="Filters:" style="position:absolute; top: 96px; left: 14px;"></asp:Label>

    <asp:Button ID="btnSearch" runat="server" OnClick="btnSearch_Click" Text="Search" style="position:absolute; top: 274px; left: 13px;" />

    <asp:DropDownList ID="DropDownList1" runat="server" style="position:absolute; margin-top: 0px; top: 70px; left: 11px;">
        <asp:ListItem>Please Select a Team...</asp:ListItem>
        <asp:ListItem>DB2</asp:ListItem>
        <asp:ListItem>Oracle</asp:ListItem>
        <asp:ListItem>SQL</asp:ListItem>
        <asp:ListItem>Sybase</asp:ListItem>        
    </asp:DropDownList>

</p>
<p>
    <asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" style="left: 7px;">
        <AlternatingRowStyle BackColor="#FFCC99" />
        <Columns>
            <asp:BoundField DataField="Fname" HeaderText="First Name" SortExpression="Fname" />
            <asp:BoundField DataField="Lname" HeaderText="Last Name" SortExpression="Lname" />
            <asp:BoundField DataField="UserID" HeaderText="User ID" SortExpression="UserID" />
            <asp:BoundField DataField="Deskphone" HeaderText="Desk Phone" SortExpression="Deskphone" />
            <asp:BoundField DataField="Cellphone" HeaderText="Cell Phone" SortExpression="Cellphone" />
            <asp:BoundField DataField="Home" HeaderText="Home Phone" SortExpression="Home" />
            <asp:BoundField DataField="Workhours" HeaderText="Work Hours" SortExpression="Workhours" />
            <asp:BoundField DataField="RDO" HeaderText="RDO" SortExpression="RDO" />
            <asp:BoundField DataField="Telework" HeaderText="Telework" SortExpression="Telework" />
            <asp:BoundField DataField="Laptopnum" HeaderText="Laptop #" SortExpression="Laptopnum" />
            <asp:BoundField DataField="Desktopnum" HeaderText="Desktop #" SortExpression="Desktopnum" />
            <asp:BoundField DataField="Monitor1" HeaderText="Monitor 1" SortExpression="Monitor1" />
            <asp:BoundField DataField="Monitor2" HeaderText="Monitor 2" SortExpression="Monitor2" />
            <asp:CheckBoxField DataField="USB" HeaderText="USB" SortExpression="USB" />
            <asp:BoundField DataField="WorkspaceID" HeaderText="Workspace ID" SortExpression="WorkspaceID" />
            <asp:BoundField DataField="Birthday" HeaderText="Birthday" SortExpression="Birthday" />
            <asp:BoundField DataField="IP" HeaderText="IP Address" SortExpression="IP" />
            <asp:BoundField DataField="Laptopmodel" HeaderText="Laptop Model" SortExpression="Laptopmodel" />
            <asp:BoundField DataField="Team" HeaderText="Team" SortExpression="Team" />
        </Columns>
        <HeaderStyle BackColor="#FF9900" />
    </asp:GridView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ExampleConnectionString %>" 
        SelectCommand="SELECT Fname, Lname, UserID, Deskphone, Cellphone, Home, Workhours, RDO, Telework, Laptopnum, Desktopnum, Monitor1, Monitor2, USB, WorkspaceID, Birthday, IP, Laptopmodel, Team FROM Info"> 
        </asp:SqlDataSource>
</p>
<p>

    &nbsp;</p>
<p>
    &nbsp;</p>

我试过让 select 命令SELECT * FROM Info原来是,但这并没有改变任何东西。所有列名显然都是正确的,因为当我只使用下拉列表而不单击任何复选框时,它会返回正确的数据。当我复制脚本生成的 SQL 命令并将其直接粘贴到我的 SQL Server Management Studio 中时,它会返回正确的信息,所以我不知道问题出在哪里!

标签: c#asp.netcheckboxlist

解决方案


您收到错误是因为您尝试绑定 GridView1 中显示结果的所有列。取消选中一个字段时,会将其从查询中删除,因此它不是结果集中的一部分。但是,您仍然尝试将列绑定到它:

<asp:BoundField DataField="Fname" HeaderText="First Name" SortExpression="Fname" />

推荐阅读