2

我有一个 C# 中的 .NET Winforms 应用程序,其 DataGridView 是只读的并填充了一些行。例如,我希望具有类似于 Windows 资源管理器(和许多其他应用程序)详细信息视图的功能。

我希望 DataGridView 的行为使得当您开始键入时它具有焦点时,当前行选择将跳转到单元格 0 的(字符串)值(即行中的第一列)以字符开头的行你输入了。

例如,如果我有一个包含 1 列和以下行的 DataGridView:

  • 鲍勃
  • 杰森
  • 约翰
  • 乐华
  • 山姆

如果 DataGridView 具有焦点并且我按下键盘上的“b”键,则所选行现在是“Bob”。如果我快速键入键“ja”,则选定的行是 Jane。如果我快速输入字母“jas”,则选定的行是 Jane。如果我按“z”键,则不会选择任何内容(因为没有以 Z 开头)。

同样,如果 Jane 当前被选中并且我继续键入字母“j”,则每次我按“j”键时,选择将循环到 Jason,然后是 John,然后返回到 Jane。

我一直在做一些谷歌搜索(和“stackoverflowing”:-)),但找不到任何此类功能的示例。我有一个粗略的想法,通过某种短暂的计时器线程来执行此操作,收集 DataGridView 的 KeyPress 事件的击键,并根据收集的与 Cells[0].Value.StartsWith() 匹配的击键选择行条件类型。但似乎必须有一种更简单的方法,而我只是没有看到。

任何想法将不胜感激。谢谢!

4

2 回答 2

0

我还没有在 DataGridView 上看到任何这样的内置功能。我很确定你必须“自己动手”。

您是否正在寻找更简单的方法来对字符串进行“部分搜索”?

于 2010-03-17T20:20:10.300 回答
0

我写了一个方法来选择输入的行字母,也许你可以根据你的需要进行修改。该函数在 DataGridView 的 KeysPress 事件处理程序中调用。

方法:

 'user types letter in dgv, method will select the column starting with that letter if it exists or else next letter existing in dgv
Public Shared Sub GoToLetterTypedInDataGridView(ByVal dgv As DataGridView, ByVal columnName As String, ByVal columnPosition As Integer, ByVal letterTyped As Char)
    Try
        Dim dt As DataTable = dgv.DataSource
        Dim letter As Char = letterTyped
        Dim dv As DataView = New DataView(dt)
        Dim hasCount As Boolean = False

        While (Not hasCount)
            dv.Sort = columnName
            dv.RowFilter = columnName & " like '" & letter & "%'"
            If dv.Count > 0 Then
                hasCount = True
                Dim x As String = dv(0)(columnPosition).ToString()
                Dim bs As New BindingSource
                bs.DataSource = dt
                dgv.BindingContext(bs).Position = bs.Find(columnName, x)
                dgv.CurrentCell = dgv(0, bs.Position)
            Else
                If letter = "z" Then
                    letter = "a"
                ElseIf letter = "Z" Then
                    letter = "A"
                Else : letter = Chr(Asc(letter) + 1)
                End If
            End If
        End While
    Catch ex As Exception
        Dim stackframe As New Diagnostics.StackFrame(1)
        Throw New Exception("An error occurred in routine, '" & stackframe.GetMethod.ReflectedType.Name & "." & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'." & Environment.NewLine & "  Message was: '" & ex.Message & "'")
    End Try
End Sub

然后调用:

Private Sub dgvNew_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles dgvNew.KeyPress
    Try
        If dgvNew.RowCount > 0 Then
            GoToLetterTypedInDataGridView(dgvNew, "columnName", 0, e.KeyChar)
        End If
    Catch ex As Exception
        Dim stackframe As New Diagnostics.StackFrame(1)
        Throw New Exception("An error occurred in routine, '" & stackframe.GetMethod.ReflectedType.Name & "." & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'." & Environment.NewLine & "  Message was: '" & ex.Message & "'")
    End Try
End Sub
于 2012-11-09T20:50:23.410 回答