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

问题描述 投票:0回答:2

我有一个

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
.net vb.net winforms datagridview
2个回答
2
投票

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

您可能需要设置 RowHeadersWidthSizeMode 属性:

[DataGridView].RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing

这将防止用户调整行标题的大小,弄乱标题的标签(好吧,数字将只是隐藏/部分可见。尽管如此,它是一个选项)。

数字右对齐且垂直居中绘制,因此数字会向左扩展。您可以更改此行为,将 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

0
投票

我用 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
© www.soinside.com 2019 - 2024. All rights reserved.