【问题标题】:DataGridView AutoSizeDataGridView 自动调整大小
【发布时间】:2011-06-21 11:28:24
【问题描述】:

有什么方法可以让 DataGridView 适合列/行的宽度和高度?我找到了需要手动计算的解决方案:http://www.codeguru.com/csharp/.net/net_data/datagrid/article.php/c9603DataGridView 真的不支持这个功能吗?

【问题讨论】:

标签: .net winforms


【解决方案1】:

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

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

【讨论】:

  • 我想要一个相反的东西:自动控制当前列的大小
  • 您不希望列根据其内容自动调整大小??
  • 没有。我想保持列原样。
  • 好吧,试试:dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
  • 不要让他告诉你它是否有效。自己正确测试
【解决方案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);
    };
}

【讨论】:

  • 似乎对我不起作用。但随后调试器说没有列,尽管显示的 DataSource 包含应该自动生成列和行的内容。
【解决方案3】:

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        真正的答案

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

         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 在哪里以及如何定义?
        • 它是一个 System.Windows.Forms.DataGridView 类,通过 IDE UI 工具箱放置到表单上并命名为 'dynRecDataGridView', docs.microsoft.com/en-us/dotnet/api/…
        【解决方案7】:

        您可以将 dataGridView 属性更改为

        dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        

        【讨论】:

          猜你喜欢
          • 2012-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-09
          • 2019-09-06
          • 2011-01-19
          • 1970-01-01
          相关资源
          最近更新 更多