我有一个
DataGridView
控件,我已将其设置为 DataGridViewRow.HeaderCell.Value
等于整数。这些行编号为1, 2, 3
...(这可能无关紧要,无论我将值设置为什么,我都会遇到相同的行为)。
在运行时,当我单击列标题来切换排序顺序时,行标题消失。更准确地说,分配给标头的数值被清除。
我可以在 For Each 循环中轻松地将每个
SortMode
的 DataGridViewColumn
属性设置为 NotSortable
,但我想保留排序功能。
有办法解决这个问题吗?
这是我的代码:
Imports System.IO
Imports System.Data.SqlClient
Public Class Form1
Dim CMD As New SqlCommand()
Dim ADP As New SqlDataAdapter()
Dim TBL As New DataTable
Dim serverStr As String = "Server"
Dim databaseStr As String = "Database"
Dim dbLoginStr As String = "Login"
Dim dbPassStr As String = "Password"
Dim qry As String
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim connectionString As String =
"Server=" & serverStr & ";" &
"Database=" & databaseStr & ";" &
"User Id=" & dbLoginStr & ";" &
"Password=" & dbPassStr & ";" &
"Timeout=1"
qry = "SELECT * FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_NAME ASC"
Try
Using SQL As New SqlConnection
SQL.ConnectionString = connectionString
CMD.Connection = SQL
CMD.CommandText = qry
ADP.SelectCommand = CMD
SQL.Open()
ADP.SelectCommand = CMD
TBL.Clear()
TBL.Columns.Clear()
ADP.Fill(TBL)
SQL.Close()
End Using
Catch ex As Exception
MsgBox("Could not connect to " & databaseStr & " on server: " & serverStr & vbNewLine & vbNewLine & ex.Message)
Exit Sub
End Try
DataGridView1.DataSource = TBL
DataGridView1.AutoResizeColumns()
SetRowNumber(DataGridView1)
DataGridView1.Columns(DataGridView1.Columns.Count - 1).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
End Sub
Private Sub SetRowNumber(myDGV As DataGridView)
For Each row As DataGridViewRow In myDGV.Rows
row.HeaderCell.Value = (row.Index + 1).ToString()
Next
myDGV.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders)
'Remove Sorting ability
'For Each col As DataGridViewColumn In myDGV.Columns
' col.SortMode = DataGridViewColumnSortMode.NotSortable
'Next
End Sub
'See if value got cleared upon sorting
'Private Sub DataGridView1_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
' Dim myDGV = DirectCast(sender, DataGridView)
' For Each row As DataGridViewRow In myDGV.Rows
' MsgBox(row.HeaderCell.Value)
' Next
'End Sub
End Class
您可以使用 RowPostPaint 事件在标题中绘制行号。
每次需要重新绘制行时都会引发此事件,因此每次需要时都会重新绘制数字并将持续存在。
您可能需要设置 RowHeadersWidthSizeMode 属性:
[DataGridView].RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing
这将防止用户调整行标题的大小,弄乱标题的标签(好吧,数字将只是隐藏/部分可见。尽管如此,它是一个选项)。
数字右对齐且垂直居中绘制,因此数字会向左扩展。您可以更改此行为,将 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
我用 vb.net 2010 中的 datagridviewheader 点击事件解决了这个问题 其中 count 是 datagridview1 中的行数
Private Sub FillCounter()
If DataGridView1.Rows.Count > 0 Then
For i = 0 To count - 1
DataGridView1.Rows(i).HeaderCell.Value = (i + 1).ToString
Next
End If
End Sub
Private Sub DataGridView1_ColumnHeaderMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
Call FillCounter()
End Sub