我正在编写一种方法,该方法将调整datagridview中各列的大小,以便所有数据都可见,并且这些列完全填满了datagridview。我正在做的是:
1)将DataGridViewAutoSizeColumnsMode设置为AllCells。这将显示单元中的所有数据。
2)计算最后一列的右边缘与数据网格视图的右边缘之间的像素距离。
3)用该距离除以列数。这给了我应该添加到每一列的宽度,以完全填充datagridview的宽度。
4)将(3)的宽度添加到每一列。
从理论上讲,这将在列中显示所有数据,并完全填充datagridview。
将DataGridViewAutoSizeColumnsMode
设置为fill
时,列宽均相等。但是,并非我所有的数据都具有相等的宽度。因此,在将ColumnsMode
设置为fill的情况下,某些单元格中的数据流失了边缘,而其他单元格中出现了一堆空白。但是设置为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);
}
}
最佳答案
好吧,我回答了我自己的问题。 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);
}
}
关于c# - 无法分配datagridview.columns [i] .Width属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9926309/