2

我正在尝试按价格对我的数据(在数据列表中)进行排序。这意味着有 DropDownList 供用户选择,如果他们想要从最贵到最便宜的价格,反之亦然。存储在我的数据库中的价格是根据我的 catID 随机排列的。我已经编写了如下代码,但它没有按照我写的内容进行排序。我在这里做错了什么?请给我建议。

protected void Page_Load(object sender, EventArgs e)
{

}

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
    bindDropDownList();
}

private void bindDropDownList()
{
    DropDownList1.DataTextField = "price";
    DataList1.DataSourceID = null;
    DataList1.DataSource = getReader();
    DropDownList1.DataBind();

}

private SqlDataReader getReader()
{
    SqlDataReader reader = null;

    if(DropDownList1.Text == "-Select-")
    {
      string strConnectionString =
            ConfigurationManager.ConnectionStrings["ProBizConnection"].ConnectionString;
        SqlConnection myConnect = new SqlConnection(strConnectionString);

        string strCommandText ="SELECT * FROM [Category ] WHERE catID<= 20";

        SqlCommand cmd = new SqlCommand(strCommandText, myConnect);
        myConnect.Open();

   reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);

    }
    else if (DropDownList1.SelectedValue == "Price - Highest to Lowest")
    {
        string strConnectionString =
            ConfigurationManager.ConnectionStrings["ProBizConnection"].ConnectionString;
        SqlConnection myConnect = new SqlConnection(strConnectionString);

        string strCommandText = "SELECT catID, packageName, price, description1, description2, image1, image2 FROM Category WHERE catID <= 20 ORDER BY price desc";

        SqlCommand cmd = new SqlCommand(strCommandText, myConnect);
        myConnect.Open();

   reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);

    }

    else if (DropDownList1.DataTextField == "Price - Lowest to Highest")
    {
        /string strConnectionString =
            ConfigurationManager.ConnectionStrings["ProBizConnection"].ConnectionString;
        SqlConnection myConnect = new SqlConnection(strConnectionString);

        string strCommandText = "SELECT catID, packageName, price, description1, description2, image1, image2 FROM Category WHERE catID <= 20 ORDER BY price";

        SqlCommand cmd = new SqlCommand(strCommandText, myConnect);
        myConnect.Open();

   reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);

    }
    return reader;
}

我的 .aspx 代码:

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" AppendDataBoundItems="true" 
            onselectedindexchanged="DropDownList1_SelectedIndexChanged" Height="18px" 
            Width="184px">
            <asp:ListItem>-Select-</asp:ListItem>
            <asp:ListItem>Price - Highest to Lowest</asp:ListItem>
            <asp:ListItem>Price - Lowest to Highest</asp:ListItem>
        </asp:DropDownList>
4

3 回答 3

2

排序无法正确处理 Price 列可能是因为 Price 的数据类型不是小数并且可能是 Varchar

所以请将价格数据类型更改为十进制以正确排序

于 2012-07-23T11:33:45.097 回答
0

我可以看到三个错误...

1)您的getReader代码有一条返回null的路径。您可能应该确保始终有一个else默认值,以防其他检查为假。

2)您正在读取 的值,DropDownList1.SelectedValue同时试图让读者对其进行数据绑定。这在我看来是错误的 - 我假设有两个下拉列表,一个包含订购信息,另一个是您想要设置和数据绑定到的内容......

3)在您正在比较的 getReader 的 elseif 中,DropDownList1.DataTextField它应该包含您要绑定的字段的名称(您"price"在方法的代码中将其设置为前面的名称bindDropDownList

如果这些错误中的任何一个是您遇到的问题(如果它们现在不是,它们可能会在将来出现),那么您应该能够通过在调试模式下单步执行来发现这一点。这应该告诉您代码正在下降的路径等等。

如果以上都不是导致您当前的问题,那么请提供更多详细信息。我不得不强调三个不同的问题,因为您的描述不足以说明您到底出了什么问题。

http://tinyurl.com/so-hints是一个非常有用的链接,该链接指向一个页面,旨在帮助解释是什么使问题变得好且易于回答。

于 2012-07-23T11:37:56.540 回答
0

我认为这条线是错误的,可能永远不会评估为真

 else if (DropDownList1.DataTextField == "Price - Lowest to Highest")

应该

 else if (DropDownList1.SelectedValue == "Price - Lowest to Highest")

甚至更好

 else if (DropDownList1.Text == "Price - Lowest to Highest")

更新:

AppendDataBoundItems="true"可能会弄乱您的下拉项目。Lowest 和 Highest 的结果正在合并,这可能就是您看不到差异的原因。

删除默认列表项并将它们放在您的代码隐藏中

private void bindDropDownList()
{
   DropDownList1.DataTextField = "price";
   DropDownList1.DataSource = getReader();
   DropDownList1.DataBind();

   DropDownList1.Items.Insert(0, new ListItem("-Select-"));
   DropDownList1.Items.Insert(1, new ListItem("Price - Highest to Lowest"));
   DropDownList1.Items.Insert(2, new ListItem("Price - Lowest to Highest"));
}

对于替代方法,请检查DropDownList AppendDataBoundItems (第一项为空白且无重复项)

于 2012-07-23T12:01:36.000 回答