Avatar billede sjaka Nybegynder
27. september 2004 - 15:23 Der er 8 kommentarer og
1 løsning

Sortere i et datagrid

Hej.

Jeg har oprettet forbindelse til en MySQL database, og fået vist tingene i mit datagrib. Hvordan laver jeg det sortable, så jeg ved at klikke øverst i en kolonne kan sortere alfabetisk?

Jeg vil gerne have et eksempel hvis det kan lade sig gøre.
Avatar billede snepnet Nybegynder
27. september 2004 - 16:55 #1
Du kan lige få et system hvor kolonnerne genereres automatisk, og hvor de data som griddet viser tages fra et dataset i session (den funktion skal du så selv udfylde).

Først aspx-filen :

<%@ Page language="c#" Codebehind="CompleteDataGrid.aspx.cs" AutoEventWireup="false" Inherits="EXP.CompleteDataGrid" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>CompleteDataGrid</title>
        <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
        <meta content="C#" name="CODE_LANGUAGE">
        <meta content="JavaScript" name="vs_defaultClientScript">
        <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
    </HEAD>
    <body>
        <form id="Form1" method="post" runat="server">
            <asp:datagrid id="Dg" runat="server" PageSize="20" AllowPaging="True" ShowFooter="True" AllowSorting="True"
                Font-Names="Verdana" Font-Size="X-Small" GridLines="None" CellPadding="3" BackColor="White"
                BorderWidth="2px" CellSpacing="1" BorderStyle="Ridge" BorderColor="White">
                <SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#9471DE"></SelectedItemStyle>
                <ItemStyle ForeColor="Black" BackColor="#DEDFDE"></ItemStyle>
                <HeaderStyle Font-Bold="True" ForeColor="#E7E7FF" BackColor="#4A3C8C"></HeaderStyle>
                <FooterStyle ForeColor="Black" BackColor="#C6C3C6"></FooterStyle>
                <Columns>
                    <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Update" CancelText="Cancel" EditText="Edit"></asp:EditCommandColumn>
                </Columns>
                <PagerStyle HorizontalAlign="Right" ForeColor="Black" BackColor="#C6C3C6" Mode="NumericPages"></PagerStyle>
            </asp:datagrid>
        </form>
    </body>
</HTML>
Avatar billede snepnet Nybegynder
27. september 2004 - 17:00 #2
Og en code-behind :

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace EXP
{
    /// <summary>
    /// Summary description for CompleteDataGrid.
    /// </summary>
    public class CompleteDataGrid : System.Web.UI.Page
    {
        protected const string ASC    = "ASC";
        protected const string DESC = "DESC";
       
        protected HtmlForm Form1;
        protected System.Web.UI.WebControls.DataGrid Dg;
       
        private const string PAGEDATANAME = "PAGEDATA";

        // bare en property så der er adgang til lidt data
        protected DataSet PageDataSet
        {
            get{return (object)Session[PAGEDATANAME] != null ? (DataSet)Session[PAGEDATANAME] : new DataSet();}
            set{Session[PAGEDATANAME] = value;}
        }

        // sørger for at datasættet lægges i sessionvariablen
        protected void EstablishTestData()
        {           
            PageDataSet = <her skal du så hente et eller andet>
        }


        // page_load
        private void Page_Load(object sender, System.EventArgs e)
        {
            // vi skal have lidt data at hygge med
            if(!IsPostBack)
            {
                EstablishTestData();
                UpdateGrid();
            }               
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Dg.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.Dg_PageIndexChanged);
            this.Dg.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.Dg_CancelCommand);
            this.Dg.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.Dg_EditCommand);
            this.Dg.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.Dg_SortCommand);
            this.Dg.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.Dg_UpdateCommand);
            this.Dg.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.Dg_DeleteCommand);
            this.Load += new System.EventHandler(this.Page_Load);
        }

        private void UpdateGrid()
        {
            Dg.DataSource = PageDataSet;
            Dg.DataBind();
        }

        private void UpdateGrid(DataView dv)
        {
            Dg.DataSource = dv;
            Dg.DataBind();
        }

        private void Dg_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
        {
            Dg.CurrentPageIndex = e.NewPageIndex;
            UpdateGrid();           
        }

        private void Dg_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
            Dg.EditItemIndex = e.Item.ItemIndex;
            UpdateGrid();
        }

        private void Dg_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
            Dg.EditItemIndex = -1;
            UpdateGrid();       
        }

        private void Dg_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {       
        }

        private void Dg_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
        {
            DataView dv = new DataView(PageDataSet.Tables[SampleTable.TableName]);
            string sortOrder = Dg.Attributes["SortOrder"] != null ? Dg.Attributes["SortOrder"].ToString() : ASC;
           
            if((object)Dg.Attributes["SortOrder"] == null)
                Dg.Attributes["SortOrder"] = ASC;

            if((object)Dg.Attributes["SortColumn"] == null)
                Dg.Attributes["SortColumn"] = SampleTable.FldId.ToUpper();

            if(Dg.Attributes["SortColumn"].ToString() == e.SortExpression.ToUpper())
            {
                if(sortOrder == ASC)
                    sortOrder = DESC;
                else if(sortOrder == DESC)
                    sortOrder = ASC;
            }

            dv.Sort = e.SortExpression + " " + sortOrder;
            Dg.Attributes["SortColumn"] = e.SortExpression.ToUpper();
            Dg.Attributes["SortOrder"] = sortOrder;
           
            UpdateGrid(dv);
        }

        private void Dg_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
            int uniqueId = int.Parse(((TextBox)e.Item.Cells[1].Controls[0]).Text);
            DataRow dr = PageDataSet.Tables[<skal passe>].Rows.Find(uniqueId);
            dr[<skal passe>] = ((TextBox)e.Item.Cells[2].Controls[0]).Text;
            Dg.EditItemIndex = -1;
            UpdateGrid();
        }

        protected override void OnPreRender(EventArgs e)
        {
            // for at forhindre at der slås viewstate over hvert item i griddet...
            foreach(DataGridItem dgItem in Dg.Items)
            {
                dgItem.EnableViewState = false;
            }
           
            base.OnPreRender (e);
        }
    }   
}
Avatar billede snepnet Nybegynder
27. september 2004 - 17:04 #3
Det virker fint nok som det er (hvis du får skrevet noget fornuftigt ind der hvor der er sat <> om), men det er ikke helt færdigt.... bare sådan lidt eksempelagtigt.

der bindes både direkte til dataset, og til view (det skifter lidt :o).

du må endelig sige til, hvis der er noget der er sort.

Og lige til sidst.... både webmatrix, og den nye version af asp.net (2.0 beta) - huser et grid der kan give sorteringsmuligheder uden du behøver at kode det selv.

håber du kan bruge det til et eller andet.

mvh
Avatar billede snepnet Nybegynder
01. oktober 2004 - 20:21 #4
sjaka ?
Avatar billede sjaka Nybegynder
05. oktober 2004 - 10:54 #5
Yes, smid et svar :)
Avatar billede snepnet Nybegynder
05. oktober 2004 - 15:47 #6
får du her :o)
mvh
Avatar billede snepnet Nybegynder
09. oktober 2004 - 15:38 #7
hej sjake :o)
kan vi lukke her ?
mvh
Avatar billede snepnet Nybegynder
21. oktober 2004 - 16:34 #8
sjaka ?
Avatar billede sjaka Nybegynder
27. oktober 2004 - 09:15 #9
Jeg har været væk. Undskyld den lange ventetid
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