无法分配datagridview.columns [i] .Width属性

时间:2012-03-29 13:26:04

标签: c# datagridview resize

我正在编写一个方法,它将调整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);
            }
        }

1 个答案:

答案 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);
            }
        }