这可能是一篇很长的文章,但是我已经做了很多尝试来修复它,但是还没有弄清楚。
我正在为用户创建一个ASP GUI,以查找员工信息。它有一个下拉列表,列出了他们所在的团队,然后有18个复选框被用作用户搜索依据的过滤器。我有一个数据源,可从一张表中获取19列员工信息,因此这里没有联接。
我的问题:
当我仅使用下拉列表供用户选择团队且未选中任何复选框时,它就可以正常工作。它从我选择的团队中返回所有雇员及其信息以及数据库中的所有列。但是,当我选中诸如“名字”(在数据库中具有列名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>
</p>
<p>
</p>
我尝试将select命令原本设为SELECT * FROM Info
,但没有任何改变。所有列名称都明确正确,因为当我仅使用下拉列表而不单击任何复选框时,它将返回正确的数据。当我复制脚本生成的SQL命令并将其直接粘贴到我的SQL Server Management Studio中时,它会带回正确的信息,所以我不知道问题出在哪里!
答案 0 :(得分:0)
出现错误是因为您尝试绑定GridView1中显示结果的所有列。取消选中一个字段时,会将其从查询中删除,因此它不属于结果集。但是,您仍然尝试将列绑定到该列:
<asp:BoundField DataField="Fname" HeaderText="First Name" SortExpression="Fname" />