在运行时对列进行排序时,DataGridView行标题编号消失

时间:2019-05-20 14:39:48

标签: vb.net winforms datagridview

我有一个DataGridView控件,为此我将DataGridViewRow.HeaderCell.Value设置为整数。这些行编号为1, 2, 3 ...(这可能无关紧要,无论将值设置为什么,我都会遇到相同的行为)。

在运行时,当我单击“列”标题以切换排序顺序时,行标题消失了。更准确地说,将清除分配给标题的数值。

我可以在For Each循环中轻松地将每个SortMode的{​​{1}}属性设置为DataGridViewColumn,但是我想保留排序功能。

有没有办法解决这个问题?

这是我的代码:

NotSortable

1 个答案:

答案 0 :(得分:2)

您可以使用RowPostPaint事件在标题中绘制行号。
每次需要重新绘制Row时,都会引发此事件,因此,数字将在每次必要时重新绘制并保持不变。

您可能要设置RowHeadersWidthSizeMode属性:

[DataGridView].RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing

这将防止用户调整Rows Header的大小,弄乱标题的 label (嗯,数字只是隐藏/部分可见。不过,这是一个选择)。

数字以右对齐和垂直居中的方式绘制,因此数字将在左侧扩展。您可以更改此行为,将StringFormatStringAlignment Far (右)更改为 Near (左):

 [StringFormat].Alignment = StringAlignment.Far   ' Align right
 [StringFormat].Alignment = StringAlignment.Near  ' Align left

数字的颜色设置为DataGridView的 dgv.RowTemplate.DefaultCellStyle.ForeColor
更改此默认样式以设置其他颜色。

字体设置为DataGridView的 DefaultCellStyle.Font 。同样的考虑。

数字本身的格式为 $"{(e.RowIndex + 1):00}" 。根据需要进行更改。

Private Sub DataGridView1_RowPostPaint(sender As Object, e As DataGridViewRowPostPaintEventArgs) Handles DataGridView1.RowPostPaint
    Dim dgv = DirectCast(sender, DataGridView)
    Dim rowHeader = $"{(e.RowIndex + 1):00}"

    Dim headerBounds As Rectangle =
        New Rectangle(e.RowBounds.Left, e.RowBounds.Top, dgv.RowHeadersWidth - 6, e.RowBounds.Height)

    Using format = New StringFormat(StringFormatFlags.NoWrap)
        format.Alignment = StringAlignment.Far
        format.LineAlignment = StringAlignment.Center
        Using brush As SolidBrush = New SolidBrush(dgv.RowTemplate.DefaultCellStyle.ForeColor)
            e.Graphics.DrawString(rowHeader, dgv.DefaultCellStyle.Font, brush, headerBounds, format)
        End Using
    End Using
End Sub