C# winform DataGridView 调整列宽

DataGridView

有一个属性是AutoSizeColumnMode,他有几个枚举值:
1、AllCells 调整列宽,以适合该列中的所有单元格的内容,包括标题单元格。  
2、AllCellsExceptHeader 调整列宽,以适合该列中的所有单元格的内容,不包括标题单元格。  
3、ColumnHeader 调整列宽,以适合列标题单元格的内容。  
4、DisplayedCells 调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,包括标题单元格。  
5、DisplayedCellsExceptHeader 调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,不包括标题单元格。  
6、Fill 调整列宽,使所有列的宽度正好填充控件的显示区域,只需要水平滚动保证列宽在DataGridViewColumn.MinimumWidth 属性值以上。相对列宽由相对 DataGridViewColumn.FillWeight 属性值决定。  
7、None 列宽不会自动调整。  
8、NotSet 列的大小调整行为从 DataGridView.AutoSizeColumnsMode 属性继承。

注:如果想要自动设置列宽.在这里就必须把DataGridView的值设置为Fill

     this.dataGridView.DataSource = ds.Tables[0];
     this.dataGridView.Columns[0].FillWeight = 10;      //第一列的相对宽度为10%
     this.dataGridView.Columns[1].FillWeight = 20;      //第二列的相对宽度为20%
     this.dataGridView.Columns[2].FillWeight = 30;      //第三列的相对宽度为30%
     这里的值是相对于DataGridView当前的总宽度的,所以窗体最大化和缩小的效果是不一样的,但比例不变

注:如何给每列设置标头
   设置标题字段(先把ColumnsHeadersVisible设置为true)
     this.dataGridView.Columns[0].HeaderText = "编号";
     this.dataGridView.Columns[1].HeaderText = "日期";
     this.dataGridView.Columns[2].HeaderText = "标题";

C# WINFORM DATAGRIDVIEW 行、列的各种操作

1) 行、列的隐藏
[VB.NET]
' DataGridView1的第一列隐藏
DataGridView1.Columns(0).Visible = False
' DataGridView1的第一行隐藏
DataGridView1.Rows(0).Visible = False

[C#]
// DataGridView1的第一列隐藏
DataGridView1.Columns[0].Visible = false;
// DataGridView1的第一行隐藏
DataGridView1.Rows[0].Visible = false;

2) 行头、列头的隐藏
[VB.NET]
' 列头隐藏
DataGridView1.ColumnHeadersVisible = False
' 行头隐藏
DataGridView1.RowHeadersVisible = False

[C#]
// 列头隐藏
DataGridView1.ColumnHeadersVisible = false;
// 行头隐藏
DataGridView1.RowHeadersVisible = false;

3) 行和列的删除
[VB.NET]
' 删除名为"Column1"的列
DataGridView1.Columns.Remove("Column1")
' 删除第一列
DataGridView1.Columns.RemoveAt(0)
' 删除第一行
DataGridView1.Rows.RemoveAt(0)

[C#]
' 删除名为"Column1"的列
DataGridView1.Columns.Remove("Column1");
' 删除第一列
DataGridView1.Columns.RemoveAt(0);
' 删除第一行
DataGridView1.Rows.RemoveAt(0);

4) 删除选中行
[VB.NET]
For Each r As DataGridViewRow In DataGridView1.SelectedRows
    If Not r.IsNewRow Then
        DataGridView1.Rows.Remove(r)
    End If
Next

[C#]
foreach (DataGridViewRow r in DataGridView1.SelectedRows)
{
    if (!r.IsNewRow)
    {
        DataGridView1.Rows.Remove(r);
    }
}

________________________________________
⑦ DataGridView 禁止列或者行的Resize:
GO TO TOP
1) 禁止所有的列或者行的Resize
[VB.NET]
' 禁止用户改变DataGridView1的所有列的列宽
DataGridView1.AllowUserToResizeColumns = False

'禁止用户改变DataGridView1の所有行的行高
DataGridView1.AllowUserToResizeRows = False

[C#]
// 禁止用户改变DataGridView1的所有列的列宽
DataGridView1.AllowUserToResizeColumns = false;

//禁止用户改变DataGridView1の所有行的行高
DataGridView1.AllowUserToResizeRows = false;

但是可以通过 DataGridViewColumn.Width 或者 DataGridViewRow.Height 属性设定列宽和行高。

2) 禁止指定行或者列的Resize
[VB.NET]
'  禁止用户改变DataGridView1的第一列的列宽
DataGridView1.Columns(0).Resizable = DataGridViewTriState.False

'  禁止用户改变DataGridView1的第一列的行宽
DataGridView1.Rows(0).Resizable = DataGridViewTriState.False

[C#]
// 禁止用户改变DataGridView1的第一列的列宽
DataGridView1.Columns[0].Resizable = DataGridViewTriState.False;

// 禁止用户改变DataGridView1的第一列的行宽
DataGridView1.Rows[0].Resizable = DataGridViewTriState.False;

当 Resizable 属性设为 DataGridViewTriState.NotSet 时, 实际上会默认以 DataGridView 的 AllowUserToResizeColumns 和  AllowUserToResizeRows 的属性值进行设定。比如: DataGridView.AllowUserToResizeColumns = False 且 Resizable 是 NoSet 设定时,Resizable = False 。
判断 Resizable 是否是继承设定了 DataGridView 的 AllowUserToResizeColumns 和  AllowUserToResizeRows 的属性值, 可以根据 State 属性判断。如果 State 属性含有 ResizableSet,那么说明没有继承设定。
3) 列宽和行高的最小值的设定
[VB.NET]
' 第一列的最小列宽设定为 100
DataGridView1.Columns(0).MinimumWidth = 100

' 第一行的最小行高设定为 50
DataGridView1.Rows(0).MinimumHeight = 50

[C#]
// 第一列的最小列宽设定为 100
DataGridView1.Columns[0].MinimumWidth = 100;

// 第一行的最小行高设定为 50
DataGridView1.Rows[0].MinimumHeight = 50;

4) 禁止用户改变行头的宽度以及列头的高度
[VB.NET]
'  禁止用户改变列头的高度
DataGridView1.ColumnHeadersHeightSizeMode = _
    DataGridViewColumnHeadersHeightSizeMode.DisableResizing

' 禁止用户改变行头的宽度
DataGridView1.RowHeadersWidthSizeMode = _
    DataGridViewRowHeadersWidthSizeMode.EnableResizing

[C#]
// 禁止用户改变列头的高度
DataGridView1.ColumnHeadersHeightSizeMode =
    DataGridViewColumnHeadersHeightSizeMode.DisableResizing;

// 禁止用户改变行头的宽度
DataGridView1.RowHeadersWidthSizeMode =
    DataGridViewRowHeadersWidthSizeMode.EnableResizing;

________________________________________
⑧ DataGridView 列宽和行高自动调整的设定:
GO TO TOP

1) 设定行高和列宽自动调整
[VB.NET]
' 设定包括Header和所有单元格的列宽自动调整
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells

' 设定包括Header和所有单元格的行高自动调整
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells

[C#]
// 设定包括Header和所有单元格的列宽自动调整
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

// 设定包括Header和所有单元格的行高自动调整
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;

AutoSizeColumnsMode 属性的设定值枚举请参照 msdn 的 DataGridViewAutoSizeRowsMode 说明。

2)指定列或行自动调整
[VB.NET]
'  第一列自动调整
DataGridView1.Columns(0).AutoSizeMode = _
    DataGridViewAutoSizeColumnMode.DisplayedCells

[C#]
// 第一列自动调整
DataGridView1.Columns[0].AutoSizeMode =
    DataGridViewAutoSizeColumnMode.DisplayedCells;

AutoSizeMode 设定为 NotSet  时, 默认继承的是  DataGridView.AutoSizeColumnsMode 属性。

3) 设定列头的高度和行头的宽度自动调整
[VB.NET]
'  设定列头的宽度可以自由调整
DataGridView1.ColumnHeadersHeightSizeMode = _
    DataGridViewColumnHeadersHeightSizeMode.AutoSize

'  设定行头的宽度可以自由调整
DataGridView1.RowHeadersWidthSizeMode = _
    DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders

[C#]
// 设定列头的宽度可以自由调整
DataGridView1.ColumnHeadersHeightSizeMode =
    DataGridViewColumnHeadersHeightSizeMode.AutoSize;

// 设定行头的宽度可以自由调整
DataGridView1.RowHeadersWidthSizeMode =
    DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;

4) 随时自动调整
a, 临时的,让列宽自动调整,这和指定AutoSizeColumnsMode属性一样。
[VB.NET]
' 让 DataGridView1 的所有列宽自动调整一下。
DataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)

' 让 DataGridView1 的第一列的列宽自动调整一下。
DataGridView1.AutoResizeColumn(0, DataGridViewAutoSizeColumnMode.AllCells)

[C#]
// 让 DataGridView1 的所有列宽自动调整一下。
DataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

// 让 DataGridView1 的第一列的列宽自动调整一下。
DataGridView1.AutoResizeColumn(0, DataGridViewAutoSizeColumnMode.AllCells);
上面调用的 AutoResizeColumns 和 AutoResizeColumn 当指定的是DataGridViewAutoSizeColumnMode.AllCells 的时候, 参数可以省略。即:
DataGridView1.AutoResizeColumn(0) 和 DataGridView1.AutoResizeColumns()

b,临时的,让行高自动调整
[VB.NET]
' 让 DataGridView1 的所有行高自动调整一下。
DataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells)

' 让 DataGridView1 的第一行的行高自动调整一下。
DataGridView1.AutoResizeRow(0, DataGridViewAutoSizeRowMode.AllCells)

[C#]
// 让 DataGridView1 的所有行高自动调整一下。
DataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells);

//让 DataGridView1 的第一行的行高自动调整一下。
DataGridView1.AutoResizeRow(0, DataGridViewAutoSizeRowMode.AllCells);
上面调用的 AutoResizeRows 和 AutoResizeRow 当指定的是DataGridViewAutoSizeRowMode.AllCells 的时候, 参数可以省略。即:DataGridView1.AutoResizeRow (0) 和 DataGridView1.AutoResizeRows()

c,临时的,让行头和列头自动调整
关于性能:
通过 AutoSizeColumnsMode 或者 AutoSizeRowsMode 属性所指定的单元格进行自动调整时,如果调整次数过于多那么将可能导致性能下降,尤其是在行和列数比较多的情况下。在这时用 DisplayedCells 代替 AllCells 能减少非所见的单元格的调整,从而提高性能。
[VB.NET]
' 列头高度自动调整
DataGridView1.AutoResizeColumnHeadersHeight()

' 行头宽度自动调整
DataGridView1.AutoResizeRowHeadersWidth( _
    DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders)

[C#]
// 列头高度自动调整
DataGridView1.AutoResizeColumnHeadersHeight();

// 行头宽度自动调整
DataGridView1.AutoResizeRowHeadersWidth(
    DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);

c# winform 更改datagridview 某列的内容

private void indexDataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
            try
            {
                if (e.ColumnIndex == 8) //从0开始,第八列
                {

                    int val = Convert.ToInt32(e.Value);
                    string valStr = "";
                    switch (val)
                    {
                        case 1:
                            valStr = "汽车";
                            break;
                        case 2:
                            valStr = "公共汽车";
                            break;
                        case 3:
                            valStr = "出租车";
                            break;
                        default:
                            break;
                    }
                    e.Value = valStr;                    //替换格式化值
                    e.FormattingApplied = true;
                }
            }
            catch (System.Exception)
            {
                e.FormattingApplied = false;
            }
}

C# 如何为datagridview加上序号。

可以重写DataGridView的OnRowPostPaint方法或者直接在DataGridView的RowPostPaint事件里写,如下(重写DataGridView的OnRowPostPaint方法)

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

namespace Test
{
    class DataGridViewEx : DataGridView
    {
        SolidBrush solidBrush;
        public DataGridViewEx()
        {
            solidBrush = new SolidBrush(this.RowHeadersDefaultCellStyle.ForeColor);
        }
        protected override void OnRowPostPaint(DataGridViewRowPostPaintEventArgs e)
        {
            e.Graphics.DrawString((e.RowIndex + 1).ToString(), e.InheritedRowStyle.Font, solidBrush, e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + 5);
            base.OnRowPostPaint(e);
        }
    }
}

注意:以上方法觉得复杂,可以单独使用以下方法:
在dataGridView1的RowPostPaint事件中,如下代码:

private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,
                e.RowBounds.Location.Y,
                dataGridView1.RowHeadersWidth - 4,
                e.RowBounds.Height);

            TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(),
                dataGridView1.RowHeadersDefaultCellStyle.Font,
                rectangle,
                dataGridView1.RowHeadersDefaultCellStyle.ForeColor,
                TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
        }