Click here to Skip to main content
6,629,377 members and growing! (21,535 online)
Email Password   helpLost your password?
Web Development » Applications & Tools » Applications     Intermediate

Custom editable Datagrid with paging and sorting

By Elph

How to create a grid control for easy editing
C#, Windows, .NET 1.0, .NET 1.1, ASP.NET, Visual Studio, Dev
Posted:3 Dec 2003
Views:190,620
Bookmarked:65 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
19 votes for this article.
Popularity: 4.01 Rating: 3.14 out of 5
5 votes, 26.3%
1
2 votes, 10.5%
2

3
3 votes, 15.8%
4
9 votes, 47.4%
5

Introduction

This article shows you how to create a custom DataGrid with paging, alternate sorting, and is also completely editable

Details

When I was developing some asp.net pages, I lost a lot of time with Datagrids. The code here is to made that work more simple. Only drag the control to the page, complete some properties, point to the methods that controls the updating, deleting and you have a complete editable grid.

[ToolboxData("<{0}:editableElphGrid runat="\""server\">
    </{0}:editableElphGrid>")]
//ParseChildren allow to work with templates inside the custom datagrid

[ParseChildren(true)]
public class editableElphGrid : System.Web.UI.WebControls.DataGrid
{
    /// <summary>

    /// Points to the method that returns a datatable with data

    /// Apunta a la funcion q devolvera un dataTable con los datos

    /// </summary>

    public delegate DataTable getData();
    /// <summary>

    /// Obtain data event 

    /// Evento de obtener datos

    /// </summary>

    public event getData GetData;
    /// <summary>

    /// Points to method(to update data)

    /// Apunta a un metodo q nos servira para modificar datos

    /// </summary>

    public delegate void updateData(int dataKey,DataGridCommandEventArgs e);
    /// <summary>

    /// Update data event

    /// </summary>

    public event updateData UpdateData;
    /// <summary>

    /// Points to method(delete data)

    /// Apunta al metodo q usaremos para eliminar los datos

    /// </summary>

    public delegate void deleteData(int dataKey,DataGridCommandEventArgs e);
    /// <summary>

    /// delete data event

    /// </summary>

    public event deleteData DeleteData; 
    /// <summary>

    /// Cancel data

    /// </summary>

    public delegate void cancelData(int dataKey,DataGridCommandEventArgs e);
    /// <summary>

    /// cancel data event

    /// </summary>

    public event cancelData CancelData;
    /// <summary>

    /// edit data

    /// </summary>

    public delegate void editData(int dataKey,DataGridCommandEventArgs e);
    /// <summary>

    /// edit data event

    /// </summary>

    public event editData EditData;
    // Note: the params passed on the delegates

    // dataKey: is the DataKey field of the edited/

    // canceled/updated/deleted row

    // e: for work with the cells of the grid

    /// <summary>

    /// First sorting field

    /// campo por el q se ordenara en la primera carga

    /// </summary>

    private string _cFirst="";
    /// <summary>

    /// First sorting field

    /// campo por el q se ordenara en la primera carga

    /// </summary>

    public string FirstSortingField
    {
        get
        {return _cFirst;}
        set
        {_cFirst=value;}
    }
    // Inicializamos el grid

    protected override void OnInit(EventArgs e)
    {
        //paginacion=true

        this.AllowPaging=true;
        //ordenacion=true

        this.AllowSorting=true;
        //evento cambio de pagina

        //ADD the events

        this.PageIndexChanged+=new DataGridPageChangedEventHandler(
              cPage_elphGrid);
        //evento ordenar

        this.SortCommand+=new DataGridSortCommandEventHandler(
               Order_elphGrid);
        //evento de cargar datos

        this.Load+=new EventHandler(elphGrid_Load);
        this.EditCommand+=new DataGridCommandEventHandler(Edit_elphGrid);
        this.CancelCommand+=new DataGridCommandEventHandler(Cancel_elphGrid);
        this.DeleteCommand+=new DataGridCommandEventHandler(Delete_elphGrid);
        this.UpdateCommand+=new DataGridCommandEventHandler(Update_elphGrid);
        //clear the columns

        //limpiamos las columnas

        this.Columns.Clear();
        //create the editComandColumn an deleteColumn

        //creamos las columnas de editar i eliminar

        EditCommandColumn col=new EditCommandColumn();
        col.ButtonType=ButtonColumnType.LinkButton;
        col.CancelText="Cancel";
        col.EditText="Edit";
        col.UpdateText="Update";
        this.Columns.Add(col);
        ButtonColumn delCol=new ButtonColumn();
        delCol.CommandName="Delete";
        delCol.ButtonType=ButtonColumnType.LinkButton;
        delCol.Text="Delete";
        this.Columns.Add(delCol);
    }
    private void elphGrid_Load(object sender, EventArgs e)
    {
        if(!this.Page.IsPostBack)
        {
            //changed Session object for Viewstate

            if(this.AllowSorting&&this._cFirst!="")
                this.ViewState.Add("_orderBy",this._cFirst);
            this.ViewState.Add("_orderType","ASC");
            this.DataSource = CreateDataSet();
            this.DataBind();
        }
    }
    private void cPage_elphGrid(object sender, 
             DataGridPageChangedEventArgs e)
    {
        //PAging

        this.CurrentPageIndex = e.NewPageIndex;
        this.DataSource = CreateDataSet();
        this.DataBind();
    }
    private ICollection CreateDataSet() 
    {
        //this.ObtenerDatos call a external function that return data

        DataTable dt=this.GetData();
        if(this.AllowSorting&&this.ViewState["_orderBy"]!=null)
        {
            //sort the grid

            if(this.ViewState["_orderType"].ToString() == "ASC")
                dt.DefaultView.Sort=(string)
                   this.ViewState["_orderBy"].ToString()+" ASC";
            else if(this.ViewState["_orderType"].ToString()=="DESC")
                dt.DefaultView.Sort=(string)this.ViewState["_orderBy"]+
                          " DESC";
        }
        return dt.DefaultView;
    }
    public void Order_elphGrid(object sender, DataGridSortCommandEventArgs e) 
    { 
        this.ViewState["_orderBy"]=(string)e.SortExpression;
        if(this.ViewState["_orderType"].ToString()=="ASC")
            this.ViewState["_orderType"]="DESC";
        else if(this.ViewState["_orderType"].ToString()=="DESC")
            this.ViewState["_orderType"]="ASC";
        this.DataSource = CreateDataSet();
        this.DataBind(); 
    }
    public void Edit_elphGrid(object sender, 
           System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
        int id=Convert.ToInt32(this.DataKeys[e.Item.ItemIndex]);
        this.EditData(id,e);
        this.EditItemIndex=e.Item.ItemIndex;
        this.DataSource = CreateDataSet();
        this.DataBind();
    }
    public void Delete_elphGrid(object sender, 
          System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
        int id=Convert.ToInt32(this.DataKeys[e.Item.ItemIndex]);
        this.DeleteData(id,e);
        this.EditItemIndex=-1;
        this.DataSource = CreateDataSet();
        this.DataBind();
    }
    public void Update_elphGrid(object sender, 
           System.Web.UI.WebControls.DataGridCommandEventArgs e) 
    {
        int id=Convert.ToInt32(this.DataKeys[e.Item.ItemIndex]);
        this.UpdateData(id,e);
        this.EditItemIndex=-1;
        this.DataSource = CreateDataSet();
        this.DataBind();
    }
    public void Cancel_elphGrid(object sender, 
            System.Web.UI.WebControls.DataGridCommandEventArgs e) 
    {
        int id=Convert.ToInt32(this.DataKeys[e.Item.ItemIndex]);
        this.CancelData(id,e);
        this.EditItemIndex=-1;
        this.DataSource = CreateDataSet();
        this.DataBind();
    }
}

Well, now add the control on a page, and then you must fill the fields .

DataKeyField: That is the key field of the table, the unique identifier of a row. I put because I use that on Database actions, like delete a specific row etc.

And on the tab of Events :- GetData, CancelData, EditData and DeleteData.

Finally you should have something like this.

On the aspx page:

<cc1:editableElphGrid id="EditableElphGrid1" runat="server" 
    DataKeyField="intId"></cc1:editableElphGrid>

On the code behind

protected elphControls.editableElphGrid EditableElphGrid1;
   
private void InitializeComponent()
{    
 this.EditableElphGrid1.DeleteData += 
   new elphControls.editableElphGrid.eliminarDatos(this.del);
 this.EditableElphGrid1.GetData += 
   new elphControls.editableElphGrid.obtenerDatos(this.obt);
this.EditableElphGrid1.EditData += 
   new elphControls.editableElphGrid.editarDatos(this.edit);
 this.EditableElphGrid1.UpdateData += 
   new elphControls.editableElphGrid.actualizarDatos(this.act);
 this.EditableElphGrid1.CancelData += 
   new elphControls.editableElphGrid.cancelarDatos(this.cncl);
 this.Load += new System.EventHandler(this.Page_Load);
}
private System.Data.DataTable obt()
{
OleDbConnection conn=new OleDbConnection(
    "Provider=Microsoft.Jet.OLEDB.4.0;Data source=E:\\bdProves.mdb");
 OleDbDataAdapter adapter=new OleDbDataAdapter("select * from tabla",conn);
 adapter.SelectCommand.CommandType=CommandType.Text;
 conn.Open();
 DataSet ds=new DataSet();
 adapter.Fill(ds,"aa");
 conn.Close();
 conn.Dispose();
 return ds.Tables["aa"];
}
private void edit(int dataKey, 
    System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
//here the logic asociated with edit comand... if you have

}
private void del(int dataKey, 
    System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
 //here the logic asociated with delete comand

}
private void cncl(int dataKey, 
    System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
 //here the logic asociated with Cancel comand

}
private void act(int dataKey, 
    System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
 //here the logic asociated with update comand

}

Update

Changed the session to save the sorting params for a viewstate, now you can have two grids on the same page. Also Changed the declaration of the first sorting field, now this isn't necessary. Thanks to Zanoza.

Conclusion

I think that this grid is a good base to customize a datagrid. Hope it could be useful. All comments about this are welcomed.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Elph


Member
TODO: Put something here
Occupation: Web Developer
Location: Spain Spain

Other popular Applications & Tools articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 25 (Total in Forum: 25) (Refresh)FirstPrevNext
Questionevents firing twice Pinmembermojkurs16:39 9 Feb '06  
AnswerRe: events firing twice Pinmembermojkurs17:54 9 Feb '06  
GeneralGetting text from edit/update Pinmemberbkerr20:25 1 Nov '05  
GeneralDataGrid : column width Pinmemberthanchu19:22 2 Oct '05  
GeneralProgramming Style Tips PinmemberPinhead_Me10:36 18 Oct '04  
GeneralRe: Programming Style Tips PinmemberKlom Dark5:43 23 Jan '06  
GeneralRe: Programming Style Tips PinmemberPinhead_Me8:39 23 Jan '06  
GeneralRe: Programming Style Tips Pinmembermtone5:32 28 Jan '07  
Generallogic asociated with update comand PinmemberHamish Ahern2:31 18 Oct '04  
GeneralCan you write VB.NET? PinmemberHamish Ahern1:40 18 Oct '04  
GeneralHola PinmemberFernando Finelli8:04 21 Jul '04  
GeneralControl LoadViewState PinmemberRruedi7:11 3 Jul '04  
General@ Register Pinmemberfsdkjfskl5:02 17 Mar '04  
GeneralHow to use the source file? Pinmemberdeny014:46 23 Jan '04  
GeneralHow do I had non autogenerate columns ? PinmemberErnest Bariq23:20 25 Dec '03  
GeneralRe: How do I had non autogenerate columns ? PinmemberErnest Bariq6:51 30 Dec '03  
GeneralError PinmemberGeorgeMar6:31 10 Dec '03  
GeneralRe: Error PinmemberElph11:33 10 Dec '03  
GeneralRe: Error PinmemberGeorgeMar0:14 11 Dec '03  
GeneralRe: Error PinsussAnonymous2:26 11 Dec '03  
GeneralRe: Error PinmemberGeorgeMar4:05 11 Dec '03  
GeneralProblem with first loading PinmemberZanoza5:27 5 Dec '03  
GeneralRe: Problem with first loading PinmemberElph8:56 5 Dec '03  
GeneralThow! Spanish! PinmemberJonathan de Halleux21:15 4 Dec '03  
GeneralRe: Thow! Spanish! PinmemberElph21:33 4 Dec '03  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 3 Dec 2003
Editor: Marcie Jones
Copyright 2003 by Elph
Everything else Copyright © CodeProject, 1999-2009
Web10 | Advertise on the Code Project