您的位置:

如何实现DataGridView列宽自适应?

一、使用AutoSizeColumnsMode属性自适应列宽

DataGridView控件提供了AutoSizeColumnsMode属性,用于设置列的自适应模式,包括:

  1. None:不自适应,列宽为默认宽度
  2. AllCells:根据单元格内容自适应列宽,包括列头单元格和数据单元格
  3. AllCellsExceptHeader:根据数据单元格内容自适应列宽,不包括列头单元格
  4. ColumnHeader:根据列头单元格内容自适应列宽
  5. Fill:均分控件可用宽度,填满整个控件

例如,如果我们将AutoSizeColumnsMode属性设置为AllCells,DataGridView控件会根据单元格内容自适应列宽。这样,在用户输入或者添加新的数据时,列宽会自动调整,保证所有数据都能够完整的显示在单元格中。代码示例:

dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

二、使用AutoResizeColumns方法手动调整列宽

AutoSizeColumnsMode属性仅适用于列的自适应模式。如果我们需要手动调整一列或多列的宽度,可以使用AutoResizeColumns方法。该方法接受一个DataGridViewAutoSizeColumnsMode枚举值作为参数,指定需要调整的列的自适应模式。代码示例:

// 自适应所有列
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
// 自适应指定列
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader, DataGridViewAutoSizeColumnMode.ColumnHeader);

在上述代码中,第一行代码会自适应所有列,第二行代码则会自适应除列头单元格外的所有数据单元格。

三、使用ColumnHeaderMouseDoubleClick事件手动调整列宽

如果我们需要进一步的手动调整列宽,可以使用ColumnHeaderMouseDoubleClick事件。该事件在用户双击列头单元格时触发,我们可以编写事件处理方法计算列宽并进行调整。代码示例:

private void dataGridView1_ColumnHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
{
    DataGridView gridView = sender as DataGridView;
    if (gridView != null && e.Button == MouseButtons.Left)
    {
        DataGridViewColumn clickedColumn = gridView.Columns[e.ColumnIndex];
        int paddingWidth = gridView.RowHeadersVisible ? gridView.RowHeadersWidth : 0;
        clickedColumn.Width = clickedColumn.GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells, true) + paddingWidth;
    }
}

上述代码中,我们首先获取DataGridView控件和用户双击的列。然后,我们计算出列的最佳宽度,并加上行头的宽度。实际上,GetPreferredWidth方法返回的是列的“期望”宽度,但由于这个方法考虑了单元格内容的特殊情况,所以可以保证列宽恰到好处。

四、使用DefaultCellStyle.WrapMode属性自动换行单元格内容

以上三种方法可以让DataGridView列宽自适应,但如果单元格内容过长,可能会导致单元格显示不完整。为了解决这个问题,我们可以使用DefaultCellStyle.WrapMode属性来自动换行单元格内容,并调整行高使所有内容都能够完整的显示。代码示例:

dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;

上述代码中,我们将DefaultCellStyle.WrapMode属性设置为True,表示自动换行单元格内容。然后设置AutoSizeRowsMode属性为AllCells,控件会自动根据单元格内容调整行高,保证所有内容完整的显示在单元格中。