Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ZecaLoteiro

DataGridView.KeyDown Não captura (EditingMode)

Recommended Posts

Boa tarde senhores,

 

Estou quebrando a cabeça com uma coisa aparentemente simples.

 

Tenho um grid onde o usuário vai preenchendo e dando enter, quando ele pressiona enter, o foco vai para a célula abaixo para que ele possa preencher o valor da linha de baixo...

 

PORÉM, quando chega na última linha, o foco deve passar para a primeira linha da próxima coluna...

 

Para isso, utilizei os seguintes códigos:

 

  Public Sub cellEnter(ByVal sender As Object, ByVal e As KeyEventArgs) Handles gridTemp.KeyDown
    If e.KeyCode = Keys.Enter Then
      Dim ponto As New Point(gridTemp.CurrentCellAddress().X, gridTemp.CurrentCellAddress().Y)
      If ponto.Y = gridTemp.Rows.Count - 1 Then
        gridTemp.CurrentCell = gridTemp(ponto.X + 1, 0)
        e.SuppressKeyPress = True
      End If
    End If
  End Sub

  Private Sub gridTemp_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles gridTemp.EditingControlShowing
    If TypeOf e.Control Is TextBox Then
      RemoveHandler DirectCast(e.Control, TextBox).KeyDown, AddressOf cellEnter
      AddHandler DirectCast(e.Control, TextBox).KeyDown, AddressOf cellEnter
    End If
  End Sub
End Class

 

Acontece que o código funciona perfeitamente, apenas quando a tecla pressionada não é ENTER...

Para qualquer outra funciona.....

 

O EditMode do meu grid estar definido como: "EditOnEnter" não sei se isso tem a ver....

 

Alguém já passou por isso?

Desde já obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Adicionar um NOT? not de não ? "!" ? huuh, não entendi onde poderia colocar...

 

Detalhe, quando a tecla apertada é o ENTER, ele nem dispara o evento KeyDown... :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos fazer dois testes:

 

Primeiro coloque um not no if: [inline]If Not e.KeyCode = Keys.Enter[/inline] e veja se funciona, coloque breakpoints para ver se ele está passando pelas funções e eventos corretos. Se funcionar então tudo bem, mas se não funcionar coloque um breakpoint e me fale o que aconteceu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, se a tecla apertada é ENTER ele nem dispara o evento, nem entra na Sub cellEnter ... :(

 

Adicionei o not e apertei uma tecla diferente de ENTER...

funcionou, e fez a função do Enter.... por conta do "Not"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando aperto o ENTER ele nem entra na rotina... o evento não é disparado, o ENTER não é capturado... não para no break point :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso que estou falando... não importa o que está no IF... ele nem entra, nem passa alí.... :(

Ele não chega no IF, não entra na sub cellEnter

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando entro na última célula ele passa pelo "gridTemp_EditingControlShowing" e executa todas as linhas sem problemas, ou seja, adiciona o handler....

 

Aí, se eu aperto ENTER, deveria executar a Sub cellEnter, mas não executa....

Porém, qualquer outra tecla que eu digito, ele entra na cellEnter.... qualquer tecla funciona, menos o enter.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Provavelmente ele não está reconhecendo a tecla, você tentou usar o KeyChar? Use um breakpoint no If e vá no overview para saber qual é o valor que ela está recebendo

Compartilhar este post


Link para o post
Compartilhar em outros sites

amigo.... obrigado pela força... ;)

Acho que não to conseguindo me expressar....

 

Quando eu aperto ENTER, ELE NÃO CHEGA NO IF....PQ ELE NÃO ENTRA NA SUB....



Entende? entrar na sub de KeyDown deveria entrar, independente se é Enter, Ç, ALT, ESPAÇO.... Alí sim o IF trataria...

Mas quando é O ENTER não aciona o evento.. não entra na SUB.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E evento keydown é universal, ele deveria entrar independente se for enter ou não, o que eu estou tentando dizer é que seu If não está funcionando ou então o evento não está funcionando, talvez seja porque você colocou um Handles no gridview e não na caixa de texto, tente deixar de lado a expressão [inline]Handles gridTemp.KeyDown[/inline] e aplicar o evento diretamente no controle de edição.

Compartilhar este post


Link para o post
Compartilhar em outros sites

uhuhuh, é exatamente o que eu faço em:

 

 


 

AddHandler DirectCast(e.Control, TextBox).KeyDown, AddressOf cellEnter

 

A function é usada tanto para o grid, quanto para o textbox.



E evento keydown é universal, ele deveria entrar independente se for enter ou não, o que eu estou tentando dizer é que seu If não está funcionando ou então o evento não está funcionando, talvez seja porque você colocou um Handles no gridview e não na caixa de texto, tente deixar de lado a expressão [inline]Handles gridTemp.KeyDown[/inline] e aplicar o evento diretamente no controle de edição.

Quanto ao meu if estar funcionando, ele funciona, quando é acionado... quando não chega nele não tem como funcionar....

 

Sobre o evento não estar funcionando, é exatamente isso... mas só deixa de funcionar quando a tecla é o ENTER, qualquer outra funciona!



Acredito que por padrão, em um datagridview, a tecla Enter já possui um hadler default... e isso que tá lascando tudo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tirei o handles, e continuou como antes, o evento só é acionado quando a tecla apertada é diferente de ENTER.

 

Fiz o up do projeto... Se puder dar uma olhada mais tarde a título de curiosidade.... deve ter alguma explicação uhuh...

 

http://dl.dropboxusercontent.com/u/9779996/TesteDataGridView.rar

 

Valeu pela força.

Compartilhar este post


Link para o post
Compartilhar em outros sites

uhuhuh, quando chega na última linha de cada coluna, deve ir para a primeira célula da proxima coluna. ;)

(Claro que depois de digitar o valor, e apertar ENTER)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.