99

我的DataGridView. 我想要做的是让前 2 列自动适应内容的宽度,并让第 3 列填充剩余空间。

是否可以在 WinForms 中进行?如果有任何用处,我将从 EF DataContext 加载我的数据。我已经包含了它当前外观的图像。

在此处输入图像描述

4

10 回答 10

184

您需要使用该DataGridViewColumn.AutoSizeMode属性。

您可以对第 0 列和第 1 列使用以下值之一:

AllCells: 调整列宽以适应列中所有单元格的内容,包括标题单元格。
AllCellsExceptHeader: 列宽调整以适应列中所有单元格的内容,不包括标题单元格。
DisplayedCells: 列宽调整以适合当前显示在屏幕上的行中的列中所有单元格的内容,包括标题单元格。
DisplayedCellsExceptHeader: 调整列宽以适应当前显示在屏幕上的行中的列中所有单元格的内容,不包括标题单元格。

然后使用第 2 列的填充

列宽调整,使所有列的宽度完全填满控件的显示区域...

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

正如其他用户所指出的,默认值可以设置在属性datagridview级别DataGridView.AutoSizeColumnsMode

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;

可能:

this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

重要的提示:

如果您的网格绑定到数据源并且列是自动生成的(AutoGenerateColumns属性设置为 True),您需要使用事件在创建列之后DataBindingComplete应用样式。


在某些情况下(例如通过代码更改单元格值),我必须调用DataGridView1.AutoResizeColumns();以刷新网格。

于 2013-09-06T21:27:30.897 回答
25

这是我最喜欢的方法...

_dataGrid.DataBindingComplete += (o, _) =>
    {
        var dataGridView = o as DataGridView;
        if (dataGridView != null)
        {
           dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
           dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
    };
于 2015-07-28T19:54:46.590 回答
16

只需从控制属性更改属性: AutoSizeColumnsMode:Fill

或按代码

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;

于 2015-06-25T11:59:03.793 回答
5

没有测试,但你可以试一试。测试和工作。我希望你可以玩AutoSizeModeDataGridViewColum来实现你所需要的。

尝试设置

dataGridView1.DataSource = yourdatasource;<--set datasource before you set AutoSizeMode

//Set the following properties after setting datasource
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

这应该工作

于 2013-09-06T21:15:41.290 回答
0

尝试做,

 AutoSizeColumnMode = Fill;
于 2014-12-31T06:10:15.190 回答
0
public static void Fill(DataGridView dgv2)
   {
        try
        {
            dgv = dgv2;
            foreach (DataGridViewColumn GridCol in dgv.Columns)
            {
                for (int j = 0; j < GridCol.DataGridView.ColumnCount; j++)
                {
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                    GridCol.DataGridView.Columns[j].FillWeight = 1;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
于 2015-02-17T01:48:14.877 回答
0

为了建立 AlfredBr 的答案,如果您隐藏了一些列,您可以使用以下内容自动调整所有列的大小,然后让最后一个可见列填充空白区域:

myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode = 
    DataGridViewAutoSizeColumnMode.Fill;
于 2019-10-03T17:31:34.900 回答
0

这就是我所做的,以便在所有列都无法做到这一点时让“first_name”列填充空间。

当网格变小时,“first_name”列几乎不可见(非常薄),因此我可以将该DataGridViewAutoSizeColumnMode属性设置AllCells为其他可见列。对于性能问题,重要的是在数据绑定之前将它们设置为并在网格的事件处理程序中None设置回。希望能帮助到你!AllCellsDataBindingComplete

private void dataGridView1_Resize(object sender, EventArgs e)
{
    int ColumnsWidth = 0;
    foreach(DataGridViewColumn col in dataGridView1.Columns)
    {
        if (col.Visible) ColumnsWidth += col.Width;
    }
    if (ColumnsWidth <dataGridView1.Width)
    {
        dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    }
    else if (dataGridView1.Columns["first_name"].Width < 10) 
    {
        dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    }
}
于 2020-01-06T13:36:32.603 回答
-1
public void setHeight(DataGridView src)
{
    src.Height= src.ColumnHeadersVisible ? src.ColumnHeadersHeight : 0 +   src.Rows.OfType<DataGridViewRow>().Where(row => row.Visible).Sum(row => row.Height);
}
于 2013-12-03T13:18:08.963 回答
-2

尝试这个 :

  DGV.AutoResizeColumns();
  DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
于 2017-01-19T14:32:22.253 回答