我创建了一个简单的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的外观截图:
答案 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
基本上,此代码将列宽强制为整数,并设置行标题宽度以覆盖空间分割的最终余数。