NAVEGAR PELOS REGISTROS DA LISTVIEW

ABREU 06/04/2017 02:01:36
#473090
Caros amigos,

Tenho uma ListView (lsvDados) que é preenchida com os códigos abaixo.
Está funcionando conforme o esperado.
O que eu preciso, agora, é aprender a desenvolver um código para navegar pelos registros da ListView com os tradicionais botões: Primeiro, Anterior, Próximo e Último.
Esse aprendizado me será útil para futuras aplicações.
Alguém poderia me ajudar? O que encontrei até agora é muito confuso!
Desde já fico muito grato.
P.S.: VB.Net 2012 e Access 2007.


Imports System.Data.OleDb

Public Class Form1
Dim conn As New OleDbConnection
Dim ds As New DataSet
Dim dr As DataRow
Dim dt As New DataTable

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
conn.ConnectionString = [Ô]Provider=Microsoft.ACE.OLEDB.12.0;[Ô] _
& [Ô]Data Source=BdListaTel.accdb;Jet OLEDB:System database=system.mdw;[Ô]
conn.Open()
End Sub

Private Sub CriarLista()
Try
Dim SQL As String = [Ô]Select * from Tab001 Order by Nome[Ô]
ds.Reset()
Dim adptr As New OleDbDataAdapter(SQL, conn)
adptr.Fill(ds)
dt = ds.Tables(0)
lsvDados.Items.Clear()
Dim Item As ListViewItem
For Each Me.dr In dt.Rows
Item = lsvDados.Items.Add(dr.Item([Ô]Id[Ô]))
Item.SubItems.Add(dr.Item([Ô]Nome[Ô]))
Item.SubItems.Add(dr.Item([Ô]Telefone[Ô]))
Next
Catch ex As Exception
Form2.lblMsg.Text = [Ô]Erro no aplicativo![Ô]
Form2.ShowDialog()
End Try
End Sub

Private Sub Form1_FormClosing(........
conn.Close()
End Sub
KERPLUNK 06/04/2017 02:19:15
#473092
O ListView, não é o componente adequado para fazer o que você quer. Você deveria usar o DataGridView, aliado ao BindingNavigator, aí sim você terá o resultado que você quer. Em anexo, um exemplo.
ABREU 06/04/2017 17:06:20
#473110
Agradeço as ajudas recebidas, sabendo que sempre posso contar com a colaboração dos amigos.

A orientação dada pelo JABA não atendeu totalmente a minha necessidade, uma vez que trata apenas dos movimentos para o registro anterior e para o próximo registro. Contudo, abriu um ótimo campo de estudo por se tratar de navegação entre registros através da ListView.

Adicionei a fonte de dados ao projeto com o respectivo Assistente, e fiz a devida associação com o formulário.

Não utilizei o BindingNavigator por uma questão de estética. Fiz os códigos de navegação usando o BindingSource com os ícones padronizados do aplicativo.

Ficou conforme demonstrado abaixo. Tecnicamente está correto???

Private Sub picPrimeiro_Click(sender As Object, e ...
Me. Tab001BindingSource.MoveFirst()
End Sub

Private Sub picAnterior_Click(sender As Object, e ...
Me. Tab001BindingSource.MovePrevious()
End Sub

Private Sub picProximo_Click(sender As Object, e ...
Me. Tab001BindingSource.MoveNext()
End Sub

Private Sub picUltimo_Click(sender As Object, e ...
Me. Tab001BindingSource.MoveLast()
End Sub
JABA 06/04/2017 22:58:21
#473124
Ir para o Primeiro:

With lsvDados
.ListItems(0).Selected = True
.ListItems(0).EnsureVisible
End With


Ir para o ùltimo:

Dim UltimoItem As Long
With lsvDados
UltimoItem = .ListItems.Count
.ListItems(UltimoItem).Selected = True
.ListItems(UltimoItem).EnsureVisible
End With
RICARDOCENTENO 06/04/2017 23:26:37
#473129
Oi boa noite.

Pelo o que analisei seu código acima, você está usando o Provider Microsoft ACE, tão logo, faz parte do Access Database Engine que é necessário ter instalado na máquina que irá rodar sua aplicação como também abrir o banco de dados no formato ACCDB.
Embora goste do Listview para algumas funções, é mais trabalhoso fazer as programações e depurações de erros do que um DataGridView alinhado com BindingNavigator. Segue um exemplo em anexo, caso esteja de acordo com suas expectativas, avalie a resposta e finalize o tópico. Caso contrário, poste aí suas dúvidas e questionamentos.

Abração.


ABREU 07/04/2017 12:02:13
#473152
Prezado RICARDOCENTENO,
O exemplo enviado está ótimo. Será muito útil para mim.
Muito bom o seu código de navegação pela lstClientes (ListView).
Nas minhas aplicações com .accdb costumo instalar o Access Database Engine junto com o meu .exe usando o InnoSetup.

Caro JABA,
A sua orientação abriu um excelente campo de estudos sobre a navegação pela ListView.
Quanto aos exemplos enviados para o Primeiro e para o Último registros, cabem algumas observações:
Primeiro, o ListItems não é membro do System.Windows.Forms.ListView. Creio que o membro aplicável seria Items.
Long não é o tipo correto para a variável UltimoItem pois esta se trata de Integer.
Os índices da ListView iniciam com 0 (Zero). Logo, o último item deve ser ...Items.Count – 1.
O código contido no link enviado (www.vbforums.com/) não funcionou no meu projeto.

Seguindo todas as orientações gentilmente oferecidas pelos amigos da comunidade e pesquisando um pouco mais sobre o tema deste tópico, cheguei aos códigos abaixo transcritos.

Alguém poderia melhorá-los???

Public Class Form1

Private Function GetItemSelected(ByVal lst As ListView) As Int32
[ô]Recupera o item selecionado na ListView
Return lst.SelectedItems(0).Index
End Function

Private Function GetCount(ByVal lst As ListView) As Int32
[ô]Recupera a quantidade de itens na ListView
Return lst.Items.Count
End Function

Private Sub SelectItem(ByVal lst As ListView, ByVal index As Int32)
[ô]Seleciona o item da ListView de acordo com o índice (parâmetro)
lst.Items(index).Selected = True
lst.Items(index).Focused = True
lst.Select()
End Sub

Private Sub picPrimeiro_Click(sender As Object, e As EventArgs) Handles picPrimeiro.Click
‘PRIMEIRO REGISTRO
With lsvDados
.Items(0).Selected = True
.Items(0).EnsureVisible()
End With
End Sub

Private Sub picAnterior_Click(sender As Object, e As EventArgs) Handles picAnterior.Click
[ô]REGISTRO ANTERIOR
Dim itemSelecionado As Int32 = GetItemSelected(lstDados)
If (itemSelecionado <= 0) Then
SelectItem(lstDados, 0)
Else
SelectItem(lstDados, itemSelecionado - 1)
End If
lstDados.Items(GetItemSelected(lstDados)).EnsureVisible()
End Sub

Private Sub picPróximo_Click(sender As Object, e As EventArgs) Handles picPróximo.Click
[ô]PRÓXIMO REGISTRO
Dim itemSelecionado As Int32 = GetItemSelected(lstDados)
If (itemSelecionado >= GetCount(lstDados) - 1) Then
SelectItem(lstDados, GetCount(lstDados) - 1)
Else
SelectItem(lstDados, itemSelecionado + 1)
End If
lstDados.Items(itemSelecionado).EnsureVisible()
End Sub

Private Sub picÚltimo_Click(sender As Object, e As EventArgs) Handles picÚltimo.Click
[ô]ÚLTIMO REGISTRO
Dim UltimoItem As Integer
With lsvDados
UltimoItem = .Items.Count - 1
.Items(UltimoItem).Selected = True
.Items(UltimoItem).EnsureVisible()
End With
End Sub

End Class
RICARDOCENTENO 08/04/2017 11:22:25
#473168
Bom dia.

Pelo seu código acima você quer navegar pelos registros do Listview e usar o foco de seleção dos mesmos com os botões de navegação Anterior, Primeiro, Último e Próximo?

RICARDOCENTENO 08/04/2017 12:45:55
#473171
Olá,

Fiz um exemplo, precisa de uma organização legal de código como por exemplo: colocar em forma de funções os botões de navegação de acordo com o registro.

Mas segue em anexo, veja se é isso que você quer fazer. Caso não seja, especifique melhor o seu caso.

Abração.

ABREU 09/04/2017 07:10:02
#473181
Muito obrigado a todos que colaboraram com este tópico.
Espero que ajude a quem o consultar.
Tópico encerrado , respostas não são mais permitidas