[ Automatically Adding Numbers to the Rows in a DataGridView ]

By: Daniel S. Soper


The source code below demonstrates how to extend the DataGridView class so row numbers will automatically appear in the row header cells. In this implementation, the width of the column that contains the row header cells is automatically adjusted to accomodate the row numbering.

Here are a few screenshots of this class in action:

Figure 1. The appearance of the row numbering in a custom DatagridView with 20 columns and 20 rows. Figure 2. The appearance of the row numbering in a custom DatagridView with 20 columns and 1000 rows. This example also shows the appearance of the grid when a row is selected.

Here's the C# source code... Only 65 lines (including comments)!

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace MyDataGridView
{
    /// 
    /// This class extends the the DataGridView so row numbers will 
    /// automatically appear in the row header cells. In this 
    /// implementation, the width of the column that contains the row 
    /// header cells is automatically adjusted to accomodate the row 
    /// numbering.
    /// ******************************************************************
    ///  AUTHOR: Daniel S. Soper
    ///     URL: http://www.danielsoper.com
    ///    DATE: 20 February 2007
    /// LICENSE: Public Domain. Enjoy!   :-)
    /// ******************************************************************
    /// 
    class MyDGV : DataGridView
    {
        public MyDGV()
        {
            //perform any necessary customization initialization here
        } //end default constructor

        protected override void OnRowPostPaint(DataGridViewRowPostPaintEventArgs e)
        { //this method overrides the DataGridView's RowPostPaint event 
          //in order to automatically draw numbers on the row header cells
          //and to automatically adjust the width of the column containing
          //the row header cells so that it can accommodate the new row
          //numbers,

            //store a string representation of the row number in 'strRowNumber'
            string strRowNumber = (e.RowIndex + 1).ToString();
            
            //prepend leading zeros to the string if necessary to improve
            //appearance. For example, if there are ten rows in the grid,
            //row seven will be numbered as "07" instead of "7". Similarly, if 
            //there are 100 rows in the grid, row seven will be numbered as "007".
            while (strRowNumber.Length < this.RowCount.ToString().Length) strRowNumber = "0" + strRowNumber;
            
            //determine the display size of the row number string using
            //the DataGridView's current font.
            SizeF size = e.Graphics.MeasureString(strRowNumber, this.Font);
            
            //adjust the width of the column that contains the row header cells 
            //if necessary
            if (this.RowHeadersWidth < (int)(size.Width + 20)) this.RowHeadersWidth = (int)(size.Width + 20);
            
            //this brush will be used to draw the row number string on the
            //row header cell using the system's current ControlText color
            Brush b = SystemBrushes.ControlText;

            //draw the row number string on the current row header cell using
            //the brush defined above and the DataGridView's default font
            e.Graphics.DrawString(strRowNumber, this.Font, b, e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + ((e.RowBounds.Height - size.Height) / 2));

            //call the base object's OnRowPostPaint method
            base.OnRowPostPaint(e);
        } //end OnRowPostPaint method
    } //end class
} //end namespace
			

Click here to return to the Free Programming Resources index

Click here to return to DanielSoper.com