2013-08-01 2 views
0

Я построю автоматический наводящий поиск с текстовым полем и DGV. Все работает отлично, кроме того, я хочу иметь 2 кнопки, которые предлагают функциональность, чтобы идти 1 ряд вверх или вниз. Вы должны знать, что пока я ищу, я устанавливаю те строки, которые не содержат строку поиска, до .visible = false.DataGridView select Row Error

В теории она должна работать так:

Private Sub tsbDown_Click(sender As Object, e As EventArgs) Handles tsbDown.Click 
    With dgvMA 
     If dgvMA.RowCount > 0 Then 
      Dim MyDesiredIndex As Integer = GetNextVisibleCell(dgvMA.CurrentRow.Index) 

      dgvMA.ClearSelection() 
      dgvMA.CurrentCell = dgvMA.Rows(MyDesiredIndex).Cells(1) 
      dgvMA.Rows(MyDesiredIndex).Selected = True 
     End If 
    End With 
End Sub 

Private Function GetNextVisibleCell(currentrow As Integer) As Integer 
    With dgvMA 
     For i = currentrow To .Rows.Count - 1 
      If .Rows(i).Visible = True Then 
       MsgBox(i & ": " & .Rows(i).Visible) 
       Return i 
       Exit For 
      End If 
     Next 

     Return currentrow 
    End With 
End Function 

, но НИКОГДА не моя строка получает выбран. multi-select: false и fullrowselect - true. когда я нажимаю на строку вручную или выбирается с клавиатуры, все печатается правильно.

Что я делаю неправильно?

ответ

0

Это должно работать:

Private Sub tsbDown_Click(sender As Object, e As EventArgs) Handles tsbDown.Click 
    With dgvMA 
     If dgvMA.RowCount > 0 And dgvMA.CurrentRow.Index + 1 < dgvMA.Rows.Count Then 
      Dim MyDesiredIndex As Integer = GetNextVisibleCell(dgvMA.CurrentRow.Index + 1) 

      dgvMA.ClearSelection() 
      dgvMA.CurrentCell = dgvMA.Rows(MyDesiredIndex).Cells(1) 
      dgvMA.Rows(MyDesiredIndex).Selected = True 
     End If 
    End With 
End Sub 

Private Sub tsbUp_Click(sender As System.Object, e As System.EventArgs) Handles tsbUp.Click 
    With dgvMA 
     If dgvMA.RowCount > 0 And dgvMA.CurrentRow.Index <> 0 Then 
      Dim MyDesiredIndex As Integer = GetNextVisibleCell(dgvMA.CurrentRow.Index - 1) 

      dgvMA.ClearSelection() 
      dgvMA.CurrentCell = dgvMA.Rows(MyDesiredIndex).Cells(1) 
      dgvMA.Rows(MyDesiredIndex).Selected = True 
     End If 
    End With 
End Sub 

Private Function GetNextVisibleCell(currentrow As Integer) As Integer 
    Dim i As Integer 
    With dgvMA 
     For i = currentrow To .Rows.Count - 1 
      If .Rows(i).Visible = True Then 
       ' MsgBox(i & ": " & .Rows(i).Visible) 
       Return i 
       Exit For 
      End If 
     Next 

     Return currentrow 
    End With 
End Function 

P.S. Я не проверял код, который получает следующую видимую ячейку, но кажется, что хорошо, и выбор строк отлично работает