Gridview With All Operations Using LIST

.aspx


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="GridviewAllOperations.WebForm1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
   <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div>
        <asp:GridView ID="grdinsurers" AutoGenerateColumns="false" runat="server" Width="60%"
            CaptionAlign="Top" Caption="Gridview with All Operations" ShowFooter="true" OnRowDeleting="grdinsurers_RowDel"
            OnRowCancelingEdit="grdinsurers_RowCancelingEdit" OnRowEditing="grdinsurers_RowEditing"
            OnRowUpdating="grdinsurers_RowUpdating" OnRowCommand="grdinsurers_RowCommand"
            AllowPaging="true" AllowSorting="true" PageSize="10" OnSorting="grdinsurers_Sorting"
            OnPageIndexChanging="grdinsurers_PageIndexChanging" OnRowDataBound="grdinsurers_RowDataBound">
            <Columns>
                <asp:TemplateField HeaderText="S.No">
                    <ItemTemplate>
                        <asp:Label ID="lblsno" runat="server" Text="<%#Container.DataItemIndex+1 %>"></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField HeaderText="ID No." DataField="ID" ReadOnly="true" />
                <asp:TemplateField HeaderText="Name" SortExpression="NAME">
                    <ItemTemplate>
                        <asp:Label ID="lblname" runat="server" Text='<%#Eval("NAME") %>'></asp:Label>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="txtupname" runat="server" Text='<%#Eval("NAME") %>'></asp:TextBox>
                        <asp:RequiredFieldValidator ID="reqtxtupname" runat="server" ErrorMessage="*" ForeColor="Red"
                            ControlToValidate="txtupname" ValidationGroup="vgupdate"></asp:RequiredFieldValidator>
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:TextBox ID="txtname" runat="server"></asp:TextBox>
                        <asp:RequiredFieldValidator ID="reqtxtname" runat="server" ErrorMessage="*" ForeColor="Red"
                            ControlToValidate="txtname" ValidationGroup="vginsert"></asp:RequiredFieldValidator>
                    </FooterTemplate>
                    <HeaderStyle HorizontalAlign="Left" />
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Salary" SortExpression="SAL">
                    <ItemTemplate>
                        <asp:Label ID="lblsal" runat="server" Text='<%#Eval("SAL") %>'></asp:Label>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="txtupSAL" runat="server" Text='<%#Eval("SAL") %>'></asp:TextBox>
                        <asp:RequiredFieldValidator ID="reqtxtupSAL" runat="server" ErrorMessage="*" ForeColor="Red"
                            ControlToValidate="txtupSAL" ValidationGroup="vgupdate"></asp:RequiredFieldValidator>
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:TextBox ID="txtsal" runat="server"></asp:TextBox>
                          <asp:RequiredFieldValidator ID="reqtxtsal" runat="server" ErrorMessage="*" ForeColor="Red"
                            ControlToValidate="txtsal" ValidationGroup="vginsert"></asp:RequiredFieldValidator>
                        <br />
                        <asp:Label ID="lblsaltotal" runat="server"></asp:Label>
                    </FooterTemplate>
                    <HeaderStyle HorizontalAlign="Left" />
                </asp:TemplateField>
                <asp:TemplateField HeaderText="City">
                    <ItemTemplate>
                        <asp:Label ID="lblcity" runat="server" Text='<%#Eval("CITY") %>'></asp:Label>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="txtupCITY" runat="server" Text='<%#Eval("CITY") %>'></asp:TextBox>
                        <asp:RequiredFieldValidator ID="reqtxtupCITY" runat="server" ErrorMessage="*" ForeColor="Red"
                            ControlToValidate="txtupCITY" ValidationGroup="vgupdate"></asp:RequiredFieldValidator>
                    </EditItemTemplate>
                    <HeaderStyle HorizontalAlign="Left" />
                    <FooterTemplate>
                        <asp:TextBox ID="txtcity" runat="server"></asp:TextBox>
                            <asp:RequiredFieldValidator ID="reqtxtcity" runat="server" ErrorMessage="*" ForeColor="Red"
                            ControlToValidate="txtcity" ValidationGroup="vginsert"></asp:RequiredFieldValidator>
                    </FooterTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Gender">
                    <ItemTemplate>
                        <asp:Label ID="lblgender" runat="server" Text='<%#Eval("GENDERTEXT") %>'></asp:Label>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="ddlgenderup" runat="server" OnSelectedIndexChanged="ddlgenderup_SelectedIndexChanged"
                            AutoPostBack="true">
                        </asp:DropDownList>
                        <asp:RequiredFieldValidator ID="reqddlgenderup" runat="server" ErrorMessage="*" ForeColor="Red"
                            InitialValue="- Select -" ControlToValidate="ddlgenderup" ValidationGroup="vgupdate"></asp:RequiredFieldValidator>
                    </EditItemTemplate>
                    <HeaderStyle HorizontalAlign="Left" />
                    <FooterTemplate>
                        <asp:DropDownList ID="ddlgender" runat="server" OnSelectedIndexChanged="ddlgender_SelectedIndexChanged"
                            AutoPostBack="true">
                        </asp:DropDownList>
                         <asp:RequiredFieldValidator ID="reqddlgender" runat="server" ErrorMessage="*" ForeColor="Red"
                            InitialValue="- Select -" ControlToValidate="ddlgender" ValidationGroup="vginsert"></asp:RequiredFieldValidator>
                    </FooterTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Section">
                    <ItemTemplate>
                        <asp:Label ID="lblsection" runat="server" Text='<%#Eval("SECTIONTEXT") %>'></asp:Label>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:UpdatePanel ID="uppanelsectionUP" runat="server" UpdateMode="Conditional">
                            <ContentTemplate>
                                <asp:DropDownList ID="ddlsectionup" runat="server">
                                </asp:DropDownList>
                                <asp:RequiredFieldValidator ID="reqddlsectionup" runat="server" ErrorMessage="*"
                                    ForeColor="Red" InitialValue="- Select -" ControlToValidate="ddlsectionup" ValidationGroup="vgupdate"></asp:RequiredFieldValidator>
                            </ContentTemplate>
                            <Triggers>
                                <asp:AsyncPostBackTrigger ControlID="ddlgenderup" EventName="SelectedIndexChanged" />
                            </Triggers>
                        </asp:UpdatePanel>
                    </EditItemTemplate>
                    <HeaderStyle HorizontalAlign="Left" />
                    <FooterTemplate>
                        <asp:UpdatePanel ID="uppanelsection" runat="server" UpdateMode="Conditional">
                            <ContentTemplate>
                                <asp:DropDownList ID="ddlsection" runat="server">
                                </asp:DropDownList>
                                <asp:RequiredFieldValidator ID="reqddlsection" runat="server" ErrorMessage="*"
                                    ForeColor="Red" InitialValue="- Select -" ControlToValidate="ddlsection" ValidationGroup="vginsert"></asp:RequiredFieldValidator>
                            </ContentTemplate>
                            <Triggers>
                                <asp:AsyncPostBackTrigger ControlID="ddlgender" EventName="SelectedIndexChanged" />
                            </Triggers>
                        </asp:UpdatePanel>
                    </FooterTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate>
                    </ItemTemplate>
                    <FooterTemplate>
                        <asp:Button ID="btnsub" runat="server" Text="ADD" CommandName="ADD" ValidationGroup="vginsert"
                            CommandArgument="<%# ((GridViewRow) Container).RowIndex %>" />
                    </FooterTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Update">
                    <EditItemTemplate>
                        <asp:LinkButton ID="lnkupdate" runat="server" CommandName="Update" Text="Update"
                            ValidationGroup="vgupdate"></asp:LinkButton>
                        <asp:LinkButton ID="lnkcancel" runat="server" CommandName="Cancel" Text="Cancel"
                            ValidationGroup="vgnone"></asp:LinkButton>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:LinkButton ID="lnkedit" runat="server" CommandName="Edit" Text="Edit" ValidationGroup="vgnone"></asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:ButtonField ButtonType="Link" Text="Delete" CommandName="Delete" HeaderText="Delete"
                    ValidationGroup="vgnone" />
            </Columns>
            <RowStyle HorizontalAlign="Left" />
        </asp:GridView>
    </div>
    </form>
</body>
</html>

 .CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Reflection;

namespace GridviewAllOperations
{
    //Use Serializable to store this in ViewState
    [Serializable]
    public class Mylist
    {
        public Mylist()
        {

        }
        string _id, _name, _sal, _city;
        public string ID
        {
            get { return _id; }
            set { _id = value; }
        }
        public string NAME
        {
            get { return _name; }
            set { _name = value; }
        }
        public string SAL
        {
            get { return _sal; }
            set { _sal = value; }
        }
        public string CITY
        {
            get { return _city; }
            set { _city = value; }
        }
        string _gendervalue, _gendertext, _sectionvalue, _sectiontext;
        public string GENDERVALUE
        {
            get { return _gendervalue; }
            set { _gendervalue = value; }
        }
        public string GENDERTEXT
        {
            get { return _gendertext; }
            set { _gendertext = value; }
        }
        public string SECTIONVALUE
        {
            get { return _sectionvalue; }
            set { _sectionvalue = value; }
        }
        public string SECTIONTEXT
        {
            get { return _sectiontext; }
            set { _sectiontext = value; }
        }
    }

    public class DDLClass
    {
        string _gendervalue, _gendertext, _sectionvalue, _sectiontext;
        public string GENDERVALUE
        {
            get { return _gendervalue; }
            set { _gendervalue = value; }
        }
        public string GENDERTEXT
        {
            get { return _gendertext; }
            set { _gendertext = value; }
        }
        public string SECTIONVALUE
        {
            get { return _sectionvalue; }
            set { _sectionvalue = value; }
        }
        public string SECTIONTEXT
        {
            get { return _sectiontext; }
            set { _sectiontext = value; }
        }
    }
    /// <summary>
    /// This class is used to compare any
    /// type(property) of a class for sorting.
    /// This class automatically fetches the
    /// type of the property and compares.
    /// </summary>
    public sealed class GenericComparer<T> : IComparer<T>
    {
        public enum SortOrder { Ascending, Descending };

        #region Constructors
        public GenericComparer(string sortColumn, SortOrder sortingOrder)
        {
            this._sortColumn = sortColumn;
            this._sortingOrder = sortingOrder;
        }

        /// <summary>
        /// Constructor when passing in a sort expression containing both the Sort Column and the Sort Order
        /// e.g., "BPCode ASC".
        /// </summary>
        /// <param name="sortExpression"></param>
        /// <remarks>
        /// This constructor is useful when using this with the ASP.NET ObjectDataSource,
        /// which passes the SortParameterName in this format
        /// </remarks>
        public GenericComparer(string sortExpression)
        {
            string[] sortExprArray = sortExpression.Split(" ".ToCharArray());
            string sortColumn = sortExprArray[0];
            SortOrder sortingOrder;
            sortingOrder = SortOrder.Ascending;
            if (sortExprArray.Length > 1)
            {
                if (sortExprArray[1].ToUpper() == "DESC")
                {
                    sortingOrder = SortOrder.Descending;
                }
            }

            this._sortColumn = sortColumn;
            this._sortingOrder = sortingOrder;
        }

        #endregion



        #region public properties
        /// <summary>
        /// Column Name(public property of the class) to be sorted.
        /// </summary>
        private string _sortColumn;
        public string SortColumn
        {
            get { return _sortColumn; }
        }

        /// <summary>
        /// Sorting order (ASC OR DESC)
        /// </summary>
        private SortOrder _sortingOrder;
        public SortOrder SortingOrder
        {
            get { return _sortingOrder; }
        }

        #endregion

        /// <summary>
        /// Compare two objects of the same class,
        /// based on the value of a given property
        /// </summary>
        /// <param name="x">First Object</param>
        /// <param name="y">Second Object</param>
        /// <returns>int</returns>
        public int Compare(T x, T y)
        {

            // User reflection to get the property
            PropertyInfo propertyInfo = typeof(T).GetProperty(_sortColumn);

            // Cast the property to IComparable, so we can use the built-in compare.
            IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null);
            IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null);

            // Order depends on Asc vs Desc.
            if (_sortingOrder == SortOrder.Ascending)
            {
                return (obj1.CompareTo(obj2));
            }
            else
            {
                return (obj2.CompareTo(obj1));
            }
        }
    }
    public partial class WebForm1 : System.Web.UI.Page
    {

        List<DDLClass> ddllist = new List<DDLClass>()
                {
                    new DDLClass{SECTIONVALUE="1",SECTIONTEXT="Section ONE",GENDERVALUE="1",GENDERTEXT="Male"},
                    new DDLClass{SECTIONVALUE="2",SECTIONTEXT="Section TWO",GENDERVALUE="1",GENDERTEXT="Male"},
                    new DDLClass{SECTIONVALUE="3",SECTIONTEXT="Section THREE",GENDERVALUE="1",GENDERTEXT="Male"},
                    new DDLClass{SECTIONVALUE="4",SECTIONTEXT="Section FOUR",GENDERVALUE="2",GENDERTEXT="Female"},
                    new DDLClass{SECTIONVALUE="5",SECTIONTEXT="Section FIVE",GENDERVALUE="2",GENDERTEXT="Female"}
                };

        decimal Count = 0M; //This is for total to show in footer

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                FillGrid();
            }
        }
        protected void grdinsurers_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            //If you use Row Command Like Cancel,Delete,Edit,Page,Select,Sort,Update the following events will be raised automatically so just its needed implementaion.
            /*
             *      CommandName             Description
             *      ===========             ===========
             *      Cancel                  Cancels an edit operation and returns the GridView control to read-only mode.Raises the RowCancelingEdit event.
             *     
             *      Delete                  Deletes the current record.Raises the RowDeleting and RowDeleted events.
             *     
             *      Edit                    Puts the current record in edit mode.Raises the RowEditing event.
             *     
             *      Page                    Performs a paging operation.Sets the CommandArgument property of the button to "First ", "Last ", "Next ", "Prev", or a page number to specify the type of paging operation to perform.Raises the PageIndexChanging and PageIndexChanged events.
             *     
             *      Select                  Selects the current record.Raises the SelectedIndexChanging  and SelectedIndexChanged events.
             *     
             *      Sort                    Sorts the GridView control.Raises the Sorting and Sorted events.
             *     
             *      Update                  Updates the current record in the data source.Raises the RowUpdat ing and RowUpdated events.
            */

            if (e.CommandName == "ADD")
            {

                GridViewRow row = grdinsurers.FooterRow;

                TextBox tempname = (TextBox)row.FindControl("txtname");
                TextBox tempsal = (TextBox)row.FindControl("txtsal");
                TextBox tempcity = (TextBox)row.FindControl("txtcity");
                DropDownList tempddlgender = (DropDownList)row.FindControl("ddlgender");
                DropDownList tempddlsection = (DropDownList)row.FindControl("ddlsection");

                if (ViewState["list"] == null)
                {
                    Mylist obj = new Mylist();
                    List<Mylist> list = new List<Mylist>
                    {
                        new Mylist{ID="IND000",NAME=tempname.Text,SAL=tempsal.Text,CITY=tempcity.Text,GENDERTEXT=tempddlgender.SelectedItem.Text,GENDERVALUE=tempddlgender.SelectedValue,SECTIONTEXT=tempddlsection.SelectedItem.Text,SECTIONVALUE=tempddlsection.SelectedValue}
                    };

                    ViewState["list"] = list;
                    FillGrid();
                }
                else
                {
                    List<Mylist> list = (List<Mylist>)ViewState["list"];
                    string id = "IND00" + list.Count;
                    list.Add(new Mylist { ID = id, NAME = tempname.Text, SAL = tempsal.Text, CITY = tempcity.Text, GENDERTEXT = tempddlgender.SelectedItem.Text, GENDERVALUE = tempddlgender.SelectedValue, SECTIONTEXT = tempddlsection.SelectedItem.Text, SECTIONVALUE = tempddlsection.SelectedValue });

                    ViewState["list"] = list;
                    FillGrid();
                }
            }
        }
        private void FillGrid()
        {
            if (ViewState["list"] != null)
            {
                List<Mylist> list = (List<Mylist>)ViewState["list"];
                if (list.Count > 0)
                {
                    grdinsurers.DataSource = list;
                    grdinsurers.DataBind();

                    ((DataControlField)grdinsurers.Columns.Cast<DataControlField>().Where(fld => fld.HeaderText == "Update").SingleOrDefault()).Visible = true;
                    ((DataControlField)grdinsurers.Columns.Cast<DataControlField>().Where(fld => fld.HeaderText == "Delete").SingleOrDefault()).Visible = true;
                }
                else
                {
                    FillEmptyGrid();
                }
            }
            else
            {
                FillEmptyGrid();
            }

            //Fill dropdown list

            var distinctgender = (ddllist.GroupBy(x => x.GENDERVALUE).Select(y => y.First())).ToList();//Use this LINQ TO SQL Query for getting UNIQUE rows from list.
            GridViewRow foot = grdinsurers.FooterRow;
            DropDownList tempddlgender = (DropDownList)foot.FindControl("ddlgender");

            tempddlgender.DataSource = distinctgender;
            tempddlgender.DataTextField = "GENDERTEXT";
            tempddlgender.DataValueField = "GENDERVALUE";
            tempddlgender.DataBind();
            tempddlgender.Items.Insert(0, "- Select -");

            DropDownList tempddlsection = (DropDownList)foot.FindControl("ddlsection");

            var selectionlist = (from sel in ddllist where sel.GENDERVALUE == tempddlgender.SelectedValue select sel).ToList();

            if (selectionlist.Count > 0)
            {
                tempddlsection.DataSource = selectionlist;
            }
            else
            {
                List<DDLClass> emptylist = new List<DDLClass>();
                tempddlsection.DataSource = emptylist;
            }
            tempddlsection.DataTextField = "SECTIONTEXT";
            tempddlsection.DataValueField = "SECTIONVALUE";
            tempddlsection.DataBind();
            tempddlsection.Items.Insert(0, "- Select -");

        }
        private void FillEmptyGrid()
        {
            Mylist obj = new Mylist();
            List<Mylist> list = new List<Mylist>();

            list.Add(obj);//binds empty list to grid

            //Hide grid columns based on column HeaderText
            ((DataControlField)grdinsurers.Columns.Cast<DataControlField>().Where(fld => fld.HeaderText == "Update").SingleOrDefault()).Visible = false;
            ((DataControlField)grdinsurers.Columns.Cast<DataControlField>().Where(fld => fld.HeaderText == "Delete").SingleOrDefault()).Visible = false;

            grdinsurers.DataSource = list;
            grdinsurers.DataBind();

        }

        protected void grdinsurers_RowDel(object sender, GridViewDeleteEventArgs e)
        {

            GridViewRow row = grdinsurers.Rows[e.RowIndex];

            // Label tempname = (Label)row.FindControl("txtname"); //Find control is to find a control inside the gridview TemplateField
            string id = row.Cells[1].Text;  //Find the value of specific column row based on cell index.
            List<Mylist> list = (List<Mylist>)ViewState["list"];
            list.RemoveAll(p => p.ID == id);

            ViewState["list"] = list;

            grdinsurers.EditIndex = -1;
            FillGrid();
        }

        protected void grdinsurers_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {

            List<Mylist> list = (List<Mylist>)ViewState["list"];
            //Updating list Values based list index
            list[e.RowIndex].NAME = ((TextBox)(grdinsurers.Rows[e.RowIndex].FindControl("txtupname"))).Text;
            list[e.RowIndex].SAL = ((TextBox)(grdinsurers.Rows[e.RowIndex].FindControl("txtupSAL"))).Text;
            list[e.RowIndex].CITY = ((TextBox)(grdinsurers.Rows[e.RowIndex].FindControl("txtupCITY"))).Text;
            list[e.RowIndex].GENDERTEXT = ((DropDownList)(grdinsurers.Rows[e.RowIndex].FindControl("ddlgenderup"))).SelectedItem.Text;
            list[e.RowIndex].GENDERVALUE = ((DropDownList)(grdinsurers.Rows[e.RowIndex].FindControl("ddlgenderup"))).SelectedValue;
            list[e.RowIndex].SECTIONTEXT = ((DropDownList)(grdinsurers.Rows[e.RowIndex].FindControl("ddlsectionup"))).SelectedItem.Text;
            list[e.RowIndex].SECTIONVALUE = ((DropDownList)(grdinsurers.Rows[e.RowIndex].FindControl("ddlsectionup"))).SelectedValue;
            grdinsurers.EditIndex = -1;
            FillGrid();
        }

        protected void grdinsurers_RowEditing(object sender, GridViewEditEventArgs e)
        {

            grdinsurers.EditIndex = e.NewEditIndex;
            FillGrid();

            var distinctgender = (ddllist.GroupBy(x => x.GENDERVALUE).Select(y => y.First())).ToList();//Use this LINQ TO SQL Query for getting UNIQUE rows from list.

            GridViewRow rows = grdinsurers.Rows[grdinsurers.EditIndex];

            int index = rows.DataItemIndex;

            DropDownList tempddlgender = (DropDownList)grdinsurers.Rows[index].FindControl("ddlgenderup");

            tempddlgender.DataSource = distinctgender;
            tempddlgender.DataTextField = "GENDERTEXT";
            tempddlgender.DataValueField = "GENDERVALUE";
            tempddlgender.DataBind();
            tempddlgender.Items.Insert(0, "- Select -");

            List<Mylist> list = (List<Mylist>)ViewState["list"];

            tempddlgender.SelectedValue = list[index].GENDERVALUE;

            DropDownList tempddlsection = (DropDownList)grdinsurers.Rows[index].FindControl("ddlsectionup");

            var selectionlist = (from sel in ddllist where sel.GENDERVALUE == tempddlgender.SelectedValue select sel).ToList();

            if (selectionlist.Count > 0)
            {
                tempddlsection.DataSource = selectionlist;
            }
            else if (tempddlgender.SelectedValue == "2")
            {
                List<DDLClass> emptylist = new List<DDLClass>();
                tempddlsection.DataSource = emptylist;
            }
            tempddlsection.DataTextField = "SECTIONTEXT";
            tempddlsection.DataValueField = "SECTIONVALUE";
            tempddlsection.DataBind();
            tempddlsection.Items.Insert(0, "- Select -");

            tempddlsection.SelectedValue = list[index].SECTIONVALUE;
        }

        protected void grdinsurers_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            grdinsurers.EditIndex = -1;
            FillGrid();
        }

        protected void grdinsurers_Sorting(object sender, GridViewSortEventArgs e)
        {
            List<Mylist> list = (List<Mylist>)ViewState["list"];

            string sortdirection = e.SortExpression + " " + GetSortDirection(e.SortExpression);


            ////var result0 = (from element in list
            ////              orderby element.NAME ascending
            ////              select element).ToList();

            //if (sortdirection == "ASC")
            //{
            //    var result0 = list.OrderBy(s => s.NAME).ToList();
            //    ViewState["list"] = result0;
            //}
            //else
            //{
            //    var result0 = list.OrderByDescending(s => s.NAME).ToList();
            //    ViewState["list"] = result0;
            //}


            ////list.Sort((a, b) => a.NAME.CompareTo(b.NAME));
            ////ViewState["list"] = list;

            GenericComparer<Mylist> cmp = new GenericComparer<Mylist>(sortdirection);
            list.Sort(cmp);
            ViewState["list"] = list;

            FillGrid();
        }

        private string GetSortDirection(string column)
        {

            // By default, set the sort direction to ascending.
            string sortDirection = "ASC";

            // Retrieve the last column that was sorted.
            string sortExpression = ViewState["SortExpression"] as string;

            if (sortExpression != null)
            {
                // Check if the same column is being sorted.
                // Otherwise, the default value can be returned.
                if (sortExpression == column)
                {
                    string lastDirection = ViewState["SortDirection"] as string;
                    if ((lastDirection != null) && (lastDirection == "ASC"))
                    {
                        sortDirection = "DESC";
                    }
                }
            }

            // Save new values in ViewState.
            ViewState["SortDirection"] = sortDirection;
            ViewState["SortExpression"] = column;

            return sortDirection;
        }

        protected void grdinsurers_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            string Message = string.Empty;
            // Cancel the paging operation if the user attempts to navigate
            // to another page while the GridView control is in edit mode.
            if (grdinsurers.EditIndex != -1)
            {
                // Use the Cancel property to cancel the paging operation.
                e.Cancel = true;

                // Display an error message.
                int newPageNumber = e.NewPageIndex + 1;
                Message = "Please update the record before moving to page " +
                  newPageNumber.ToString() + ".";
            }
            else
            {
                // Clear the error message.
                Message = string.Empty;
                grdinsurers.PageIndex = e.NewPageIndex;
                FillGrid();
            }
        }
        protected void ddlgenderup_SelectedIndexChanged(object sender, EventArgs e)
        {
            GridViewRow rows = (GridViewRow)((Control)sender).Parent.Parent;
            int index = rows.DataItemIndex;
            DropDownList tempddlgender = (DropDownList)grdinsurers.Rows[index].FindControl("ddlgenderup");
            DropDownList tempddlsection = (DropDownList)grdinsurers.Rows[index].FindControl("ddlsectionup");

            var selectionlist = (from sel in ddllist where sel.GENDERVALUE == tempddlgender.SelectedValue select sel).ToList();

            if (selectionlist.Count > 0)
            {
                tempddlsection.DataSource = selectionlist;
            }
            else
            {
                List<DDLClass> emptylist = new List<DDLClass>();
                tempddlsection.DataSource = emptylist;
            }
            tempddlsection.DataTextField = "SECTIONTEXT";
            tempddlsection.DataValueField = "SECTIONVALUE";
            tempddlsection.DataBind();
            tempddlsection.Items.Insert(0, "- Select -");

        }
        protected void ddlgender_SelectedIndexChanged(object sender, EventArgs e)
        {
            GridViewRow foot = grdinsurers.FooterRow;
            DropDownList tempddlgender = (DropDownList)foot.FindControl("ddlgender");
            DropDownList tempddlsection = (DropDownList)foot.FindControl("ddlsection");

            var selectionlist = (from sel in ddllist where sel.GENDERVALUE == tempddlgender.SelectedValue select sel).ToList();

            if (selectionlist.Count > 0)
            {
                tempddlsection.DataSource = selectionlist;
            }
            else
            {
                List<DDLClass> emptylist = new List<DDLClass>();
                tempddlsection.DataSource = emptylist;
            }
            tempddlsection.DataTextField = "SECTIONTEXT";
            tempddlsection.DataValueField = "SECTIONVALUE";
            tempddlsection.DataBind();
            tempddlsection.Items.Insert(0, "- Select -");
        }

        protected void grdinsurers_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            //Show total in footer

            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                try
                {
                    Label templblsal = (Label)e.Row.FindControl("lblsal");
                    Count += Convert.ToDecimal(templblsal.Text);
                }
                catch
                {
                    //do nothing
                }
            }

            if (e.Row.RowType == DataControlRowType.Footer)
            {
                Label templblsal = (Label)e.Row.FindControl("lblsaltotal");
                templblsal.Text = Count.ToString("F");
            }
        }
    }
}


You can Download full Code from Here.