C# 获取实际列宽

C# 获取实际列宽,c#,datagridview,C#,Datagridview,我正在以编程方式构建DataGridView表,并将其放置在表单的GroupBox中 我插入数据,然后自动调整列的大小以适应数据。然后,我想将groupbox调整为DataGridView的大小。对于每一列和每一行,我得到了它们各自的宽度和高度(从技术上来说应该是准确的),并更新了面板和DataGridView的总体大小 问题是Column.Width总是返回100像素,而不管其实际大小(请参见屏幕截图:实际列宽约为30px,而不是100像素)。如果我手动输入width=90像素,那么大小调整就

我正在以编程方式构建DataGridView表,并将其放置在表单的GroupBox中

我插入数据,然后自动调整列的大小以适应数据。然后,我想将groupbox调整为DataGridView的大小。对于每一列和每一行,我得到了它们各自的宽度和高度(从技术上来说应该是准确的),并更新了面板和DataGridView的总体大小

问题是Column.Width总是返回100像素,而不管其实际大小(请参见屏幕截图:实际列宽约为30px,而不是100像素)。如果我手动输入width=90像素,那么大小调整就相当准确了

matrix = new DataGridView();
//modify behaviour
matrix.ColumnHeadersVisible = false;
matrix.AllowUserToResizeColumns = false;
matrix.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
matrix.RowHeadersVisible = false;
matrix.AllowUserToResizeRows = false;
//modify positioning
matrix.Location = new Point(10, 20);
//matrix.Anchor = (AnchorStyles)(AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right);
matrix.Dock = DockStyle.Fill;
//set the size of the matrix
matrix.ColumnCount = col;
matrix.RowCount = row;


//Data now inserted...
matrix.AutoResizeColumns(); //correctly resizes the columns

int height = 0;
foreach (DataGridViewRow row in matrix.Rows)
{
    height += row.Height;
}
height += matrix.ColumnHeadersHeight;

int width = 0;
foreach (DataGridViewColumn col in matrix.Columns)
{
    width += col.Width;
    //PROBLEM: Width always  = 100 pixels.
}
width += matrix.RowHeadersWidth;
//width = 90; //override width manually
matrix.Size = new Size(width + 2, height + 2);
panel.Size = new Size(matrix.Width, matrix.Height);

面板如此之大是因为宽度不是90px而是357,这是错误的

编辑:部分修复 我找到了一种获得单元格正确宽度的方法:

DataGridView.Rows[0].Cells[0].ContentBounds.Width
//ContentBounds = a rectangle with the exact dimensions of that cell

我现在可以将DataGridView设置为正确的大小,但前提是它没有停靠以填充。设置matrix.Dock=DockStyle.Fill会阻止正确调整大小。

我想这是因为您正在自动调整行中列的大小:

matrix.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
尝试将其更改为:

matrix.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;

我已经找出了问题所在:

  • DataGridView.Dock=DockStyle.Fill阻止DataGridView.AutoResizeColumns()方法执行任何操作

  • Rectangle rect=矩阵。行[0]。单元格[0]。获取包含单元格值的矩形维度的ContentBounds在AutoResizeColumns()之后未更新

  • 我尝试手动设置列,但正如heq所建议的,AutoSizeColumnsMode必须设置为None才能修改宽度

  • 我手动调整了每列的宽度,单元格内每个字符的宽度为10px

  • 最终解决方案

    /* Create the DataGridView */
    matrix = new DataGridView();
    //modify behaviour
    matrix.ColumnHeadersVisible = false;
    // matrix.columnhea
    matrix.AllowUserToResizeColumns = false;
    matrix.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
    matrix.RowHeadersVisible = false;
    matrix.AllowUserToResizeRows = false;
    matrix.ReadOnly = true;
    //modify positioning
    matrix.Location = new Point(10, 20);
    //matrix.Dock = DockStyle.Fill;
    matrix.Anchor = (AnchorStyles)(AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right);
    //set the size of the matrix
    matrix.ColumnCount = cols;
    matrix.RowCount = rows;
    
    panel.Controls.Add(matrix);
    
    /* Set the data contents (not shown) */
    ...
    
    /* Adjust the width of columns */
    int width = 0;
    int height = 0;
    
    for(int c = 0; c < cols; c++) 
    {
      int largest = 0; //largest number of characters in cell
      for(int r = 0; r < rows; r++) 
      {
          int len = matrix.Rows[r].Cells[c].Value.ToString().Length;
          if (len > largest)
          {
              largest = len;
          }
      }
      matrix.Columns[c].Width = largest * 10;
      width += largest * 10;
    }
    
    /* Get height of table */
    foreach (DataGridViewRow row in matrix.Rows)
    {
        height += row.Height;
    }
    
    /* Set the DataGridView Size and Parent Panel size */
    //Note: first set the parent panel width, the table is anchored to all of its edges
    // as such table wont resize correctly if the panel isn't up to size first
    panel.Size = new Size(width + 20, height + 30);
    matrix.Size = new Size(width + 3, height + 3); //is it 1px per row and col?
    
    /* Parent Panel settings kept to default, no modifications */
    
    /*创建DataGridView*/
    矩阵=新的DataGridView();
    //改变行为
    matrix.ColumnHeadersVisible=假;
    //柱状矩阵
    matrix.AllowUserToResizeColumns=false;
    matrix.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.None;
    matrix.RowHeadersVisible=假;
    matrix.AllowUserToResizeRows=false;
    matrix.ReadOnly=true;
    //修改定位
    矩阵位置=新点(10,20);
    //matrix.Dock=DockStyle.Fill;
    矩阵.Anchor=(AnchorStyles)(AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right);
    //设置矩阵的大小
    matrix.ColumnCount=cols;
    matrix.RowCount=行;
    面板。控件。添加(矩阵);
    /*设置数据内容(未显示)*/
    ...
    /*调整列的宽度*/
    整数宽度=0;
    整数高度=0;
    for(int c=0;c最大值)
    {
    最大=len;
    }
    }
    矩阵.列[c].宽度=最大*10;
    宽度+=最大值*10;
    }
    /*得到桌子的高度*/
    foreach(matrix.Rows中的DataGridViewRow行)
    {
    高度+=行高;
    }
    /*设置DataGridView大小和父面板大小*/
    //注意:首先设置父面板宽度,表格将定位到其所有边缘
    //因此,如果面板未首先达到大小,则无法正确调整表的大小
    面板尺寸=新尺寸(宽度+20,高度+30);
    矩阵尺寸=新尺寸(宽度+3,高度+3)//是每行每列1件吗?
    /*父面板设置保留为默认值,不进行修改*/
    
    如果我将其更改为“无”,则调用matrix.AutoResizeColumns();单元格大小与单元格内容维度不匹配(单元格保持在100px)。尽管我没有为标题设置任何值,并且已经隐藏了它们,但是列标题是否会强制网格以100px的速度运行?编辑:我已经显示了标题,当调用AutoResizeColumns()时,这些标题会正确调整大小。调用AutoResizeColumns时,Width属性似乎没有更新……很遗憾,我现在没有Visual Studio来尝试您的代码,但下面有一篇文章可能会帮助您调整大小:。另外,据我记忆所及,可以调用类似于
    matrix.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsCeptheaders)
    的东西,这可能有用。感谢链接,我暂时解决了一个问题(即将编辑我的帖子),但现在似乎有其他因素阻止了正确的大小调整。添加的
    列事件如何: