DATAGRIDVIEW NAVEGANDO ENTRE OS REGISTROS

PERCIFILHO 20/10/2011 16:14:04
#387216
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.
PHOENIX209E 20/10/2011 16:47:04
#387229
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!!!!:)


   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



PERCIFILHO 21/10/2011 10:31:12
#387295
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.
PERCIFILHO 21/10/2011 12:22:51
#387313
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

Tópico encerrado , respostas não são mais permitidas