2

読み取り専用で、いくつかの行が入力された DataGridView を備えた C# の .NET Winforms アプリがあります。たとえば、Windows Explorer (および他の多くのアプリケーション) の詳細ビューに似た機能が必要です。

入力を開始すると、フォーカスがあるときに DataGridView が動作するようにしたいと思います。現在の行選択は、セル 0 (行の最初の列) の (文字列) 値が文字で始まる行にジャンプします。あなたが入力しました。

たとえば、1 列と次の行を持つ DataGridView があるとします。

  • ボブ
  • ジェーン
  • ジェイソン
  • ジョン
  • リロイ
  • サム

DataGridView にフォーカスがあり、キーボードの 'b' キーを押すと、選択された行は "Bob" になります。キー「ja」をすばやく入力すると、選択された行はジェーンです。文字「jas」をすばやく入力すると、選択された行はジェーンです。「z」キーを押すと、何も選択されません (Z で始まるものがないため)。

同様に、Jane が現在選択されていて、文字 'j' を入力し続けると、'j' キーを押すたびに、Jason、John、Jane の順に選択が繰り返されます。

私はしばらくグーグル(および「スタックオーバーフロー」:-))を行ってきましたが、このタイプの機能の例を見つけることができません。私は、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 に答える