Click here to Skip to main content
15,879,535 members
Articles / Programming Languages / C#
Article

Resizing Data Grid Columns To Content

Rate me:
Please Sign up or sign in to vote.
3.87/5 (26 votes)
17 Mar 20032 min read 200.7K   4K   67   38
Method that resizes all the columns of a specified Data Grid object

Sample Image - SizeColumnsToContent.jpg

Introduction

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.

Acknowledgements

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

Syntax

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

C#
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.

Notes

  • In my own code, I have defined this method as a member of my own System.Windows.Forms.DataGrid-derived class (DataGridEx). I removed it from that class for this article, in order 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

C#
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();

    try
    {
        DataTable dataTable = (DataTable)dataGrid.DataSource;
  
        if (-1 == nRowsToScan)
        {
            nRowsToScan = dataTable.Rows.Count;
        }
        else
        {
            // Can only scan rows if they exist.
            nRowsToScan = System.Math.Min(nRowsToScan, 
                dataTable.Rows.Count);
        }
          
        // Clear any existing table styles.
        dataGrid.TableStyles.Clear();
  
        // 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(columnStyle.HeaderText, 
                dataGrid.Font).Width);

            // 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(dataRow.
                        ItemArray[iCurrCol].ToString(), 
                        dataGrid.Font).Width);
                    iWidth = (int)System.Math.Max(iWidth, iColWidth);
                }
            }
            columnStyle.Width = iWidth + 4;
    
            // Add the new column style to the table style.
            tableStyle.GridColumnStyles.Add(columnStyle);
        }    
        // Add the new table style to the data grid.
        dataGrid.TableStyles.Add(tableStyle);
    }
    catch(Exception e)
    {
        MessageBox.Show(e.Message);
    }
    finally
    {
        Graphics.Dispose();
    }
}

History

  • March 18, 2003 - First posting

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


Written By
Software Developer (Senior) Microsoft
United States United States
I manage the strategy for the Azure Management Experience documentation at Microsoft. Those technologies include Open-Source DevOps (Terraform, Ansible, Jenkins), Azure PowerShell, and Azure CLI.

Comments and Discussions

 
GeneralWell.. Pin
Muammar©25-Sep-07 0:57
Muammar©25-Sep-07 0:57 
GeneralThanx Pin
niljag21009-Jun-06 0:39
niljag21009-Jun-06 0:39 
GeneralPocket Pc trouble Pin
Lacran1-Jun-06 5:28
Lacran1-Jun-06 5:28 
GeneralStyles Pin
recursion_man25-Apr-06 9:19
recursion_man25-Apr-06 9:19 
GeneralA few modifications Pin
sixgun15-Feb-06 5:28
sixgun15-Feb-06 5:28 
GeneralRe: A few modifications Pin
emreo16-Feb-06 4:15
emreo16-Feb-06 4:15 
GeneralRe: A few modifications Pin
sixgun16-Feb-06 4:36
sixgun16-Feb-06 4:36 
GeneralWorks like a charm! Pin
ajrulez10-Dec-05 12:36
ajrulez10-Dec-05 12:36 
GeneralBit Fields Pin
Member 28465112-Oct-05 2:52
Member 28465112-Oct-05 2:52 
General5693Multiline DataGrid Header Text Pin
Member 197910511-Apr-05 1:56
Member 197910511-Apr-05 1:56 
GeneralRe: 5693Multiline DataGrid Header Text Pin
wws3580123-Jun-05 8:40
wws3580123-Jun-05 8:40 
Generalwant to use it for WebApplication Pin
weinklein25-Jan-05 1:33
weinklein25-Jan-05 1:33 
GeneralRe: want to use it for WebApplication Pin
Tom Archer25-Jan-05 1:49
Tom Archer25-Jan-05 1:49 
GeneralPlease help, overwriting my config Pin
OnlineNoob12-Jan-04 13:26
OnlineNoob12-Jan-04 13:26 
GeneralRe: Please help, overwriting my config Pin
DruZeree10-Mar-04 10:42
DruZeree10-Mar-04 10:42 
GeneralRe: Please help, overwriting my config Pin
coder4rent3-May-04 11:00
coder4rent3-May-04 11:00 
GeneralExtension proposal Pin
ThaNerd30-Nov-03 5:23
ThaNerd30-Nov-03 5:23 
Generalgood source Pin
SEUNG-PIL YOO19-Nov-03 18:40
SEUNG-PIL YOO19-Nov-03 18:40 
GeneralRe: good source Pin
developer199623-Dec-03 6:20
developer199623-Dec-03 6:20 
This is great. It gives us a foundation for manipulating the dreaded Data Grid control. Thanks again for showing the way, just like your book right on time.;P
Generalplease help cast error Pin
Sashka2-Sep-03 6:47
Sashka2-Sep-03 6:47 
GeneralRe: please help cast error Pin
KhSergey6-Sep-03 13:19
KhSergey6-Sep-03 13:19 
GeneralRe: please help cast error Pin
Sashka7-Sep-03 5:36
Sashka7-Sep-03 5:36 
GeneralRe: please help cast error Pin
DMerrick1-Oct-03 13:57
DMerrick1-Oct-03 13:57 
GeneralRe: please help cast error Pin
Boogie7-Nov-03 12:26
Boogie7-Nov-03 12:26 
GeneralRe: please help cast error Pin
Tom Archer7-Sep-03 12:48
Tom Archer7-Sep-03 12:48 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.