1、实现代码

 private void AutoResize_dgv(DataGridView dgv )
        {
            int width=0;
            //对于DataGridView的每一个列都调整
            for (int i = 0; i < dgv.Columns.Count; i++)
            {
                //将每一列都调整为自动适应模式
                dgv.AutoResizeColumn(i, DataGridViewAutoSizeColumnMode.AllCells);
                //记录整个DataGridView的宽度
                width += dgv.Columns[i].Width;
            }
            //判断调整后的宽度与原来设定的宽度的关系,如果是调整后的宽度大于原来设定的宽度,
            //则将DataGridView的列自动调整模式设置为显示的列即可,
            //如果是小于原来设定的宽度,将模式改为填充。
            if (width > dgv.Size.Width)
            {
                dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
            }
            else
            {
                dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            }
            //冻结某列 从左开始 0,1,2
            dgv.Columns[1].Frozen = true;

            //标题居中
            dgv.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            //内容居中
            dgv.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

        }

2、DataGridViewAutoSizeColumnMode枚举

主要用到了DataGridViewAutoSizeColumnMode枚举,也可以通过设置DataGridView的属性来实现

// 摘要:
    //     定义用于指定如何调整列宽的值。
    public enum DataGridViewAutoSizeColumnMode
    {
        // 摘要:
        //     列的大小调整行为从 System.Windows.Forms.DataGridView.AutoSizeColumnsMode 属性继承。
        NotSet = 0,
        //
        // 摘要:
        //     列宽不会自动调整。
        None = 1,
        //
        // 摘要:
        //     调整列宽,以适合列标题单元格的内容。
        ColumnHeader = 2,
        //
        // 摘要:
        //     调整列宽,以适合该列中的所有单元格的内容,不包括标题单元格。
        AllCellsExceptHeader = 4,
        //
        // 摘要:
        //     调整列宽,以适合该列中的所有单元格的内容,包括标题单元格。
        AllCells = 6,
        //
        // 摘要:
        //     调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,不包括标题单元格。
        DisplayedCellsExceptHeader = 8,
        //
        // 摘要:
        //     调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,包括标题单元格。
        DisplayedCells = 10,
        //
        // 摘要:
        //     调整列宽,使所有列的宽度正好填充控件的显示区域,只需要水平滚动保证列宽在 System.Windows.Forms.DataGridViewColumn.MinimumWidth
        //     属性值以上。 相对列宽由相对 System.Windows.Forms.DataGridViewColumn.FillWeight 属性值决定。
        Fill = 16,
    }

3、数据绑定方法

建一个用于测试的Person类

public class Person
    {
        [Description("姓名")]
        public string Name { get; set; }
        [Description("性别")]
        public string Gender { get; set; }
        [Description("地址")]
        public string Address { get; set; }
    }

winform绑定数据源

List<Person> list = new List<Person>() 
{ 
   new Person(){Name="张三",Gender="男",Address="北京市 海淀区 大钟寺"},
   new Person(){Name="李斯",Gender="男",Address="上海市"},
   new Person(){Name="王二",Gender="女",Address="河南省 郑州市 二七广场附近"},
   new Person(){Name="王二",Gender="女",Address="河南省 郑州市 "},
   new Person(){Name="王二",Gender="女",Address="河南省"}
};
//绑定数据源的做法和原来相同
 dgv.DataSource = list;