自动调整DataGridView大小

17

这可能有所帮助,但可能不是最好的解决方案:https://dev59.com/xX_aa4cB1Zd3GeqP7L60 - barlop
另一方面,我的回答可能会更有帮助,因为我知道它对我有效,可以自动调整DataGridView的宽度以包括所有列的大小。https://dev59.com/m2w15IYBdhLWcg3wv-RM#aMrnnYgBc1ULPQZFm_rh - barlop
7个回答

8

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

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

2
我想要的是相反的:将控件自动调整为当前列的大小 - SiberianGuy
2
不,我想保持列的原样。 - SiberianGuy
尝试在这里添加一个 VB.NET 片段,然后意识到它应该只是一个额外的答案。 - twip
@twip:这里没有太多需要翻译的内容。 - Victor Zakharov
2
不要问他它是否有效,请自己适当地测试它。 - barlop
显示剩余3条评论

6
这是一个比较老的问题,我认为它被误解了。Idsa想要实现的是使实际的AutoSize winforms特性与DataGridView一起使用。该属性存在,但没有效果。
这意味着DataGridView必须适应其内容周围的尺寸,而不是其内容必须适应DataGridView中。
要实现AutoSize功能,有许多事情需要考虑:
- 边框大小 - 填充 - 单元格分隔符大小 - 行标题高度 - 列标题宽度 - DataGridView如何填充(数据绑定或手动) - ...等等
最好选择一组符合您特定场景的标准,并编写一些代码来计算DataGridView的大小。
以下是我的特定场景示例:
- 我的网格是数据绑定的。因此,每次完成DataBinding操作时都会更改其大小。这是触发DataGridView大小重新计算的条件。所以我将其钩子连接到事件。 - 我的网格不应显示滚动条。因此,我将属性设置为None。 - 我的行和列自动调整模式设置为AllCells。 - 行和列标题不可见。如果它们可见,则它们的大小必须包含在计算中。
下面的扩展方法适合我的需求。它非常简单,因为我的网格非常简单。您可能需要微调它才能使其按照您的意愿工作,并且要让它适用于每个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);
    };
}

对我来说似乎不起作用。但是调试器显示没有列,尽管它显示了一个数据源,该数据源应自动生成列和行的内容。 - Zarepheth
非常好用。我使用了RowHeightChanged和ColumnWidthChanged事件,但在这些事件中使用了BeginInvoke(Sub() AdjustDGVSize())来等待大小实际改变。其中AdjustDGVSize()是设置dgv客户端大小的子程序。我还将不可见列的宽度设置为6像素。 - ourmandave

3

2

这个 VB.NET 的翻译对我很有用:

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

2

这个帖子已经很老了,但是如果有人现在仍然需要它,他可以使用grid.AutoResizeColumns(),在我这里运行良好。

Original Answer翻译成"最初的回答"


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

        }

在第5行代码中,你在哪里以及如何定义 dynRecDataGridView - PeterCo
这是一个 System.Windows.Forms.DataGridView 类,通过 IDE UI 工具箱放置在表单上,并命名为 'dynRecDataGridView',https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.datagridview?view=netframework-4.8 - Motomotes

-1

你可以直接更改dataGridView的属性为

dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接