Как перейти к определенной строке в DataGridView, набрав (в виде подробного представления Windows Explorer) - PullRequest
2 голосов
/ 07 февраля 2010

У меня есть приложение .NET Winforms в C # с DataGridView, которое доступно только для чтения и заполнено некоторым количеством строк. Мне бы хотелось, чтобы функциональность была похожа на подробное представление Windows Explorer (и многих других приложений), например.

Я бы хотел, чтобы DataGridView вел себя так, чтобы, когда у него был фокус, если вы начали печатать, текущий выбор строки будет переходить к строке, в которой начинается значение (строка) ячейки 0 (т. Е. Первый столбец в строке) с набранными вами символами.

Например, если у меня есть DataGridView с 1 ​​столбцом и следующими строками:

  • Bob
  • Jane
  • Jason
  • John
  • Leroy
  • Sam

Если DataGridView имеет фокус, и я нажимаю клавишу «b» на моей клавиатуре, выбранная строка теперь «Боб». Если я быстро наберу клавиши 'ja', выбранная строка - Джейн. Если я быстро введу буквы «jas», выбранная строка - «Джейн». Если я нажму клавишу «z», ничего не будет выбрано (так как ничто не начинается с Z).

Аналогично, если в настоящий момент выбрана Джейн, и я продолжаю печатать букву 'j', выбор будет циклически повторяться до Джейсона, затем до Джона, а затем обратно до Джейн, каждый раз, когда я нажимаю клавишу j.

Я какое-то время занимался поиском (и "переполнением стека" :-)) и не могу найти никаких примеров функциональности этого типа. У меня в голове есть грубая идея сделать это через какой-то недолговечный поток таймера, собирая нажатия клавиш на событиях KeyPress для DataGridView и выбирая строки на основе этих собранных нажатий клавиш, соответствующих Cells [0] .Value.StartsWith () тип состояния. Но похоже, что должен быть более простой способ, которого я просто не вижу.

Любые идеи будут высоко оценены. Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 ноября 2012

Я написал метод, который будет выбирать набранную букву строки, возможно, вы можете изменить в соответствии со своими потребностями Функция вызывается в обработчике событий KeysPress DataGridView.

Метод:

 '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
0 голосов
/ 17 марта 2010

Я не видел никакой подобной встроенной функциональности в DataGridView. Я почти уверен, что вам придётся «кататься самостоятельно».

Ищете более простые способы "частичного поиска" строк?

...