2015-03-29 3 views
0

Я пытаюсь сортировать элементы в списке, которые у меня есть, элементы заполняются в listview из SelectMethod в объявлении ASPX listviews.Сортировка существующих элементов в listview

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

метод просто делает запрос Linq и возвращает запрос обратно в 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(); 

Это дает мне ошибку, которая «DataSource или DataSourceID не может быть определена на„ProductList“, когда он использует модель связывания», как я мог бы идти о фиксации этого. Я попытался отобразить каждый отдельный продукт в запросе в 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 и изменил первоначальную привязку к защищенной недействительным Page_Load (объект отправителя, EventArgs е) { 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(); 
+0

Вы получаете ту же ошибку, когда комментируете заказ (оператор switch)? – Peter

+0

@Peter Да, я как-то уже связал данные один раз в коде ASPX. – ObiEff

+0

Можете ли вы поделиться кодом, в котором вы выполняете привязку в коде ASPX? –

ответ

0

возникает из-за вопрос о том, что вы пытаетесь как декларативного связывания (SelectMethod в ASPX), а также связывание код (productList.DataSource = запрос). Когда вы привязываетесь с помощью SelectMethod, вы используете декларативное связывание (которое, в свою очередь, является вашим привязкой к модели - указанное вами исключение, указанное вами).

Я бы посоветовал вам выполнить первоначальное связывание также через код, возможно, на вашей странице Загрузка и удалить SelectMethod. Таким образом, оба метода будут использовать привязку кода, и это должно работать.

+0

Спасибо, praveen, я понял это, прежде чем я увидел ваше сообщение и сделал то же самое. Спасибо за вашу помощь. – ObiEff

Смежные вопросы