使用asp.net c#在listview中排序

本文关键字:listview 排序 asp net 使用 | 更新日期: 2023-09-27 18:15:20

我想在列表视图中做排序从后面的代码,我已经完成了下面的代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
        BindLV("");
}
public DataTable GetEmployee(string query)
{
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString);
    SqlDataAdapter ada = new SqlDataAdapter(query, con);
    DataTable dtEmp = new DataTable();
    ada.Fill(dtEmp);
    return dtEmp;
}
private void BindLV(string SortExpression)
{
    string UpdateQuery = "Select * from Employee" + SortExpression;
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString);
    lvEmployee.DataSource = GetEmployee(UpdateQuery);
    lvEmployee.DataBind();
}
protected void lvEmployee_Sorting(object sender, ListViewSortEventArgs e)
{
    ImageButton imEmpID = lvEmployee.FindControl("imEmpID") as ImageButton;
    ImageButton imEmpName = lvEmployee.FindControl("imEmpName") as ImageButton;
    string DefaultSortIMG = "~/img/asc.png";
    string imgUrl = "~/img/desc.png";
    if (ViewState["SortExpression"] != null)
    {
        if (ViewState["SortExpression"].ToString() == e.SortExpression)
        {
            ViewState["SortExpression"] = null;
            imgUrl = DefaultSortIMG;
        }
        else
        {
            ViewState["SortExpression"] = e.SortExpression;
        }
    }
    else
    {
        ViewState["SortExpression"] = e.SortExpression;
    }
    switch (e.SortExpression)
    {
        case "EmpID":
            if (imEmpName != null)
                imEmpName.ImageUrl = DefaultSortIMG;
            if (imEmpID != null)
                imEmpID.ImageUrl = imgUrl;
            break;
        case "EmpName":
            if (imEmpID != null)
                imEmpID.ImageUrl = DefaultSortIMG;
            if (imEmpName != null)
                imEmpName.ImageUrl = imgUrl;
            break;
    }
    BindLV(" order by " + e.SortExpression + " " + ((ViewState["SortExpression"] != null) ? "ASC" : "DESC"));
}

但问题是我正在使用另一个函数进行数据分页,如下面的代码中包含排序:

 protected void DataPager1_PreRender(object sender, EventArgs e)
{
    lvEmployee.DataSource = GetEmployee("Select * from Employee");
    lvEmployee.DataBind();
}

和我的数据分页代码位于。aspx页面的LayoutTemplate:

<asp:DataPager ID="DataPager1" runat="server" PagedControlID="lvEmployee" PageSize="5" onprerender="DataPager1_PreRender">
                <Fields>
                    <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="true" ShowLastPageButton="true"/>
                </Fields>
            </asp:DataPager>

每次我点击名称排序时,列表中不会有任何变化。我已经追踪了这个问题,我发现排序功能是正常的。但是在页面出现之前,调用DataPager1_PreRender函数并再次显示未排序的列表。

你能指导我如何一起做排序和dataPaging而不会出现这个问题吗?

使用asp.net c#在listview中排序

我已经通过使用Session解决了这个问题。
在我使用会话之前,我发现每次我按下一页或任何时候刷新页面时,它都会执行DataPager1_PreRender(),并且我已将数据源设置为

GetEmployee("Select * from Employee");

这就是排序永远不会发生的原因。我已将Session["UpdateQT"] = UpdateQuery;添加到BindLV()以保持更新查询,并已将DataPager1_PreRender()更改为

string strtmp = Session["UpdateQT"].ToString();
    if (strtmp == null) 
    {
        strtmp = "Select * from Employee";
    }
    lvEmployee.DataSource = GetEmployee(strtmp);
    lvEmployee.DataBind();

保留排序后的最新查询。