DataGridView自动调整和填充


82

我的专栏中有3列DataGridView。我想做的是让前2列自动适合内容的宽度,并让第3列填充剩余的空间。

是否可以在WinForms中进行?如果可以的话,我正在从EF DataContext加载数据。我提供了一张有关当前外观的图片。

在此处输入图片说明

Answers:


165

您需要使用该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();以刷新网格。


1
使用DataBindingComplete事件时,效果很好。
James Jeffery 2013年

在填入datagrid之后,我不知道如何调用DataBindingComplete方法
Dan Dan

@Dan DataBindingComplete不是方法,它是您需要订阅的datagridview事件。这个答案stackoverflow.com/a/31685874/2387010给出了一个示例。有帮助吗?
克里斯

如果对示例进行了说明,将很有帮助,但足够了。您在文章中链接MSDN文章将其显示为一种方法,这是我用作模式的方法,但无法弄清楚如何调用它。
2013年

1
@Chris,缺少的信息绝对有帮助,谢谢。我正在读这本书,读完有关委托和lambda函数的章节,因此希望不久后会更有意义。谢谢!
2013年

22

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

_dataGrid.DataBindingComplete += (o, _) =>
    {
        var dataGridView = o as DataGridView;
        if (dataGridView != null)
        {
           dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
           dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
    };

如果列大小= 0,index out of bound exception只需解决,谢谢!
TiyebM

14

只需将属性从控件的属性更改为: AutoSizeColumnsMode:Fill

或通过代码

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;


1
谢谢。我一直在寻找这样的解决方案!:)
Alin Ciocan '16

4

未经测试,但您可以尝试。经过测试和工作。我希望你能玩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;

这应该工作


这行不通。我在从DataContext添加数据源之前初始化表单时进行设置。那可能是为什么吗?我不确定在哪里设置它,因为数据是在运行时加载的,并且这些列是从EF模型中获取的。
James Jeffery 2013年

看起来像这样,但是,第三行不起作用,我在10分钟前进行了测试。
King King

@JamesJeffery您是自动填充列还是手动填充?
Sriram Sakthivel

@SriramSakthivel我正在使用dataGridView1.DataSource属性绑定从DataContext返回的列表。
James Jeffery 2013年


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);
        }
    }

1
该代码不是很好。首先,您不需要嵌套循环,该循环将所有列的宽度模式设置为相同的次数(<number of columns>)次。您可以直接从访问每列的AutoSizeMode和FillWeight属性GridCol。其次,将每列的AutoSizeMode设置为两个不同的值;第二个任务将覆盖第一个任务。
JonP '16

0

要基于AlfredBr的答案,如果您隐藏了某些列,则可以使用以下代码自动调整所有列的大小,然后仅使最后一个可见的列填充空白:

myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode = 
    DataGridViewAutoSizeColumnMode.Fill;

0

这是我为了使列“ first_name”填充所有列都不能填充的空间而做的事情。

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

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;
    }

-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);
}

只需调用该函数,它将根据行中的行数确定datagridview的高度
Durga Prasad Guntoju 2013年

1
首先,这不能回答OP的问题。另外(以供将来参考)在答案本身上包含此类注释(您可以对其进行编辑)。
2014年

-2

试试这个 :

  DGV.AutoResizeColumns();
  DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.