AutoSizeMode设置为Fill时,DataGridViewColumn宽度不一致

时间:2015-12-02 04:44:58

标签: c# datagridview

我创建了一个简单的Windows窗体应用程序来复制此问题。我创建了一个DataGridView1并将其停靠在Form1上。

DataGridView有8列,每列都有:

this.Column1.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
this.Column1.FillWeight = 100F;

每当我调整表单大小时,所有列都应调整为相等的宽度。但情况并非如此,有时,有些列比其他列小。

我在Form1 ResizeEnds时打印出列宽,并在调整大小10次后得到以下结果:

private void Form1_ResizeEnd(object sender, EventArgs e)
{
    foreach (DataGridViewColumn c in dataGridView1.Columns)
    {
        Console.Write(c.Width + " ");
    }
    Console.WriteLine();
}

输出:

67 67 67 67 66 67 67 67 
41 40 41 41 42 41 42 40 
144 145 144 146 145 145 145 143 
65 57 64 65 64 66 66 65 
27 26 26 26 26 27 27 23 
167 166 166 166 166 167 167 163 
49 50 49 50 47 49 51 51 
98 98 97 99 95 97 100 99 
34 25 33 34 33 34 34 35 
186 177 185 186 185 186 186 187 

让这种不一致非常令人沮丧,我希望有办法解决这个问题。谢谢。

多次调整大小后DataGridView的外观截图:

2 个答案:

答案 0 :(得分:0)

使用固定字体,如快递。

用空格填充数字,使它们具有相同的长度:

"888"  

" 88" 

"  8"

答案 1 :(得分:0)

不要设置.AutoSizeMode并使用此代码(抱歉,这是VB.NET,但我认为您在C#中翻译时没有问题):

Private Sub YourForm_ResizeEnd(sender As Object, e As System.EventArgs) Handles Me.ResizeEnd

    Dim intRowHeadersWidthDefault As Integer = 41 'this is a default value; you can save it on form load

    Dim intVerticalScrollbarWidth As Integer = 0

    If Me.DataGridView1.Controls.OfType(Of VScrollBar)()(0).Visible Then
        intVerticalScrollbarWidth = SystemInformation.VerticalScrollBarWidth
    End If

    Dim intBorderWidth As Integer = 0

    If Me.DataGridView1.BorderStyle <> BorderStyle.None Then
        intBorderWidth = 2
    End If

    Dim intSpaceToFill As Integer = Me.DataGridView1.Width - intRowHeadersWidthDefault - intVerticalScrollbarWidth - intBorderWidth

    Dim intColumnWidth As Integer = intSpaceToFill / 8

    For i As Integer = 0 To Me.DataGridView1.ColumnCount - 1
        Me.DataGridView1.Columns(i).Width = intColumnWidth
    Next i

    Me.DataGridView1.RowHeadersWidth = intRowHeadersWidthDefault + intSpaceToFill - (intColumnWidth * 8)

End Sub

基本上,此代码将列宽强制为整数,并设置行标题宽度以覆盖空间分割的最终余数。