【问题标题】:Inconsistent DataGridViewColumn width when AutoSizeMode set to FillAutoSizeMode 设置为 Fill 时 DataGridViewColumn 宽度不一致
【发布时间】:2015-12-06 04:01:45
【问题描述】:

我创建了一个简单的 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 多次调整大小后的截图:

【问题讨论】:

  • 应该会出现细微的差异。 DataGridViewColumn.Width 的类型为 int。当列宽从整个网格宽度中划分出来时,它们可能不会均匀划分。与其丢失浮点余数的总和,不如以某种方式调整列以补偿这种损失,因此:41 40 41 41 42 41 42 40。也就是说 - 我无法重现您发布的显着差异,例如:34 25 33 34 33 34 34 35。因此,评论而不是答案。也许OP中没有提到其他行为?

标签: c# datagridview


【解决方案1】:

使用 courier 等固定字体。

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

"888"  

" 88" 

"  8"

【讨论】:

  • 与DataGridView的内容无关。列 AutoSizeMode 设置为 Fill,这意味着它将根据填充权重和 DataGridView 的宽度调整列宽。如果所有列的填充权重相等,则考虑到除法后的余数,我应该得到所有列的几乎相等的宽度,差异不超过 1。
【解决方案2】:

不要设置.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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多