我正在编写一个方法,它将调整datagridview中的列的大小,以便所有数据都可见,并且列完全填充datagridview。我正在做的是:
1)将DataGridViewAutoSizeColumnsMode设置为AllCells。这将显示单元格中的所有数据。
2)计算最后一列右边缘与数据网格视图右边缘之间的像素距离。
3)将该距离除以列数。这给了我应该添加到每列的宽度以完全填充datagridview。
4)将(3)的宽度添加到每列。
理论上,这将显示列中的所有数据,并完全填充datagridview。
将DataGridViewAutoSizeColumnsMode
设置为fill
时,列宽相等。但是,并非所有数据都具有相同的宽度。因此,在ColumnsMode
设置为填充的情况下,我会在某些单元格中的边缘运行数据,在其他单元格中运行一堆空白区域。但是设置为AllCells
,我最后一列与datagridview的右边缘之间存在很大差距。
关于问题:我似乎无法设置列宽属性。我确实意识到我没有考虑总列宽大于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);
}
}
答案 0 :(得分:1)
好吧,我回答了自己的问题。 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);
}
}