C# 获取实际列宽
我正在以编程方式构建DataGridView表,并将其放置在表单的GroupBox中 我插入数据,然后自动调整列的大小以适应数据。然后,我想将groupbox调整为DataGridView的大小。对于每一列和每一行,我得到了它们各自的宽度和高度(从技术上来说应该是准确的),并更新了面板和DataGridView的总体大小 问题是Column.Width总是返回100像素,而不管其实际大小(请参见屏幕截图:实际列宽约为30px,而不是100像素)。如果我手动输入width=90像素,那么大小调整就相当准确了C# 获取实际列宽,c#,datagridview,C#,Datagridview,我正在以编程方式构建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;
我已经找出了问题所在:
/* 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)
的东西,这可能有用。感谢链接,我暂时解决了一个问题(即将编辑我的帖子),但现在似乎有其他因素阻止了正确的大小调整。添加的列事件如何: