DATAGRIDVIEW NAVEGANDO ENTRE OS REGISTROS
Meus amigos, tenho outra [Ô]bucha[Ô]. Cada dia aparece uma coisa diferente.
Neste DataGridView, existes os botões de navegação do lado direito. Funcionam perfeitamente. Só que se eu utilizar o teclado, bagunça um pouco, por causa do Ãndice da linha. Então eu pensei que poderia fazer com que detectando a seta que o usuário usar do teclado, acione a rotina que está no evento click dos botões. Por exemplo, quando o usuário teclar seta para baixo no teclado, rode a rotina que existe no botão do proximo item.
As rotinas dos botões estão descritas abaixo, caso queiram analisar:
Private Sub BtnPrimeiroItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPrimeiroItem.Click
indice = 0
If DgvDocumentos.Rows.Count = 0 Then Exit Sub
DgvDocumentos.Rows(indice).Cells(0).Selected = True
End Sub
Private Sub BtnUltimoItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnUltimoItem.Click
indice = DgvDocumentos.Rows.Count - 1
If DgvDocumentos.Rows.Count = 0 Then Exit Sub
DgvDocumentos.Rows(indice).Cells(0).Selected = True
End Sub
Private Sub BtnItemAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnItemAnterior.Click
indice = indice - 1
If indice < 0 Then
indice = 0
Exit Sub
End If
If DgvDocumentos.Rows.Count = 0 Then Exit Sub
DgvDocumentos.Rows(indice).Cells(0).Selected = True
End Sub
Private Sub BtnProximoItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnProximoItem.Click
indice = indice + 1
If indice > DgvDocumentos.Rows.Count - 1 Then
indice = DgvDocumentos.Rows.Count - 1
Exit Sub
End If
If DgvDocumentos.Rows.Count = 0 Then Exit Sub
DgvDocumentos.Rows(indice).Cells(0).Selected = True
End Sub
Até mais.
Neste DataGridView, existes os botões de navegação do lado direito. Funcionam perfeitamente. Só que se eu utilizar o teclado, bagunça um pouco, por causa do Ãndice da linha. Então eu pensei que poderia fazer com que detectando a seta que o usuário usar do teclado, acione a rotina que está no evento click dos botões. Por exemplo, quando o usuário teclar seta para baixo no teclado, rode a rotina que existe no botão do proximo item.
As rotinas dos botões estão descritas abaixo, caso queiram analisar:
Private Sub BtnPrimeiroItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPrimeiroItem.Click
indice = 0
If DgvDocumentos.Rows.Count = 0 Then Exit Sub
DgvDocumentos.Rows(indice).Cells(0).Selected = True
End Sub
Private Sub BtnUltimoItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnUltimoItem.Click
indice = DgvDocumentos.Rows.Count - 1
If DgvDocumentos.Rows.Count = 0 Then Exit Sub
DgvDocumentos.Rows(indice).Cells(0).Selected = True
End Sub
Private Sub BtnItemAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnItemAnterior.Click
indice = indice - 1
If indice < 0 Then
indice = 0
Exit Sub
End If
If DgvDocumentos.Rows.Count = 0 Then Exit Sub
DgvDocumentos.Rows(indice).Cells(0).Selected = True
End Sub
Private Sub BtnProximoItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnProximoItem.Click
indice = indice + 1
If indice > DgvDocumentos.Rows.Count - 1 Then
indice = DgvDocumentos.Rows.Count - 1
Exit Sub
End If
If DgvDocumentos.Rows.Count = 0 Then Exit Sub
DgvDocumentos.Rows(indice).Cells(0).Selected = True
End Sub
Até mais.
Amigo use o evento da dataGridView,KeyDown...
Algo mais ou menos assim:
Crie uma procedure que receba os parametros (CASO VOCE FOR IMPLEMENTAR EM MAIS PARTES DO PROGRAMA,SE NAO FOR,DEIXE O CODIGO DA PROCEDURE DENTRO
DO EVENTO KEYDOWN MESMO!!!!:)
Algo mais ou menos assim:
Crie uma procedure que receba os parametros (CASO VOCE FOR IMPLEMENTAR EM MAIS PARTES DO PROGRAMA,SE NAO FOR,DEIXE O CODIGO DA PROCEDURE DENTRO
DO EVENTO KEYDOWN MESMO!!!!:)
Private Sub GRD_CLI_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles GRD_CLI.KeyDown
tecla(e.keycode)
End Sub
Sub tecla(ByVal vTecla As Integer)
Select Case vTecla
[ô] /\
Case 38
[ô]anterior
indice = indice - 1
If indice < 0 Then
indice = 0
Exit Sub
End If
If DgvDocumentos.Rows.Count = 0 Then Exit Sub
DgvDocumentos.Rows(indice).Cells(0).Selected = True
Case 40
[ô]\/
[ô]proximo
indice = indice + 1
If indice > DgvDocumentos.Rows.Count - 1 Then
indice = DgvDocumentos.Rows.Count - 1
Exit Sub
End If
If DgvDocumentos.Rows.Count = 0 Then Exit Sub
DgvDocumentos.Rows(indice).Cells(0).Selected = True
Case 39
[ô]->
[ô]ultimo
indice = DgvDocumentos.Rows.Count - 1
If DgvDocumentos.Rows.Count = 0 Then Exit Sub
DgvDocumentos.Rows(indice).Cells(0).Selected = True
Case 37
[ô]<-
[ô]primeiro
indice = 0
If DgvDocumentos.Rows.Count = 0 Then Exit Sub
DgvDocumentos.Rows(indice).Cells(0).Selected = True
End Select
End Sub
Olha, amigo, só pude ler agora sua resposta, mas enquanto não havia visto, fui tentando, tentando e consegui resolver de uma maneira mais simples.
Usei o evento KeyUp do DataGridView, como eu já tinha os códigos dos botões, apenas fiz com que qualquer [Ô]seta[Ô] que for clicada, chama a rotina referente ao seu botão de navegação.
Private Sub DgvDocumentos_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DgvDocumentos.KeyUp
If e.KeyCode = Keys.Down Then
BtnProximoItem_Click(sender, e)
End If
If e.KeyCode = Keys.Up Then
BtnItemAnterior_Click(sender, e)
End If
If e.KeyCode = Keys.PageDown Then
BtnUltimoItem_Click(sender, e)
End If
If e.KeyCode = Keys.PageUp Then
BtnPrimeiroItem_Click(sender, e)
End If
End Sub
Agora, eu só estou com um problema para resolver referenta ao mesmo assunto:
Se o usuário clicar nos botões de navegação, vai tudo bem, mas se ele estiver usando os botões de navegação, depois clicar numa linha do DataGridView e depois usar novamente um dos botões de navegação, ele perde o Ãndice, portanto a navegação fica incorreta. Eu pensei em colocar no GotFocus do DataGridView, por exemplo:
Private Sub DgvDocumentos_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles DgvDocumentos.GotFocus
If DgvDocumentos.CurrentRow.Selected = True Then
indice = DgvDocumentos.CurrentRow.Index
End If
End Sub
Mas não fica correto.
Será que há uma maneira? Vou tentando, enquanto espero uma resposta.
Obrigado e até mais.
Usei o evento KeyUp do DataGridView, como eu já tinha os códigos dos botões, apenas fiz com que qualquer [Ô]seta[Ô] que for clicada, chama a rotina referente ao seu botão de navegação.
Private Sub DgvDocumentos_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DgvDocumentos.KeyUp
If e.KeyCode = Keys.Down Then
BtnProximoItem_Click(sender, e)
End If
If e.KeyCode = Keys.Up Then
BtnItemAnterior_Click(sender, e)
End If
If e.KeyCode = Keys.PageDown Then
BtnUltimoItem_Click(sender, e)
End If
If e.KeyCode = Keys.PageUp Then
BtnPrimeiroItem_Click(sender, e)
End If
End Sub
Agora, eu só estou com um problema para resolver referenta ao mesmo assunto:
Se o usuário clicar nos botões de navegação, vai tudo bem, mas se ele estiver usando os botões de navegação, depois clicar numa linha do DataGridView e depois usar novamente um dos botões de navegação, ele perde o Ãndice, portanto a navegação fica incorreta. Eu pensei em colocar no GotFocus do DataGridView, por exemplo:
Private Sub DgvDocumentos_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles DgvDocumentos.GotFocus
If DgvDocumentos.CurrentRow.Selected = True Then
indice = DgvDocumentos.CurrentRow.Index
End If
End Sub
Mas não fica correto.
Será que há uma maneira? Vou tentando, enquanto espero uma resposta.
Obrigado e até mais.
RESOLVIDO!!!
Aqui está. Alterei o código e agora deu certo.
Usei o evento CellMouseEnter do DataGridView para detectar o Ãndice da linha, depois alterei os códigos do botão anterior e próximo.
Private Sub DdgDocumentos_CellMouseEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DgvDocumentos.CellMouseEnter
indice = DgvDocumentos.CurrentRow.Index
End Sub
Private Sub DgvDocumentos_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DgvDocumentos.KeyUp
If e.KeyCode = Keys.Down Then
indice = DgvDocumentos.CurrentRow.Index - 1
BtnProximoItem_Click(sender, e)
End If
If e.KeyCode = Keys.Up Then
indice = DgvDocumentos.CurrentRow.Index + 1
BtnItemAnterior_Click(sender, e)
End If
If e.KeyCode = Keys.PageDown Then
BtnUltimoItem_Click(sender, e)
End If
If e.KeyCode = Keys.PageUp Then
BtnPrimeiroItem_Click(sender, e)
End If
End Sub
Aqui está. Alterei o código e agora deu certo.
Usei o evento CellMouseEnter do DataGridView para detectar o Ãndice da linha, depois alterei os códigos do botão anterior e próximo.
Private Sub DdgDocumentos_CellMouseEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DgvDocumentos.CellMouseEnter
indice = DgvDocumentos.CurrentRow.Index
End Sub
Private Sub DgvDocumentos_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DgvDocumentos.KeyUp
If e.KeyCode = Keys.Down Then
indice = DgvDocumentos.CurrentRow.Index - 1
BtnProximoItem_Click(sender, e)
End If
If e.KeyCode = Keys.Up Then
indice = DgvDocumentos.CurrentRow.Index + 1
BtnItemAnterior_Click(sender, e)
End If
If e.KeyCode = Keys.PageDown Then
BtnUltimoItem_Click(sender, e)
End If
If e.KeyCode = Keys.PageUp Then
BtnPrimeiroItem_Click(sender, e)
End If
End Sub
Tópico encerrado , respostas não são mais permitidas