How do you automatically resize columns in a DataGridView control AND allow the user to resize the columns on that same grid?

后端 未结 24 2957
孤城傲影
孤城傲影 2020-11-29 18:03

I am populating a DataGridView control on a Windows Form (C# 2.0 not WPF).

My goal is to display a grid that neatly fills all available width with cells - i.e. no un

相关标签:
24条回答
  • 2020-11-29 18:37

    Another version of Miroslav Zadravec's code, but slightly more automated and universal:

        public Form1()
        {
            InitializeComponent();
            dataGridView1.DataSource = source;
            for (int i = 0; i < dataGridView1.Columns.Count - 1; i++) {
                dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            }
            dataGridView1.Columns[dataGridView1.Columns.Count].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    
        }
    
        void Form1Shown(object sender, EventArgs e)
        {
            for ( int i = 0; i < dataGridView1.Columns.Count; i++ )
            {
                int colw = dataGridView1.Columns[i].Width;
                dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                dataGridView1.Columns[i].Width = colw;
            }
        }
    

    I put second part into separate event, because I fill datagridvew in initialization of form and if both parts are there, nothing is changing, because probably autosize calculates widths after datagridview is displayed, so the widths are still default in Form1() method. After finishing this method, autosize does its trick and immediately after that (when form is shown) we can set the widths by second part of the code (here in Form1Shown event). This is working for me like a charm.

    0 讨论(0)
  • 2020-11-29 18:41

    A little improvement from Schnapple's version

    int nLastColumn = dgv.Columns.Count - 1;
    for (int i = 0; i < dgv.Columns.Count; i++)
    {
        if (nLastColumn == i)
        {
            dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
        else
        {
            dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
        }
    }
    
    for (int i = 0; i < dgv.Columns.Count; i++)
    {
        int colw = dgv.Columns[i].Width;
        dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
        dgv.Columns[i].Width = colw;
    }
    
    0 讨论(0)
  • 2020-11-29 18:44

    This trick works for me:

    grd.DataSource = DT;
    
    //set autosize mode
    grd.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    grd.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    grd.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    
    //datagrid has calculated it's widths so we can store them
    for (int i = 0; i <= grd.Columns.Count - 1; i++) {
        //store autosized widths
        int colw = grd.Columns[i].Width;
        //remove autosizing
        grd.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
        //set width to calculated by autosize
        grd.Columns[i].Width = colw;
    }
    

    What happens here is that you set autosize to whathever mode you need and then column by column you store the width it got from autosize calculation, remove autosizing and set width to value you stored before.

    0 讨论(0)
  • 2020-11-29 18:44

    A C# version of Miroslav Zadravec's code

    for (int i = 0; i < dataGridView1.Columns.Count-1; i++)
    {
        dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    }
    dataGridView1.Columns[dataGridView1.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    
    for (int i = 0; i < dataGridView1.Columns.Count; i++)
    {
        int colw = dataGridView1.Columns[i].Width;
        dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
        dataGridView1.Columns[i].Width = colw;
    }
    

    Posted as Community Wiki so as to not mooch off of the reputation of others

    0 讨论(0)
  • 2020-11-29 18:44

    After adding the data to the grid add the following code which will adjust the column according to the length of data in each cell

    dataGrid1.AutoResizeColumns();            
    dataGrid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
    

    Here is the Result

    enter image description here

    0 讨论(0)
  • 2020-11-29 18:44

    Here's a simplified code for Miroslav Zadravec's answer in c#:

    CurrentDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader;
    for (int i = 0; i < dataGridView1.Columns.Count; i++) dataGridView1.Columns[i].Width = dataGridView1.Columns[i].Width;
    CurrentDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
    
    0 讨论(0)
提交回复
热议问题