我有一个DataGridView
控件,为此我将DataGridViewRow.HeaderCell.Value
设置为整数。这些行编号为1, 2, 3
...(这可能无关紧要,无论将值设置为什么,我都会遇到相同的行为)。
在运行时,当我单击“列”标题以切换排序顺序时,行标题消失了。更准确地说,将清除分配给标题的数值。
我可以在For Each循环中轻松地将每个SortMode
的{{1}}属性设置为DataGridViewColumn
,但是我想保留排序功能。
有没有办法解决这个问题?
这是我的代码:
NotSortable
答案 0 :(得分:2)
您可以使用RowPostPaint事件在标题中绘制行号。
每次需要重新绘制Row时,都会引发此事件,因此,数字将在每次必要时重新绘制并保持不变。
您可能要设置RowHeadersWidthSizeMode属性:
[DataGridView].RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing
这将防止用户调整Rows Header的大小,弄乱标题的 label (嗯,数字只是隐藏/部分可见。不过,这是一个选择)。
数字以右对齐和垂直居中的方式绘制,因此数字将在左侧扩展。您可以更改此行为,将StringFormat的StringAlignment从 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