2012-06-18 4 views
1

У меня возникла странная проблема. У меня есть ListView, который я сортирую в порядке ASC/DESC, щелкнув заголовок listview, используя приведенный ниже метод, теперь дело в том, что отлично работает, когда я определил ObjectDataSource и приложил его к ListView.asp.net listview сортировка и ручная привязка данных

Теперь, если я просто использовать ручную вязку не используя

listview.DataSource = GetListViewContent(); 
listview.DataBind(); 

сортировка больше не работает. Я попытался перевязать в методе сортировки, но все же он не работает. Я что-то упускаю?

protected void lvFullReport_Sorting(object sender, ListViewSortEventArgs e) 
    { 
     Control me = (Control)sender, 
      headerRow = me.FindControl("headerRow"); 

     //Assume that the "header row" control's "control collection" just contains "th"-like control, 
     //whose type is exactly "HtmlTableCell" . While we just utilize its properties in the "HtmlControl" level 
     //so we cast them as "HtmlControl". 
     //What's more , as for these "th" controls , just those who contains an "IButtonControl" (sorting triggers) 
     //are really needed. 


     foreach (System.Web.UI.HtmlControls.HtmlControl sortCell in headerRow.Controls.Cast<System.Web.UI.HtmlControls.HtmlControl>() 
      .Where(th => th.Controls.OfType<IButtonControl>().Any())) 
     { 
       //Get out the "only" sorting-Button Control , 
       //for that in a "th" those empty space or literal text area are treated as "Literal Control" , 
       //"literal" fills whole space of "th". 

      IButtonControl btnSortField = sortCell.Controls.OfType<IButtonControl>().Single(); 

      if (btnSortField.CommandArgument == e.SortExpression) 
       sortCell.Attributes["class"] = e.SortDirection == SortDirection.Ascending ? "up" : "down"; 
      else 
       if (sortCell.Attributes["class"] != null) sortCell.Attributes.Remove("class"); 
     } 

     DisplayChart(); 
    } 

GetListViewContent() является источником для ручных и автоматических источников и для отображения как работа, чтобы показать данные; но сортировка работает только в авто.

+0

Почему бы не попробовать этот http://beckelman.net/2008/10/16/client-side-aspnet-listview-sorting-via-jquery-tablesorter-plugin-demo/ – MMK

+0

@MMLK, живой demo в указанной вами ссылке не работает. Он возвращает 500 ошибок сервера. –

+0

Спасибо за ссылку, но код, который у меня есть, на самом деле работает. Я уверен, что мне просто не хватает чего-то очень простого, чтобы исправить ручную привязку. Я немного настаиваю на том, чтобы реализовать другое решение. –

ответ

0

Вам также необходимо пересортировать отсортированные данные. Поэтому, возможно, вам следует рассмотреть возможность реализации вашего метода таким образом:

GetListViewContent(SortDirection sortDir);

0

Я тоже всегда получал e.SortDirection = SortDirection.Ascending при использовании источника данных объекта. Я нашел следующий полезный пост:
http://www.codedigest.com/articles/aspnet/412_sorting_in_aspnet_listview_control_-_binding_in_codebehind.aspx

, которые приводят меня к следующему решению для хранения SortExpression в ViewState, а затем переопределить e.SortDirection с правильным значением.

protected void ListView_Sorting(object sender, ListViewSortEventArgs e) 
{ 
    // Override sort direction (since it's always ascending when 
    // we're using an object data source) 
    e.SortDirection = GetListViewSortDirection(e.SortExpression); 

    // Rebind data 
    ProductListView.DataSource = 
     GetListViewContent(e.SortExpression, e.SortDirection); 
    ProductListView.DataBind(); 
} 

private SortDirection GetListViewSortDirection(string sortExpression) 
{ 
    // Store sort expression in viewstate 
    SortDirection listViewSortDirection = SortDirection.Ascending; 
    if (ViewState["SortExpression"] != null 
     && ViewState["SortExpression"].ToString() == sortExpression) 
    { 
     ViewState["SortExpression"] = null; 
     listViewSortDirection = SortDirection.Descending; 
    } 
    else 
    { 
     ViewState["SortExpression"] = sortExpression; 
    } 

    return listViewSortDirection; 
} 
Смежные вопросы