对列表视图中的现有项目进行排序

Posted

技术标签:

【中文标题】对列表视图中的现有项目进行排序【英文标题】:Sort existing items in listview 【发布时间】:2015-06-02 17:40:18 【问题描述】:

我正在尝试对我拥有的列表视图中的项目进行排序,这些项目从列表视图 ASPX 声明中的 SelectMethod 填充到列表视图中。

<asp:ListView ID="productList" runat="server" 
            DataKeyNames="ProductID" GroupItemCount="4"
            ItemType="StoreTest.Models.Product" SelectMethod="GetProducts" >

该方法只是简单地执行 linq 查询并将查询返回给 Listview,这是 listview 类的内部工作原理,并且工作正常。问题是我有一个包含每个项目不同变量的下拉列表,用户可以使用这个 DDL 对列表视图进行排序。

我在 DDL 上放置了一个 OnSelectedIndexChanged 方法,该方法执行与原始查询相同的查询,但随后根据所需的排序机制对其进行进一步排序。问题是我无法用这个新查询替换列表视图中的现有项目。我的代码如下:

        productList.Items.Clear();
        var _db = new StoreTest.Models.SiteContext();
        IQueryable<Product> query = _db.Products;
        switch(sortList.SelectedValue)
        
            case "Price Asc":
                query = query.OrderBy(o=> o.UnitPrice);
                break;
            case "Price Des":
                query = query.OrderByDescending(o => o.UnitPrice);
                break;
            case "Name Asc":
                query = query.OrderBy(o => o.ProductName);
                break;
            case "Name Des":
                query = query.OrderByDescending(o => o.ProductName);
                break;
            case "Product ID Asc":
                query = query.OrderBy(o => o.ProductID);
                break;
            case "Product ID Des":
                query = query.OrderByDescending(o => o.ProductID);
                break;
        
            productList.DataSource = query;
            productList.DataBind();

这给了我一个错误,即“使用模型绑定时无法在 'productList' 上定义 DataSource 或 DataSourceID”,我该如何解决这个问题。我尝试将查询中的每个单独产品转换为 ListViewItem,但类型不兼容,并且无法将它们转换为数组。

public IQueryable<Product> GetProducts([QueryString("id")] int? categoryID)
    
        var _db = new StoreTest.Models.SiteContext();
        IQueryable<Product> query = _db.Products;
        if (categoryID.HasValue && categoryID > 0)
        
            query = query.Where(p => p.CategoryID == categoryID);
            Session["categoryid"] = categoryID;
        
        return query;
    

谢谢。

编辑 解决方案: 以编程方式绑定两次,删除 aspx 中的绑定并将初始绑定更改为 protected void Page_Load(object sender, EventArgs e) IQueryable itemList = GetProducts(); productList.DataSource = itemList.ToList(); productList.DataBind();

    public IQueryable<Product> GetProducts()
    
        int categoryID = -1;
        if(Request.QueryString["id"]!=null)
        
            categoryID = Convert.ToInt32(Request.QueryString["id"]);
        
        var _db = new StoreTest.Models.SiteContext();
        IQueryable<Product> query = _db.Products;
        if (categoryID!=-1 && categoryID > 0)
        
            query = query.Where(p => p.CategoryID == categoryID);
            Session["categoryid"] = categoryID;
        
        return query;
    

第二次绑定效果很好:

productList.DataSource = query.ToList();
        productList.DataBind();

【问题讨论】:

注释排序(switch语句)时是否也遇到同样的错误? @Peter 是的,我愿意,因为无论哪种方式,我已经在 ASPX 代码中绑定了一次数据。 你能分享你在ASPX代码中做绑定的代码吗? @PraveenPaulose ASPX 的代码在我的问题的顶部,getProducts 方法的代码在底部。 【参考方案1】:

由于您同时尝试声明式绑定(ASPX 中的SelectMethod)和代码绑定(productList.DataSource = 查询),因此出现问题。当您使用 SelectMethod 绑定时,您使用的是声明式绑定(这又是您的模型绑定 - 您显示的异常表示相同)。

我建议您也通过代码进行初始绑定,可能在您的页面加载中并删除 SelectMethod。这样,您的两种方法都将使用代码绑定,并且应该可以工作。

【讨论】:

感谢 praveen,我在看到您的消息之前就想通了,并做了完全相同的事情。感谢您的帮助。

以上是关于对列表视图中的现有项目进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何将搜索添加到列表视图android,按您的类型对项目进行排序

在 jQuery Mobile 中单击按钮时对列表视图进行排序

是否可以在颤动的可重新排序的列表视图中禁用对单个项目的重新排序?

如何通过 NSDate 输入对表格视图进行排序(格式化为 MMM yyyy)

使用带有排序组合框和页面组合框上的许多项目的列表视图

使用数组适配器对列表视图进行排序