Jump to content
ucase

DataGridView

Recommended Posts

ucase

Olá.

Como posso seccionar a primeira linha,em um datagridview , começada com uma determinada  letra, pressionando a tecla da letra pretendida ?

Por exemplo quer seleccionar as entradas começadas pela letra H, pressione a tecla H e a primeira entrada encontrada começada por H é seleccionada.

Share this post


Link to post
Share on other sites
Caça

        For Each C As DataGridViewRow In dgv.Rows
            If C.Cells(0).Value.ToString.ToLower.StartsWith(e.KeyChar.ToString.ToLower) Then C.Selected = True : Exit For
        Next

Está aqui para um DataGridView só de leitura

EDIT: Coloca o código no evento KeyPress


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
ucase

Obrigado pela ajuda.

Realmente a linha é seleccionada, mas como fazer para deslocar a listagem para que fique visível essa linha, pois a base de dados tem mais de 1500 entradas

Burro velho a querer aprender latim ... (eu sei!!! nunca é tarde para aprender)

Share this post


Link to post
Share on other sites
Caça

Esqueci-me desse pormenor, aqui tens

        For Each C As DataGridViewRow In DGV.Rows
            If C.Cells(0).Value.ToString.ToLower.StartsWith(e.KeyChar.ToString.ToLower) Then
                C.Selected = True
                DGV.FirstDisplayedScrollingRowIndex = C.Index
                Exit For
            End If
        Next


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
ucase

Mais uma vez o meu Obrigado.

Já agora, se não for pedir demais, como fazer a linha ficar com o cursor, pois o dito fica sempre na linha que estava antes seleccionada e quando se prime uma tecla volta para ela, e o que pretendo é ir para, digamos, o sexto registo começado pela letra movendo o cursor com as tecla "seta para cima" ou "seta para baixo"

Share this post


Link to post
Share on other sites
Caça

Desculpa lá, mas só agora é que vi o tópico

Descobri uma maneira, não muito correcta no meu ponto de vista mas está funcional

Na parte publica

    Dim LastSelected As Integer
    Dim Total As Integer

No evento KeyPress do DataGridView

        If Dgv.AllowUserToAddRows = True Then Total = Dgv.Rows.Count - 2 Else Total = Dgv.Rows.Count - 1
        If LastSelected < Total Then
            If Dgv.Rows(LastSelected).Cells(0).Value.ToString.ToLower.StartsWith(e.KeyChar.ToString.ToLower) Then
                If Dgv.Rows(LastSelected + 1).Cells(0).Value.ToString.ToLower.StartsWith(e.KeyChar.ToString.ToLower) Then
                    Dgv.Rows(LastSelected + 1).Selected = True
                    Dgv.FirstDisplayedScrollingRowIndex = LastSelected + 1
                    LastSelected += 1
                    Exit Sub
                End If
            End If
        End If
        For Each C As DataGridViewRow In Dgv.Rows
            If C.IsNewRow = True Then Exit For
            If C.Cells(0).Value.ToString.ToLower.StartsWith(e.KeyChar.ToString.ToLower) Then
                C.Selected = True
                Dgv.FirstDisplayedScrollingRowIndex = C.Index
                LastSelected = C.Index
                Exit For
            End If
        Next

Fiz uns pequenos testes e resultou

Testa ai e diz qualquer coisa :)


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
ucase

Aqui não funciona. 

O cursor fica sempre onde estava antes de seleccionar uma tecla.

Eis o meu código:

Private Sub dgvDados_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles dgvDados.KeyPress

        For Each C As DataGridViewRow In dgvDados.Rows

            If C.IsNewRow = True Then Exit For

            If C.Cells(0).Value.ToString.ToLower.StartsWith(e.KeyChar.ToString.ToLower) Then

                C.Selected = True

                dgvDados.FirstDisplayedScrollingRowIndex = C.Index

                LastSelected = C.Index

                Exit For

            End If

        Next

        If dgvDados.AllowUserToAddRows = True Then Total = dgvDados.Rows.Count - 2 Else Total = dgvDados.Rows.Count - 1

        If LastSelected < Total Then

            If dgvDados.Rows(LastSelected).Cells(0).Value.ToString.ToLower.StartsWith(e.KeyChar.ToString.ToLower) Then

                If dgvDados.Rows(LastSelected + 1).Cells(0).Value.ToString.ToLower.StartsWith(e.KeyChar.ToString.ToLower) Then

                    dgvDados.Rows(LastSelected + 1).Selected = True

                    dgvDados.FirstDisplayedScrollingRowIndex = LastSelected + 1

                    LastSelected += 1

                    Exit Sub

                End If

            End If

        End If

 

    End Sub

Share this post


Link to post
Share on other sites
Caça

Aqui não funciona. 

O cursor fica sempre onde estava antes de seleccionar uma tecla.

Qual é a tua definição de cursor?

Não estou a perceber.

O teu datagrid permite Multiselecção?


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
ucase

Boas.

O datagrid não permite multiselecção

Com o código seguinte talvez possas perceber melhor.

...

    Private Sub dgvDados_CellEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvDados.CellEnter

        Dim cmd As New OleDbCommand("SELECT * FROM tbGeral  WHERE Nome = '" & Me.dgvDados(0, dgvDados.CurrentRow.Index).Value & "'", myConnection)

        Dim resultado As OleDbDataReader

        resultado = cmd.ExecuteReader

        resultado.Read()

        txtID.Text = resultado.Item("ID") & ""

        txtNome.Text = resultado.Item("Nome") & ""

        txtMorada.Text = resultado.Item("Morada") & ""

        txtLocalidade.Text = resultado("Localidade") & ""

        txtCodigoPostal.Text = resultado("CodigoPostal") & ""

        txtContacto1.Text = resultado("Contacto1") & ""

        txtContacto2.Text = resultado("Contacto2") & ""

        txtContacto3.Text = resultado("Contacto3") & ""

        txtContacto4.Text = resultado("Contacto4") & ""

        txtFax1.Text = resultado("Fax1") & ""

        txtFax2.Text = resultado("Fax2") & ""

        txtEmail.Text = resultado("Email") & ""

        txtOBS.Text = resultado("OBS") & ""

    End Sub

    Private Sub PreencheDataGridView()

     

        Dim drc As DataGridViewSelectedRowCollection = dgvDados.SelectedRows

        Dim strPesquisa As String = txtPesquisar.Text

        Dim SQL As String = ""

        'faz a strPesquisa pelos números de telefone ou fax

        If Microsoft.VisualBasic.Left(strPesquisa, 1) = "2" Or Microsoft.VisualBasic.Left(strPesquisa, 1) = "9" Then

            SQL = "SELECT Nome FROM tbGeral  WHERE Nome LIKE '%" & strPesquisa & "%' ORDER BY Nome"

            SQL = SQL & " UNION ALL SELECT Nome FROM tbGeral WHERE Contacto1 LIKE '%" & strPesquisa & "%' ORDER BY Nome"

            SQL = SQL & " UNION ALL SELECT Nome FROM tbGeral WHERE Contacto2 LIKE '%" & strPesquisa & "%' ORDER BY Nome"

            SQL = SQL & " UNION ALL SELECT Nome FROM tbGeral WHERE Contacto3 LIKE '%" & strPesquisa & "%' ORDER BY Nome"

            SQL = SQL & " UNION ALL SELECT Nome FROM tbGeral WHERE Contacto4 LIKE '%" & strPesquisa & "%' ORDER BY Nome"

            SQL = SQL & " UNION ALL SELECT Nome FROM tbGeral WHERE Fax1 LIKE '%" & strPesquisa & "%' ORDER BY Nome"

            SQL = SQL & " UNION ALL SELECT Nome FROM tbGeral WHERE Fax2 LIKE '%" & strPesquisa & "%' ORDER BY Nome"

        Else

            'faz a strPesquisa pelo Nome

            SQL = "SELECT Nome FROM tbGeral WHERE Nome LIKE '%" & strPesquisa & "%' ORDER BY Nome"

        End If

        Dim da As OleDbDataAdapter = New OleDbDataAdapter(SQL, myConnection)

        Dim cmd As New OleDbCommand(SQL, myConnection)

        Dim resultado As OleDbDataReader

        resultado = cmd.ExecuteReader

        Dim ds = New DataSet

        da.Fill(ds, "table")

        Me.dgvDados.DataSource = ds.Tables("table")

        With dgvDados

            .Width = 497

        End With

    End Sub

    Private Sub dgvDados_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles dgvDados.KeyPress

        dgvDados.Rows(LastSelected).Selected = False

            For Each C As DataGridViewRow In dgvDados.Rows

                If C.IsNewRow = True Then Exit For

            If C.Cells(0).Value.ToString.ToLower.StartsWith(e.KeyChar.ToString.ToLower) Then

                C.Selected = True

                dgvDados.FirstDisplayedScrollingRowIndex = C.Index

                Exit For

            End If

            Next

            If dgvDados.AllowUserToAddRows = True Then Total = dgvDados.Rows.Count - 2 Else Total = dgvDados.Rows.Count - 1

            If LastSelected < Total Then

            If dgvDados.Rows(LastSelected).Cells(0).Value.ToString.ToLower.StartsWith(e.KeyChar.ToString.ToLower) Then

                dgvDados.Rows(LastSelected + 1).Cells(0).Value.ToString.ToLower.StartsWith(e.KeyChar.ToString.ToLower)

                dgvDados.Rows(LastSelected + 1).Selected = True

                dgvDados.FirstDisplayedScrollingRowIndex = LastSelected + 1

                LastSelected += 1

                Exit Sub

            End If

            End If

    End Sub

Como vez estou pretendendo que as caixas de texto sejam completadas seleccionando o nome que aparece na linha ,clicando com o mouse isso acontece, e ao percorrer o datagrid apartando as teclas "seta para cima" e "seta para baixo"

os dados vão sendo actualizados ao mesmo tempo que a selecção vai mudando, mas se premir uma tecla, digamos a letra C o evento CellEnter não é disparado,embora a linha fique seleccionada, e ao voltar a premir tecla "seta para cima" ou "seta para baixo" a selecção volta para a linha que tem o cursor.

Quanto ao que eu chamo de cursor é a seta que aparece no lado esquerda da linha que está seleccionada.

Share this post


Link to post
Share on other sites
Caça

É óbvio que o evento CellEnter não dispara porque ao digitar uma tecla o que ira ficar seleccionado é a linha não a célula.

Para isso em vez de seleccionar a linha correspondente põe a seleccionar apenas a célula correspondente e o evento ira ser disparado.


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Caça

Substituis

Dgv.Rows(LastSelected + 1).Selected = True

por

Dgv.Rows(LastSelected + 1).Cells(0).Selected = True

e também

C.Selected = True

por

C.Cells(0).Selected = True


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.