2013-03-24 2 views
0

У меня есть ListView - связанный с datatable - содержащий несколько страниц хронологических элементов.Сортировка ASP.NET 4.0 (C#) ListView

Хотелось бы иметь возможность сортировать их по возрастанию и убыванию.

В моей <layouttemplate> я следующее:

<asp:linkbutton runat="server" id="SortbyYear" commandname="Sort" commandargument="Year">Year</asp:linkbutton> 

Когда я нажимаю на это, я получаю сообщение об ошибке от PageRequestManager что onsorting не обрабатывается.

Поэтому я добавил следующее к моему <asp:listview ... >:

onsorting="HistoryList_Sorting" 

Что я на самом деле положил в этом методе в код, чтобы получить сортировку работать? Я просто пытаюсь переключить столбец «Год» туда и обратно между восходящим и нисходящим.

protected void HistoryList_Sorting(object sender, ListviewSortEventArgs e) 
{ 
    // WHAT GOES HERE??? 
} 

UPDATE:

Ниже то, что я имею в моей странице ASPX:

<asp:listview id="HistoryList" runat="server" convertemptystringtonull="False" onlayoutcreated="HistoryList_LayoutCreated" ondatabound="HistoryList_DataBound" onsorting="HistoryList_Sorting" > 
    <layouttemplate> 
     <table> 
      <tr> 
       <th><asp:linkbutton runat="server" id="SortByYear" commandname="Sort" commandargument="Year"><asp:literal runat="server" id="Year" /></asp:linkbutton></th> 
       <th><asp:literal runat="server" id="Event" /></th> 
      </tr> 
      <tr id="ItemPlaceholder" runat="server"></tr> 
     </table> 
    </layouttemplate> 
    <itemtemplate> 
     <tr class="row"> 
      <td class="history-year-column"><%# Eval("Year") %></td> 
      <td><%# Eval("Description") %></td> 
     </tr> 
    </itemtemplate> 
    <alternatingitemtemplate> 
     <tr class="row-alternate"> 
      <td class="history-year-column"><%# Eval("Year") %></td> 
      <td><%# Eval("Description") %></td> 
     </tr> 
    </alternatingitemtemplate> 
</asp:listview> 

Ниже то, что я имею в моей странице CS:

#region " Declare: Shared Classes " 

    private Localization localizeSite = new Localization(); 
    private DataXML xmlData = new DataXML(); 
    public DataTable HistoryDataTable { get; set; } 

#endregion 



#region " Page: PreInit " 

    private void Page_PreInit(object sender, System.EventArgs e) 
    { 
     Page.MasterPageFile = localizeSite.LoadMasterPage(Page.Master.AppRelativeVirtualPath); 
    } 

#endregion 



#region " Page: Load " 

    protected void Page_Load(object sender, System.EventArgs e) 
    { 
     Edition edition = new Edition(); 
     ContentTracking.Text = edition.GetEdition(Page.AppRelativeVirtualPath); 

     //// LOCALIZE THE WEB SITE CONTENT 
     Heading.Text = localizeSite.LocalizeText(Page, "Heading.Text"); 
     Body.Text = localizeSite.LocalizeText(Page, "Body.Text"); 
     AdNetworkTracking.Text = localizeSite.LocalizeText(Page, "AdNetworkTracking.Text"); 
    } 

#endregion 




#region " Handle: OnLayoutCreated " 

    protected void HistoryList_LayoutCreated(object sender, System.EventArgs e) 
    { 
     ((Literal)HistoryList.FindControl("Year")).Text = localizeSite.LocalizeText(Page, "Year.Text"); 
     ((Literal)HistoryList.FindControl("Event")).Text = localizeSite.LocalizeText(Page, "Event.Text"); 
    } 

#endregion 





#region " Handle: Sorting " 

    public String SortExpression 
    { 
     get 
     { 
      return (string)ViewState["SortExpression"]; 
     } 
     set 
     { 
      ViewState["SortExpression"] = value; 
     } 
    } 

    protected void HistoryList_Sorting(object sender, ListViewSortEventArgs e) 
    { 
     String sortExpression = e.SortExpression + " " + e.SortDirection.ToString(); 
     this.SortExpression = sortExpression.Replace("Ascending", "ASC").Replace("Descending", "DESC"); 
    } 

#endregion 





#region " Handle: Paging " 

    protected void HistoryList_DataBound(object sender, EventArgs e) 
    { 
     HistoryPager.Visible = (HistoryPager.PageSize < HistoryPager.TotalRowCount); 
    } 


    protected void HistoryPager_PreRender(object sender, EventArgs e) 
    { 

     if (HistoryDataTable == null) 
     { 
      HistoryDataTable = xmlData.GetDataTable(Server.MapPath("~/App_Data/history.xml"), "Event"); 
     } 

     if (!String.IsNullOrEmpty(SortExpression)) 
     { 
      HistoryDataTable.DefaultView.Sort = SortExpression; 
     } 

     HistoryList.DataSource = HistoryDataTable; 
     HistoryList.DataBind(); 
    } 

#endregion 

Сортировка пока не работает.

+0

это НЕ вопрос mvc –

ответ

0
if(e.commandName==Sort) 
{ 
    //Code you want to implement on the button click event 
} 
0

Если вы хотите отсортировать ListView с DataPager, и вы хотите сохранить сортировку, при изменении страницы, то вам нужно помнить несколько вещей.

  1. Вы должны какой-то образом определить, последнее направление сортировки т.е. при сортировке столбца, то вы должны быть в состоянии знать, нажали ли вы в первый раз или второе то, что вы хотели Ascend или Сходите

  2. вам необходимо сохранить sortExpression, во время изменения страницы (назад). это означает, что вам нужно представить сортировку в своем источнике данных.

см пример ниже:

Создать ListView, и в его LayoutTemplate, в заголовки для ListView, место LinkButton с CommandName="Sort" и CommandArgument="ColumnName" я.е

<LayoutTemplate> 
    <table> 
    <tr> 
     <td> 
     <asp:LinkButton ID="btnNameSort" runat="server" 
      CommandName="sort" CommandArgument="Name" 
      Text="Name"> 
     </asp:LinkButton> 
     </td> 
     .. 
     .. 
</LayoutTemplate> 

, а затем на коде это сделать:

public string SortExpression 
{ 
    get 
    { 
     return (string)ViewState["SortExpression"]; 
    } 
    set 
    { 
     ViewState["SortExpression"] = value; 
    } 
} 
public DataTable lvwDataSource { get; set; } 

и ваш ListView сортировки событие как:

protected void lvwData_Sorting(object sender, ListViewSortEventArgs e) 
{ 
    string sortExp = e.SortExpression + " " + e.SortDirection.ToString(); 
    this.SortExpression = sortExp.Replace("Ascending", "ASC") 
           .Replace("Descending", "DESC"); 
} 

связывают ваш ListView в вашем случае PreRender DataPager в:

protected void DataPager1_PreRender(object sender, EventArgs e) 
{ 
    if (lvwDataSource == null) 
     lvwDataSource = StaticData.GetData(); 

    if (!string.IsNullOrEmpty(SortExpression)) 
     lvwDataSource.DefaultView.Sort = SortExpression; 

    lvwData.DataSource = lvwDataSource; 
    lvwData.DataBind(); 
} 

так, вам нужно t o определить свой источник данных в глобальной области, чтобы продолжить сортировку по поисковому вызову.

+0

Теперь позвольте мне задать еще одну проблему в миксе ... paging. Порядок сортировки теряется, когда я устанавливаю свойства пейджера и восстанавливает его? – user2121236

+0

Вот почему вы поддерживаете SortDirection в ViewState, используйте его в сочетании с e.SortExpression, чтобы сохранить сортировку при изменении страницы. см. этот [пример] (http://stackoverflow.com/questions/7586332/asp-net-listview-sorting-using-databind) –

+0

Это не относится к аспекту поискового вызова. В моем методе, который обрабатывает PagePropertiesChanging У меня есть: 'HistoryPager.SetPageProperties (e.StartrowIndex, e.MaximumRows, false); HistoryList.DataBind(); ' Я попытался изменить эту вторую строку на' BindHistoryList (ListViewSortDirection.ToString()) ;, но я получаю сообщение об ошибке «не удалось найти столбец« DESC »при попытке сменить страницы. – user2121236

1

Если ваше представление списка привязано к базе данных, вы можете просто отсортировать в заявлении на выбор базы данных, используя предложение «заказать по»? Это вернет данные в отсортированном порядке, и вам не нужно будет сортировать их в самом представлении списка.

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