0

我有一个 ListView - 从数据表绑定 - 包含几页按时间顺序排列的项目。

我希望能够按升序和降序对它们进行排序。

在我的<layouttemplate>我有以下内容:

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

当我单击它时,我从 pageRequestManager 收到一个错误,即未处理排序。

所以我将以下内容添加到我的<asp:listview ... >

onsorting="HistoryList_Sorting"

我实际上在后面的代码中放入了该方法以使排序正常工作?我只是尝试在升序和降序之间来回切换“年”列。

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

更新:

以下是我的 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

排序还没有工作。

4

4 回答 4

1

如果您的列表视图绑定到数据库,您是否可以使用“order by”子句在数据库选择语句中进行排序?这将按排序顺序返回数据,您不需要在列表视图本身中对它们进行排序。

我知道这不能回答排序问题,但我想我会把它扔掉,以防你没有考虑过。

于 2014-01-09T16:06:18.210 回答
0
if(e.commandName==Sort)
{
  //Code you want to implement on the button click event
}
于 2013-03-24T11:09:12.890 回答
0

如果您想使用数据分页器对 a 进行排序ListView,并且希望在页面更改时保留排序,那么您需要记住几件事。

  1. 您必须以某种方式确定最后的排序方向,即当您对列进行排序时,您必须能够知道您是第一次单击还是第二次单击,即您想要上升还是下降

  2. 您需要在页面更改(回发)期间维护 sortExpression。这意味着,您需要在数据源中进行排序。

请参见下面的示例:

在 ListView 的标题中创建一个ListView, 和 在它的 , 中放置and即LayoutTemplateLinkButtonCommandName="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; }

并且您的列表视图排序事件为:

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

在 DataPager 的 PreRender 事件中绑定您的 listView:

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();
}

因此,您需要在全局范围内定义数据源,以便在分页时保持排序。

于 2013-03-24T11:16:09.420 回答
0

我自己没有这样做,但看起来你会做这样的事情:asp.net ListView Sorting using DataBind。希望能帮助到你!

于 2013-03-24T02:50:43.760 回答