DataGridView AutoFit和Fill

时间:2013-09-06 21:04:35

标签: c# winforms datagridview

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

是否可以在WinForms中执行?我正在从EF DataContext加载我的数据,如果它有用的话。我已经包含了目前看起来如何的图像。

enter image description here

9 个答案:

答案 0 :(得分:139)

您需要使用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事件来应用样式 AFTER 列已创建。


在某些情况下(例如,按代码更改单元格值),我不得不调用DataGridView1.AutoResizeColumns();来刷新网格。

答案 1 :(得分:20)

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

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

答案 2 :(得分:8)

只需从控件属性中更改属性:  AppCompatActivity

或按代码

AutoSizeColumnsMode:Fill

答案 3 :(得分:4)

未经测试,但您可以尝试一下。经过测试和工作。我希望您可以使用AutoSizeMode DataGridViewColum来实现您的需求。

尝试设置

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;

这应该有效

答案 4 :(得分:0)

尝试做,

 AutoSizeColumnMode = Fill;

答案 5 :(得分: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);
        }
    }

答案 6 :(得分:0)

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

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

答案 7 :(得分:-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);
}

答案 8 :(得分:-2)

试试这个:

  DGV.AutoResizeColumns();
  DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;