我用一个文本框和一个DGV构建了一个自动提示搜索。一切都很好,除此之外,我确实想要两个按钮,可以向上或向下移动一排。你必须知道,当我搜索时,我将那些不包含搜索字符串的行设置为.visible = false
。
理论上它应该是这样工作的:
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
。当我手动点击一行或用键盘选中它时,所有内容都会正确打印。
我做错了什么?
这应该有效:
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
附言:我没有检查获得下一个可见单元格的代码,但它似乎可以,行选择工作正常