分页后GridView丢失了排序?

时间:2012-10-05 09:44:34

标签: asp.net

我从互联网上获得了以下代码。它运作正常。我也添加了分页。当我只是排序时,它正常工作。当我更改页面索引时,排序将丢失。

这是客户端代码,它使用链接到服务器端代码中“GridView1_Sorting”方法的排序,为每页设置20个项目的gridview设置。

客户端

<asp:GridView ID="GridView1" runat="server" DataKeyNames="eno" AutoGenerateColumns="False" PageSize="20" AllowPaging="True" AllowSorting="True" OnSorting="GridView1_Sorting" CellPadding="4">
    <Columns>
        <asp:TemplateField HeaderText="Employee no" SortExpression="eno">
            <ItemTemplate>
                <%#Eval("eno")%>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Emp name" SortExpression="empname">
            <ItemTemplate>
                <%#Eval("empname")%>
            </ItemTemplate> 
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Salary" SortExpression="sal">
            <ItemTemplate>
                <%#Eval("sal")%>
            </ItemTemplate> 
        </asp:TemplateField>
    </Columns>
</asp:GridView>

现在是服务器端代码:

服务器端

using System.Data.SqlClient;
using System.Configuration;
using System.IO;

public partial class _Default : System.Web.UI.Page
{
    SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["Con"].ConnectionString);
    SqlCommand sqlcmd;
    SqlDataAdapter da;
    DataTable dt = new DataTable();
    DataTable dt1 = new DataTable();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            GridData();
        }
    }

    void GridData()
    {
        sqlcmd = new SqlCommand("select * from emp", sqlcon);
        sqlcon.Open();
        da = new SqlDataAdapter(sqlcmd);
        dt.Clear();
        da.Fill(dt);

        if (dt.Rows.Count > 0)
        {
            Session["dt"] = dt;
            GridView1.DataSource = dt;
            GridView1.DataBind();
        } 
    } 

    private string GVSortDirection
    {
        get { return ViewState["SortDirection"] as string ?? "DESC"; }
        set { ViewState["SortDirection"] = value; }
    }

    private string GetSortDirection()
    {
        switch (GVSortDirection)
        { 
            case "ASC":
                GVSortDirection = "DESC";
                break;

            //assign new direction as ascending order
            case "DESC":
                GVSortDirection = "ASC";
                break;
        }

        return GVSortDirection;
    }

    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
        DataTable dataTable = (DataTable)Session["dt"];
        if (dataTable != null)
        { 
            DataView dataView = new DataView(dataTable); 
            string sortDirection = GetSortDirection(); 
            dataView.Sort = e.SortExpression + " " + sortDirection; 
            GridView1.DataSource = dataView;
            GridView1.DataBind();
        }
    } 

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GridView1.PageIndex = e.NewPageIndex;
        GridData();
    }
}

3 个答案:

答案 0 :(得分:1)

当您翻页时,会调用PageIndexChanging事件。这反过来运行GridData()过程,该过程将gridview的数据源设置为包含emp表中记录的数据表,没有特定的排序顺序。

您应该做的是获取您在GridView1_Sorting事件处理程序中编写的代码,并将其包含在GridData例程中,以便每当网格填充数据时 - 无论何时首次加载页面,何时更改页面索引或者对gridview进行排序时 - gridview基于排序的数据视图,而不是未排序的数据表。

答案 1 :(得分:1)

使用GetSortDirection维护SortDirection的方式,以相同的方式维护SortExpression。

快乐的编码!!!

答案 2 :(得分:0)

看看这个article,你会得到你想要的吗