Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Dicas de Programação #4

DataGridView – Sequência de Movimento (Após tecla ENTER)

 

A DataGridView tem como movimento após a tecla ENTER, de linha em linha, e não de coluna em coluna. Quando se está a preencher registos, em que se preenche um registo de cada vez, é prático que o utilizador após pressionar a tecla ENTER desloque a selecção para a coluna seguinte e não para o próximo registo (próxima linha).

 

Para conseguirmos alterar este comportamento podemos, no evento KeyDown, verificar qual a tecla pressionada e alterá-la. No entanto, e se a célula estiver a ser editada, é necessário fazer o override à ProcessCmdKey.

 

Fica um exemplo de como fazer:

 

 Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean

 

    ' Verifica se a tecla pressionada foi a ENTER e se a célula está a ser editada

    If keyData = Keys.Enter And Me.DataGridView1.IsCurrentCellInEditMode Then

 

      ' Executa um TAB

      SendKeys.Send("{TAB}")

      ' Ignora a tecla pressionada

      Return True

 

    Else

      ' Executa o processo normal

      Return MyBase.ProcessCmdKey(msg, keyData)

    End If

 

  End Function

 

 

  ' Quando é pressionada uma tecla

  Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown

 

    ' Verifica se a tecla é a ENTER

    If e.KeyCode = Keys.Enter Then

 

      ' Desabilita a tecla pressionada

      e.SuppressKeyPress = True

 

      With Me.DataGridView1

 

        ' Caso seja a ultima coluna salta para a primeira da próxima linha

        If .CurrentCell.ColumnIndex = .ColumnCount - 1 Then

 

          ' Caso não seja a última linha

          If .CurrentRow.Index < .RowCount - 1 Then

            .CurrentCell = .Item(0, .CurrentRow.Index + 1)

          End If

 

        Else

          ' Move para a próxima coluna

          .CurrentCell = .Item(.CurrentCell.ColumnIndex + 1, .CurrentRow.Index)

        End If

 

      End With

    End If

 

  End Sub

 

 

@@IDENTITY – Verificando Registo Inserido

 

Quando se inserem registos, é frequente necessitarmos do último número de identificação inserido (ID) para mostrarmos ao utilizador ou para utilizarmos na inserção de outros registos. Por exemplo se inserirmos um novo utilizador e de seguida usarmos o seu número de registo para inserir a sua lista de favoritos, temos de efectuar os seguintes passos:

 

1 – Inserir o registo do utilizador

2 – Verificar-mos qual o registo inserido (ID)

3 – Inserir os favoritos utilizando o ID recolhido

 

Para simplificar este processo podemos utilizar o comando T-SQL - @@IDENTITY - que retorna o valor gerado pelo SQL Statement. Ou seja, no momento que inserimos o registo, verificamos qual o número do registo inserido.

 

Fica aqui um exemplo de como simplificar este processo:

 

    ' Texto de ligação à base de dados

    Dim myConnectionString As String = _

        "Data Source=.\SQLEXPRESS;AttachDbFilename='c:\MYDATABASE.MDF';" & _

        ";Integrated Security=True;User Instance=True"

 

    ' Comando que irá inserir dados na tabela "MyTable" em que o campo "username" será

    ' passados através de parâmetros e retornará o ID do registo inserido

    Dim SQL As String = "INSERT INTO myTable([username]) VALUES (@username); Select @@IDENTITY;"

 

    ' Cria uma nova ligação à base de dados

    Dim connection As New SqlConnection(myConnectionString)

 

    ' Criação do comando indicando a instrução e a ligação

    Dim command As New SqlCommand(SQL, connection)

    command.Parameters.Add("@username", SqlDbType.VarChar).Value = "teste"

    connection.Open()

 

    ' Insere o registo e guarda na variável IdRegistoInserido o ID

    Dim IdRegistoInserido As Integer = command.ExecuteScalar()

    Debug.WriteLine("Registo Inserido: " + IdRegistoInserido.ToString)

 

    ' Fecha a ligação e limpa as variáveis

    connection.Close()

    connection = Nothing

    command = Nothing

 

 

Deste modo reduzimos um processo, de verificação do registo inserido, melhorando a performace da aplicação.

 

 

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

1 comentários:

Anónimo disse...

muito obrigado pela dica sobre como controlar a tecla enter numa datagrid.

PARABENS

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico