Jump to content

[Resolvido] Navegar em datagridview através de botões


j.mendes24
 Share

Recommended Posts

boas pessoal

alguem sabe como e que atraves de botoes eu consigo navegar num datagrid view sem usar os binding source?

quando me refiro a navegar, refiro-me a ir pa proxima ou anterior linha, para a primeira ou ultimo linha.

eu com os data binding consigo. e fica tudo ok o unico problema e que dpeois quando quero pesquisar por chave primaria(dois campos) dame o seguinte erro, (Desta forma, vai vincular à mesma propriedade dois enlaces na colecção. Nome do parâmetro: binding).

e eu queria resolver isto de forma a nao usar os binding source.

alguem me ajuda?

o codigo que tenho é o seguinte:

Private Sub FRMOrcamPesq_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Conn As New SqlConnection(ConnStr)
        Dim SQL As String = "SELECT CBOrcam.CBOAno, CBOrcam.CBOCod, TBClientes.Nome, TBVendedores.Descr, CBOrcam.CBOData, CBOrcam.CBODtEnt, CBOrcam.CBODtAber, CBOrcam.CBOPrzEnt, CBOrcam.CBOGarantia, " & _
                 "CBOrcam.CBOValidade, CBOrcam.CBODtValidade, CBOrcam.CBOModPag, CBOrcam.CBOTransporte, CBOrcam.CBOMontagem, CBOrcam.CBODesconto, CBOrcam.CBOOrigEquip, CBOrcam.CBOObs, " & _
                 "CBOrcam.CBOAnulado FROM (CBOrcam INNER JOIN TBClientes ON CBOrcam.CBOCli = TBClientes.CCli) INNER JOIN TBVendedores ON CBOrcam.CBOVen = TBVendedores.CVen;"
        Dim Cmd As New SqlCommand(SQL, Conn)

        Dim DA As New SqlDataAdapter(Cmd)
        Dim DT As New DataTable

        DA.Fill(DT)
        BN.DataSource = DT

        Enche_Form()

        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedSingle
        BTMRight.Focus()

        Conn.Close()
        Conn = Nothing
        Cmd = Nothing

    End Sub

    Sub Enche_Form()
        Me.LBLCodOrcam.DataBindings.Add("text", Me.BN, "CBOCod", True)
        Me.LBLOrcamAno.DataBindings.Add("text", Me.BN, "CBOAno", True)
        Me.LBLCliente.DataBindings.Add("text", Me.BN, "Nome", True)
        Me.LBLVendedor.DataBindings.Add("text", Me.BN, "Descr", True)
        Me.LBLDataEmi.DataBindings.Add("text", Me.BN, "CBOData", True)
        Me.LBLDataEnt.DataBindings.Add("text", Me.BN, "CBODtEnt", True)
        Me.LBLDataAber.DataBindings.Add("text", Me.BN, "CBODtAber", True)
        Me.LBLDataVal.DataBindings.Add("text", Me.BN, "CBODtValidade", True)
        Me.LBLPrazoEnt.DataBindings.Add("text", Me.BN, "CBOPrzEnt", True)
        Me.LBLGar.DataBindings.Add("text", Me.BN, "CBOGarantia", True)
        Me.LBLVal.DataBindings.Add("text", Me.BN, "CBOValidade", True)
        Me.LBLModPag.DataBindings.Add("text", Me.BN, "CBOModPag", True)
        Me.LBLTransporte.DataBindings.Add("text", Me.BN, "CBOTransporte", True)
        Me.LBLMontagem.DataBindings.Add("text", Me.BN, "CBOMontagem", True)
        Me.LBLDesconto.DataBindings.Add("text", Me.BN, "CBODesconto", True)
        Me.LBLOrigemEquip.DataBindings.Add("text", Me.BN, "CBOOrigEquip", True)
        Me.TXTObs.DataBindings.Add("text", Me.BN, "CBOObs", True)

       
    End Sub

    Private Sub BTMRight_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTMRight.Click
        Me.BN.MoveNext()
    End Sub

    Private Sub BTOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTOK.Click
        Dim Conn As New SqlConnection(ConnStr)
        Dim SQL As String = "SELECT CBOrcam.CBOAno, CBOrcam.CBOCod, TBClientes.Nome, TBVendedores.Descr, CBOrcam.CBOData, CBOrcam.CBODtEnt, CBOrcam.CBODtAber, CBOrcam.CBOPrzEnt, CBOrcam.CBOGarantia, " & _
                 "CBOrcam.CBOValidade, CBOrcam.CBODtValidade, CBOrcam.CBOModPag, CBOrcam.CBOTransporte, CBOrcam.CBOMontagem, CBOrcam.CBODesconto, CBOrcam.CBOOrigEquip, CBOrcam.CBOObs, " & _
                 "CBOrcam.CBOAnulado FROM (CBOrcam INNER JOIN TBClientes ON CBOrcam.CBOCli = TBClientes.CCli) INNER JOIN TBVendedores ON CBOrcam.CBOVen = TBVendedores.CVen " & _
                 "WHERE CBOCod = " & TXTOrcamCod.Text & " AND CBOAno = " & TXTOrcamAno.Text
        Dim Cmd As New SqlCommand(SQL, Conn)

        Dim DA As New SqlDataAdapter(Cmd)
        Dim DT As New DataTable

        DA.Fill(DT)
        BN.DataSource = DT

        Enche_Form()

        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedSingle
        BTMRight.Focus()
    End Sub
Link to comment
Share on other sites

Uma forma fácil de obter o que pretendes é através da classe Keyboard com o método SendKeys.

Para simular, por exemplo, a seta direita:

        Dim KBD As New Devices.Keyboard
        DataGridView1.Focus()
        KBD.SendKeys("{RIGHT}")

Para enviar para a última e primeira linha, não sei (nem posso confirmar agora) se o END e HOME fazem isso nas DataGrids, mas se não fizerem lembra-te de que podes fazer algo do género:

        Dim KBD As New Devices.Keyboard
        DataGridView1.Focus()
        KBD.SendKeys("{RIGHT 5}")

O que vai fazer com que sejam simuladas 5 marteladas na seta direita.

Com um pouco de imaginação e umas subtracções consegues determinar a partir da célula seleccionada quantas ainda valtam para o fim, ou para o início.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Esse método devolve um Integer que representa o índice da linha.

O que é ideal. Repara:

DataGridView1.Rows(DataGridView1.Rows.GetLastRow(DataGridViewElementStates.Visible)).Cells(0).Selected = True

👍

Uma alternativa ao sendkeys é precisamente o jogo com índices, mas isso já envolve alguma lógica condicional para não rebentar.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

outra solução para a que me deste é esta.

'usa a tecla page down para mover para a ultima linha
Dim KBD As New Devices.Keyboard
        DataGridView1.Focus()
        KBD.SendKeys("{PGDN}")

'usa a tecla page up para mover para a primeira linha
Dim KBD As New Devices.Keyboard
        DataGridView1.Focus()
        KBD.SendKeys("{PGUP}")

o end e o home movem para a ultima linha e para a primeira linha, respectivamente.

vou agora tentar a outra solução.

Link to comment
Share on other sites

esta linha de codigo de facto move para o ultimo:

DataGridView1.Rows(DataGridView1.Rows.GetLastRow(DataGridViewElementStates.Visible)).Cells(0).Selected = True

e se quizer para o primeiro tambem:

DataGridView1.Rows(DataGridView1.Rows.GetFirstRow(DataGridViewElementStates.Visible)).Cells(0).Selected = True

mas se eu quizer usar para o seguinte ou para o anterior dame erro nesta parte:

DataGridView1.Rows(DataGridView1.Rows.GetPreviousRow(DataGridViewElementStates.Visible)).Cells(0).Selected = True

o erro que dá é o seguinte:

Overload resolution failed because no accessible 'GetPreviousRow' accepts this number of arguments.

podesme ajudar?

Link to comment
Share on other sites

Bolas, nem estás a tentar...

Bastava o que o método pedia.

O método precisa de receber o índice actual, para além da condição da linha:

DataGridView1.Rows(DataGridView1.Rows.GetPreviousRow(DataGridView1.CurrentRow.Index, DataGridViewElementStates.Visible)).Cells(0).Selected = True

Não se separam teclas por "+" e para além disso tens de usar os códigos de tecla correctos.

Procura no google.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

solução (o meu codigo ficou assim):

Private Sub BTMFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTMFirst.Click
        DGridCab.Rows(DGridCab.Rows.GetFirstRow(DataGridViewElementStates.Visible)).Cells(0).Selected = True
        Enche_Form()
    End Sub

    Private Sub BTMLeft_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTMLeft.Click
        If DGridCab.CurrentRow.Index = 0 Then
            Exit Sub
        End If
        DGridCab.Rows(DGridCab.Rows.GetPreviousRow(DGridCab.CurrentRow.Index, DataGridViewElementStates.Visible)).Cells(0).Selected = True
        Enche_Form()
    End Sub

    Private Sub BTMRight_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTMRight.Click
        DGridCab.Rows(DGridCab.Rows.GetNextRow(DGridCab.CurrentRow.Index, DataGridViewElementStates.Visible)).Cells(0).Selected = True
        Enche_Form()
    End Sub

    Private Sub BTMLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTMLast.Click
        DGridCab.Rows(DGridCab.Rows.GetLastRow(DataGridViewElementStates.Visible)).Cells(0).Selected = True
        Enche_Form()
    End Sub

    Private Sub BTSair1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTSair1.Click
        Me.DialogResult = DialogResult.OK
    End Sub
Link to comment
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
 Share

×
×
  • 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.