在所选数据源上找不到名称为“ X”的字段或属性

时间:2018-08-08 17:21:12

标签: c# asp.net checkboxlist

这可能是一篇很长的文章,但是我已经做了很多尝试来修复它,但是还没有弄清楚。

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

enter image description here

我的问题:

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

在错误发生后查看底部的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中时,它会带回正确的信息,所以我不知道问题出在哪里!

1 个答案:

答案 0 :(得分:0)

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

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