我正在编写一个方法,该方法将调整数据网格视图中的列的大小,以便所有数据都可见,并且列完全填充数据网格视图。我正在做的是:
1) 将DataGridViewAutoSizeColumnsMode设置为AllCells。这将显示单元格中的所有数据。
2) 计算最后一列的右边缘与数据网格视图的右边缘之间的像素距离。
3) 将该距离除以列数。这给了我应该添加到每列的宽度,以完全填充数据网格视图。
4) 将(3)中的宽度添加到每列中。
从理论上讲,这将显示列中的所有数据,并完全填充数据网格视图。
在将DataGridViewAutoSizeColumnsMode
设置为fill
的情况下,列宽都相等。然而,并不是我的所有数据都具有相同的宽度。因此,在ColumnsMode
设置为填充的情况下,我在一些单元格中有数据从边缘流出,在其他单元格中有一堆空白。但是设置为AllCells
,我最终在数据网格视图的最右边的列和右边缘之间有一个很大的间隙。
关于问题:我似乎无法设置列宽属性。我确实意识到,我没有考虑总列宽大于datagridviewwidth的情况。
private void autoSizeDGV(DataGridView dgv)
{
try
{
//Step 1
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
//Step 2
int totalcellwidth = 0;
for (int i = 0; i < dgv.ColumnCount; i++)
{
totalcellwidth += dgv.Columns[i].Width;
}
//Step 3
int widthtoadd = (dgv.Width - totalcellwidth)/dgv.ColumnCount;
//Step 4
for (int i = 0; i < dgv.ColumnCount; i++)
{
Debug.WriteLine("previous dgv.Columns[" +i+ "]: " + dgv.Columns[i].Width);
dgv.Columns[i].Width += widthtoadd;
Debug.WriteLine("after dgv.Columns[" + i + "]: " + dgv.Columns[i].Width);
}
}
好吧,我回答了我自己的问题。dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
语句将覆盖对列宽的任何非用户更改。因此,尝试用程序改变宽度是不可能的。但通过使用dgv.AutoResizeColumns();
,一切都可以正常工作。
因此,正确的方法是:
private void autoSizeDGV(DataGridView dgv)
{
try
{
//Step 1
dgv.AutoResizeColumns();
//Step 2
int totalcellwidth = 0;
for (int i = 0; i < dgv.ColumnCount; i++)
{
totalcellwidth += dgv.Columns[i].Width;
}
//Step 3
int widthtoadd = (dgv.Width - totalcellwidth) / dgv.ColumnCount;
//Step 4
for (int i = 0; i < dgv.ColumnCount; i++)
{
Debug.WriteLine("previous dgv.Columns[" + i + "]: " + dgv.Columns[i].Width);
dgv.Columns[i].Width += widthtoadd;
Debug.WriteLine("after dgv.Columns[" + i + "]: " + dgv.Columns[i].Width);
}
}