C# collection in GridView ASP page

I had the need to display a sortable GridView in an Asp page. I have a collection of objects rather than a table object. What I chose to do was to convert the collection into DataView. Then it’s easy to use the built in .net sorting. The collection updates in real time, therefor a timer was added to update the grid every 15 seconds.

First the asp code

<asp:ScriptManager ID=“ScriptManager1” runat=“server” />
         <div>
            <asp:Timer ID=“Timer1” OnTick=“Timer1_Tick” runat=“server” Interval=“15000”>
            </asp:Timer>
        </div>
     <table>
            <tr>
                <td>
                    <asp:Label ID=“HeaderLabel” runat=“server” Text=“” />
                    <Triggers>
                            <br />
                            <asp:AsyncPostBackTrigger ControlID=“Timer1” EventName=“Tick” />
                    </Triggers>
                    <asp:GridView ID=“gvCarGrid”
                                SkinID=“GridView”
                                  CaptionAlign=“Top”
                                  runat=“server”
                                  Font-Size=“Small”
                                  onrowdatabound=“gvCarGrid_RowDataBound”
                                  AllowSorting=“True”
                                  onsorting=“gvCarGrid_Sorting”
                                  > 
                        <Columns>
                            <asp:BoundField ReadOnly=“true” HeaderText=“Model” DataField=“Model”
                                SortExpression=“Model” />
                            <asp:BoundField ReadOnly=“true” HeaderText=“Year” DataField=“Year”
                                SortExpression=“Year” />
                            </asp:BoundField>
                        </Columns>                                         
                    </asp:GridView>
                </td>
            </tr>
       </table>

Then the C# code

private static DataTable mCarTable = new DataTable();
        //
        private const string COL_MODEL = “Model”;
        private const string COL_YEAR  = “Year”;
        //
        private const string ASCENDING = ” ASC”;
        private const string DESCENDING = ” DESC”;
        //
        private const string SORT_ORDER = “sortOrder”;
        private const string SORT_COLUMN = “sortCol”;
       

        protected void Page_Load(object sender, EventArgs e)
        {
           
            if (!Page.IsPostBack)
            {
                // State variables
                ViewState[SORT_ORDER] = ASCENDING;
                ViewState[SORT_COLUMN] = COL_MODEL;
                // Intialize
                this.InitTable();
                // Load the grid
                this.loadGrid();
            }
        }

        // Initialize car table to use with the view
        void InitTable()
        {
            mCarTable = new DataTable();
            mCarTable.Columns.Add(COL_MODEL);
            mCarTable.Columns.Add(COL_YEAR, typeof(int));
        }

        // Initialize DataView from list
        private DataView getDataView( IList<Car> plCars )
        {
            mCarTable.Rows.Clear();

            foreach (Car  myCar in plCars )
            {
                DataRow newRow = mCarTable.NewRow();
                //
                newRow[COL_MODEL] = myCar.Model;
                newRow[COL_YEAR] = myCar.Year;
                //
                mCarTable.Rows.Add(newRow);
            }

            return new DataView(mCarTable);
        }

        void loadGrid()
        {
                IList<Car> list = getCarList();
                //
                this.addSortIndicator();
                //
                DataView carView = this.getDataView(list);
                carView.Sort = ViewState[SORT_COLUMN].ToString() + ViewState[SORT_ORDER].ToString();
                //
                gvCarGrid.DataSource = carView;
                gvCarGrid.DataBind();
        }

        // Call before sorting
        protected void gvCarGrid_Sorting(object sender, GridViewSortEventArgs e)
        {
            // Set the correct direction
            if( ViewState[SORT_COLUMN].ToString() == e.SortExpression &&
            ViewState[SORT_ORDER].ToString() == ASCENDING )
                ViewState[SORT_ORDER] = DESCENDING;
            else
                ViewState[SORT_ORDER] = ASCENDING;

            // Set it
            ViewState[SORT_COLUMN] = e.SortExpression;

            // Load it
            this.loadGrid();
        }

        private void addSortIndicator()
        {
            int iCount = 0;
            // Search for the columm with the sort expression
            foreach (DataControlField field in this.gvCarGrid.Columns )
            {
                // Reset the headers first
                field.HeaderText = mCarTable.Columns[iCount++].ColumnName;

                if (field.SortExpression == ViewState[SORT_COLUMN].ToString())
                {
                    // Add indicator to header column
                    if (ViewState[SORT_ORDER].ToString() == ASCENDING)
                        field.HeaderText += CxUtil.ASCENDING_ARROW;
                    else
                        field.HeaderText += CxUtil.DESCENDING_ARROW;
                }
            }

        }

        protected void Timer1_Tick(object sender, EventArgs e)
        {
            this.loadGrid();
        }

Leave a Reply