DataGridView AutoSize

时间:2011-06-21 11:28:25

标签: .net winforms

有没有办法让DataGridView适合colums / rows的宽度和高度?我找到了需要手动计算的解决方案:http://www.codeguru.com/csharp/.net/net_data/datagrid/article.php/c9603 DataGridView是否真的不支持此功能?

7 个答案:

答案 0 :(得分:5)

如果您想根据数据自动调整所有列的大小:

for (int i = 0; i < dataGridView.Columns.Count; i++)
{
    dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}

答案 1 :(得分:2)

答案 2 :(得分:2)

这是一个很老的问题,被误解为恕我直言。 Idsa想要实现的是使实际的AutoSize winforms功能与DataGridView一起使用。该属性存在但无效。

这意味着DataGridView必须适合 其内容,而不是其内容必须适合内部 DataGridView。

要实现AutoSize实现,需要考虑很多事情。 DataGridView的大小取决于很多标准:

  • 边框尺寸
  • 填充
  • 细胞分隔符大小
  • 行标题高度
  • 列标题宽度
  • 如何填充DataGridView(DataBound或手动)
  • ...更多

最好是选择一组适合您特定场景的标准,然后编写一些可以为您计算DataGridView大小的内容。

这里以我的特定场景为例:

  • 我的网格是数据绑定的。因此,每次DataBinding操作完成时,它的大小都应该更改。这是触发重新计算DataGridView大小的条件。所以我把它挂钩到DataBindingComplete事件。

  • 我的网格不应该显示滚动条。所以我将Scrollbars属性设置为None。

  • 我的行和列自动调整大小模式设置为AllCells。

  • 行和列标题不可见。如果是,则他们的尺寸必须包含在计算中。

以下扩展方法符合我的需求。这非常简单,因为我的网格非常简单。您可能需要稍微调整一下以使其按预期工作,并使用 lot 使其适用于每个DataGridView场景。

public static void HandleAutoSize(this DataGridView dgv)
{
    dgv.DataBindingComplete += (s, e) =>
    {
        var dg = (DataGridView)s;
        var width = dg.Columns.GetColumnsWidth(DataGridViewElementStates.None);
        var height = dg.Rows.GetRowsHeight(DataGridViewElementStates.None);

        dg.ClientSize = new Size(width, height);
    };
}

答案 3 :(得分:1)

线程很旧,但是如果有人现在仍然需要它,他可以使用 grid.AutoResizeColumns() 和我一起很好

答案 4 :(得分:0)

VB.NET翻译对我有用:

For i As Integer = 0 To dataGridView.ColumnCount - 1
    dataGridView.Columns(i).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
Next

答案 5 :(得分:0)

真实答案

我编写了这段代码,用像素颜色计算网格的确切大小,并将其与背景进行比较。这对我很有效。如果在包含的表单上使用自动调整大小,则会导致一些闪烁,您必须禁用自动调整大小或修改代码以手动设置包含表单上的大小。但是,如果没有在父控件上自动调整大小,它就能完美运行。

 private void gridViewAutoSize(DataGridView dgv)
        {

            Bitmap dgvBmp = new Bitmap(dgv.Width,dgv.Height);
            dynRecDataGridView.DrawToBitmap(dgvBmp, new Rectangle(0, 0, dgv.Width, dgv.Height));

            int x = dgv.Width-1;
            int y = dgv.Height-1;
            int halfHeaderW = dgv.RowHeadersWidth / 2;
            int halfHeaderH = dgv.ColumnHeadersHeight / 2;
            int borderX = 0;
            int borderY = 0;
            const int widthLimit = 800;
            const int heightLimit = 350;

            while (x == dgv.Width - 1)
            {
                borderX = 0;
                while (x >= 0 && dgvBmp.GetPixel(x, halfHeaderH).ToArgb() != dgv.BackgroundColor.ToArgb())
                {
                    borderX++;
                    x--;
                }
                if (x < 0)
                {
                    if(dgv.Width-1 <= widthLimit)
                    {
                        dgv.Width += 100;
                        dgvBmp = new Bitmap(dgv.Width, dgv.Height);
                        dynRecDataGridView.DrawToBitmap(dgvBmp, new Rectangle(0, 0, dgv.Width, dgv.Height));

                        x = dgv.Width - 1;
                    }
                    else
                    {
                        x = widthLimit;
                        borderX = 0;
                    }
                }
            }
            if (x > widthLimit)
            {
                x = widthLimit;
                borderX = 0;
            }
            else if(x < widthLimit)
            {
                while (dgvBmp.GetPixel(x, halfHeaderH).ToArgb() == dgv.BackgroundColor.ToArgb())
                {
                    x--;
                }
            }
            while (y == dgv.Height - 1)
            {
                borderY = 0;
                while (y >= 0  && dgvBmp.GetPixel(halfHeaderW, y).ToArgb() != dgv.BackgroundColor.ToArgb())
                {
                    borderY++;
                    y--;
                }
                if (y < 0)
                {
                    if (dgv.Height-1 <= heightLimit)
                    {
                        dgv.Height += 100;
                        dgvBmp = new Bitmap(dgv.Width, dgv.Height);
                        dynRecDataGridView.DrawToBitmap(dgvBmp, new Rectangle(0, 0, dgv.Width, dgv.Height));

                        y = dgv.Height - 1;
                    }
                    else
                    {
                        y = heightLimit;
                        borderY = 0;
                    }
                }
            }
            if (y > heightLimit)
            {
                y = heightLimit;
                borderY = 0;
            }
            else if (y < heightLimit)
            {
                while (dgvBmp.GetPixel(halfHeaderW, y).ToArgb() == dgv.BackgroundColor.ToArgb())
                {
                    y--;
                }
            }

            dgv.Size = new Size(x+borderX+1, y+borderY+1);

        }

答案 6 :(得分:-1)

您只需将dataGridView属性更改为

即可
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;