Avatar billede simsen Mester
06. november 2007 - 09:46 Der er 2 kommentarer og
2 løsninger

Sorting i gridview virker ikke helt

Hej,

Jeg har lavet en custom paging og sorting til mit gridview.

Paging virker fint.
Sorting virker også fint, hvis jeg sorterer på en side. Men går jeg så til næste (eller foregående side) har den mistet min sorting.

Jeg vil gerne have hjælp til, at finde ud af, hvad jeg skal gøre, så den ikke mister sorting, når jeg pager frem og tilbage. Men tager den sorting, der er valgt.

Min kode til paging og sorting:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //Henter employees listen
            ShowEmployees();
        }


        //Sætter sessions data_table til ShowEmployees for paging
        CreatePagingLinks(grdEmployeeList);
    }

private void ShowEmployees()
    {
        int companyid = Convert.ToInt32(Session[ERSConnect.CookieCompanyId]);

        ERSEmployees employee = new ERSEmployees();

        try
        {
            DataTable Employee = null;

            //Henter sorteringsmetode
            string sortorder = "";
            if (GridViewSortDirection == SortDirection.Ascending)
            {
                sortorder = "ASC";
            }
            else
            {
                sortorder = "DESC";
            }

            if (employee.getEmployees(companyid, sortorder, ref Employee) == Status.Success)
            {

                grdEmployeeList.DataSource = Employee.DefaultView;
                //Binder datatabel til session, så den kan bruges i paging
                Session["data_table"] = Employee;
                grdEmployeeList.DataBind();
            }
        }       
        catch
        { }
    }

//Paging
    private void CreatePagingLinks(GridView DoGridView)
    {
        if (DoGridView.BottomPagerRow != null)
        {
            HtmlTableCell paginglinks = (HtmlTableCell)DoGridView.BottomPagerRow.FindControl("paginglinks");

            if (paginglinks != null)
            {
                for (int i = 0; i < DoGridView.PageCount; i++)
                {
                    LinkButton LinkButtonPage = new LinkButton();
                    LinkButtonPage.ID = "page" + i.ToString();
                    LinkButtonPage.CssClass = "pagingtext";
                    LinkButtonPage.ForeColor = ColorTranslator.FromHtml("#FFFFFF");
                    LinkButtonPage.CommandName = "ChangePage";
                    LinkButtonPage.CommandArgument = i.ToString();
                    LinkButtonPage.Visible = true;
                    LinkButtonPage.Text = (i + 1).ToString();

                    if (i == DoGridView.PageIndex)
                    {
                        // Ændre farve på selected sidenr.
                        LinkButtonPage.ForeColor = ColorTranslator.FromHtml("#29a1d7");
                   
                    }

                    paginglinks.Controls.Add(LinkButtonPage);

                    Label LabelPageSpacing = new Label();
                    LabelPageSpacing.ID = "spacing" + i.ToString();
                    LabelPageSpacing.Text = "&nbsp;";
                    paginglinks.Controls.Add(LabelPageSpacing);
                }
            }
        }
    }

protected void grdEmployeeList_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "ShowEmployee")
        {
        }
        else if (e.CommandName == "DeleteEmployee")
        {
        }

        //Bruges til paging
        else if (e.CommandName == "ChangePage")
        {
            int pageindex = Convert.ToInt32(e.CommandArgument);

            DataTable search_datatable = (DataTable)Session["data_table"];

            grdEmployeeList.DataSource = search_datatable.DefaultView;

            grdEmployeeList.PageIndex = pageindex;
            grdEmployeeList.DataBind();



            CreatePagingLinks(grdEmployeeList);
        }
    }

    protected void grdEmployeeList_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {       
        grdEmployeeList.PageIndex = e.NewPageIndex;
        grdEmployeeList.DataBind();
    }

    protected void grdEmployeeList_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        Boolean FirstPager = true;

        if (e.Row.RowType == DataControlRowType.Pager)
        {

            FirstPager = !FirstPager;

            // Read total count of employees from datatable

            DataTable search_datatable = (DataTable)Session["data_table"];

            int rowcount = search_datatable.Rows.Count;

            Label LabelRowCount = (Label)e.Row.FindControl("LabelRowCount");

            if (LabelRowCount != null)
            {
                LabelRowCount.Text = rowcount.ToString();
            }

            // Calculate first row and last row on current page

            int pageindex = ((GridView)e.Row.Parent.Parent).PageIndex;
            int pagesize = ((GridView)e.Row.Parent.Parent).PageSize;

            int StartRowNo = (pageindex * pagesize) + 1;

            Label LabelStartRowNo = (Label)e.Row.FindControl("LabelStartRowNo");

            if (LabelStartRowNo != null)
            {
                LabelStartRowNo.Text = StartRowNo.ToString();
            }

            int EndRowNo = StartRowNo + pagesize - 1;

            if (EndRowNo >= rowcount)
            {
                EndRowNo = rowcount;
            }

            Label LabelEndRowNo = (Label)e.Row.FindControl("LabelEndRowNo");

            if (LabelEndRowNo != null)
            {
                LabelEndRowNo.Text = EndRowNo.ToString();
            }

            // Set pageindex for next/previous linkbuttons

            int pagecount = ((GridView)e.Row.Parent.Parent).PageCount;

            LinkButton LinkButtonPreviousPage = (LinkButton)e.Row.FindControl("LinkButtonPreviousPage");

            if (LinkButtonPreviousPage != null)
            {
                if (pageindex == 0)
                {
                    LinkButtonPreviousPage.CommandArgument = pageindex.ToString();
                    LinkButtonPreviousPage.Visible = false;
                }
                else
                {
                    LinkButtonPreviousPage.CommandArgument = (pageindex - 1).ToString();
                }
            }

            LinkButton LinkButtonNextPage = (LinkButton)e.Row.FindControl("LinkButtonNextPage");

            if (LinkButtonNextPage != null)
            {
                if (pageindex == (pagecount - 1))
                {
                    LinkButtonNextPage.CommandArgument = pageindex.ToString();
                    LinkButtonNextPage.Visible = false;
                }
                else
                {
                    LinkButtonNextPage.CommandArgument = (pageindex + 1).ToString();
                }
            }
        }
    }

    public SortDirection GridViewSortDirection
    {
        get
        {
            if (ViewState["sortDirection"] == null)

                ViewState["sortDirection"] = SortDirection.Ascending;

            return (SortDirection)ViewState["sortDirection"];
        }

        set { ViewState["sortDirection"] = value; }
    }


    protected void grdEmployeeList_Sorting(object sender, GridViewSortEventArgs e)
    {
        string sortExpression = e.SortExpression;

        if (GridViewSortDirection == SortDirection.Ascending)
        {
            GridViewSortDirection = SortDirection.Descending;
            SortGridView(sortExpression, " DESC");
        }
        else
        {
            GridViewSortDirection = SortDirection.Ascending;
            SortGridView(sortExpression, " ASC");
        }
    }

    private void SortGridView(string sortExpression, string direction)
    {
        DataTable dt = (DataTable)Session["data_table"];

        DataView dv = new DataView(dt);

        dv.Sort = sortExpression + " " + direction;

        grdEmployeeList.DataSource = dv;
        grdEmployeeList.DataBind();

        CreatePagingLinks(grdEmployeeList);

    }

mvh
simsen :-)
Avatar billede neoman Novice
06. november 2007 - 11:42 #1
Når du skifter page i denne her
      else if (e.CommandName == "ChangePage")
        {
            int pageindex = Convert.ToInt32(e.CommandArgument);

            DataTable search_datatable = (DataTable)Session["data_table"];

            grdEmployeeList.DataSource = search_datatable.DefaultView;

            grdEmployeeList.PageIndex = pageindex;
            grdEmployeeList.DataBind();



            CreatePagingLinks(grdEmployeeList);
        }

så viser du tabellen med defaultview og ikke sorteret. du skal nok kalde lidt herfra også :

        DataView dv = new DataView(dt);

        dv.Sort = sortExpression + " " + direction;

        grdEmployeeList.DataSource = dv;
        grdEmployeeList.DataBind();
Avatar billede simsen Mester
06. november 2007 - 12:21 #2
Hejsa neoman,

Det jeg skulle bruge - tak for hjælpen - smid et svar :-)

mvh
simsen :-)
Avatar billede neoman Novice
06. november 2007 - 12:24 #3
smid et svar også - 100 pts for et blik er alt for meget:P
Avatar billede simsen Mester
06. november 2007 - 16:56 #4
svar - og takker :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester