Resizing Data Grid Columns To Content

This article was contributed by Tom Archer.

Environment: .NET, C#

Click here for a larger image.

Demo application to test datagrid resizing method


One peculiar omission from the Windows Forms teams regarding the DataGrid object is a method that enables you to resize the grid's columns to visually accomodate the width of its widest data value. This method gives you that ability.


While searching for a solution to this problem, a friend emailed me some Visual Basic.NET code to accomplish the feat. While I could not get the code to compile (I'm assuming it was written during one of the .NET betas), I did re-write it in C# and got it to work. I'll update this article to give a proper acknowledgment once I track down the original author's name. However, I did want to make clear that some kind soul did get me 90% of the way there with their VB code and I finished the rest for my C# environment.

Using the Code


Calling this method is very straightforward. It takes only two parameters:

public void SizeColumnsToContent(DataGrid dataGrid,
                                 int nRowsToScan)
  • dataGrid—The DataGrid object to be resized
  • nRowsToScan—The number of rows to scan when searching for the widest value for a given column. Passing a value of -1 indicates that all rows should be scanned.


  • In my own code, I have defined a method as a member of my own System.Windows.Forms.DataGrid-derived class (DataGridEx). I removed it from that class for this article to keep things simple. To use the method in the same manner that I did, simply remove the dataGrid parameter from the parameter list and replace the references to dataGrid with reference to the this object.
  • The reason for the nRowsToScan parameter is for performance issues regarding very large amounts of data. If you happen to have a datagrid with a large number of rows, you can simply have the grid's columns sized according to the widest column of the first n rows instead of the method iterating through the entire data set for each column.

SizeColumnsToContent Method

public void SizeColumnsToContent(DataGrid dataGrid,
       int nRowsToScan)
  // Create graphics object for measuring widths.
  Graphics Graphics = dataGrid.CreateGraphics();

  // Define new table style.
  DataGridTableStyle tableStyle = new DataGridTableStyle();

    DataTable dataTable = (DataTable)dataGrid.DataSource;

    if (-1 == nRowsToScan)
      nRowsToScan = dataTable.Rows.Count;
      // Can only scan rows if they exist.
      nRowsToScan = System.Math.Min(nRowsToScan,

    // Clear any existing table styles.

    // Use mapping name that is defined in the data source.
    tableStyle.MappingName = dataTable.TableName;

    // Now create the column styles within the table style.
    DataGridTextBoxColumn columnStyle;
    int iWidth;

    for (int iCurrCol = 0;
         iCurrCol < dataTable.Columns.Count; iCurrCol++)
      DataColumn dataColumn = dataTable.Columns[iCurrCol];

      columnStyle = new DataGridTextBoxColumn();

      columnStyle.TextBox.Enabled = true;
      columnStyle.HeaderText = dataColumn.ColumnName;
      columnStyle.MappingName = dataColumn.ColumnName;

      // Set width to header text width.
      iWidth = (int)(Graphics.MeasureString

      // Change width, if data width is
      // wider than header text width.
      // Check the width of the data in the first X rows.
      DataRow dataRow;
      for (int iRow = 0; iRow < nRowsToScan; iRow++)
        dataRow = dataTable.Rows[iRow];

        if (null != dataRow[dataColumn.ColumnName])
          int iColWidth = (int)(Graphics.MeasureString
          iWidth = (int)System.Math.Max(iWidth, iColWidth);
      columnStyle.Width = iWidth + 4;

      // Add the new column style to the table style.
    // Add the new table style to the data grid.
  catch(Exception e)


Download demo project - 35 Kb
Download source - 2 Kb

About the Author

Tom Archer - MSFT

I am a Program Manager and Content Strategist for the Microsoft MSDN Online team managing the Windows Vista and Visual C++ developer centers. Before being employed at Microsoft, I was awarded MVP status for the Visual C++ product. A 20+ year veteran of programming with various languages - C++, C, Assembler, RPG III/400, PL/I, etc. - I've also written many technical books (Inside C#, Extending MFC Applications with the .NET Framework, Visual C++.NET Bible, etc.) and 100+ online articles.


  • Thanks

    Posted by sohaib on 07/04/2012 03:15am

    thanks for uploading this thing, i got my dataTable properly shown in Gridview by using the above function in my WIN CE 6.0 Device. .Net framework 3.5 Sohaib

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Moving from an on-premises environment to Office 365 does not remove the need to plan for disruptions or reduce the business risk requirements for protecting email services. If anything, some risks increase with a move to the cloud. Read how to ease the transition every business faces if considering or already migrating to cloud email. This white paper discusses: Setting expectations when migrating to Office 365 Understanding the implications of relying solely on Exchange Online security Necessary archiving …

  • Enterprises are increasingly looking to platform as a service (PaaS) to lower their costs and speed their time to market for new applications. Developing, deploying, and managing applications in the cloud eliminates the time and expense of managing a physical infrastructure to support them. PaaS offerings must deliver additional long-term benefits, such as a lower total cost of ownership (TCO), rapid scalability, and ease of integration, all while providing robust security and availability. This report …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date