IMPEDIR QUE ITEM NAO SE REPITA NA LISTVIEW

KURTGU 03/08/2015 13:53:28
#449500
Pessoal como faco antes de adicionar o item ao listview se ele ja estiver nao adicionar ele....Uso o for abaixo para adicionar os items, a questao e que a planilha repete varias vezes o nome do paciente...e so preciso q seja adiciona uma vez....

Try
Dim pathconn As String = [Ô]Provider = Microsoft.ACE.OLEDB.12.0; Data source=[Ô] & txtcaminho.Text & [Ô];Extended Properties=[Ô][Ô]Excel 12.0;HDR= yes;[Ô][Ô];[Ô]
Dim conn As New OleDbConnection(pathconn)
Dim MyDataAdapter As New OleDbDataAdapter([Ô]Select [Num do Cartão SISPRENATAL],[Nome da Usuária],[Exame] from [[Ô] & (Me.txtcelula.Text) & [Ô]$] [Ô], conn)
Dim dt As New DataTable()
MyDataAdapter.Fill(dt)

For Each dr As DataRow In dt.Rows
Dim lvi As New ListViewItem()
For i As Integer = 1 To dt.Columns.Count - 1
lvi.Text = dr(0).ToString()
lvi.SubItems.Add(dr(i).ToString())
Next
ListView1.Items.Add(lvi)
Next

Dim pathconn2 As String = [Ô]Provider = Microsoft.ACE.OLEDB.12.0; Data source=[Ô] & txtcaminho.Text & [Ô];Extended Properties=[Ô][Ô]Excel 12.0;HDR= yes;[Ô][Ô];[Ô]
Dim conn2 As New OleDbConnection(pathconn2)
Dim MyDataAdapter2 As New OleDbDataAdapter([Ô]Select [Num do Cartão SISPRENATAL],[Nome da Usuária] from [[Ô] & (Me.txtcelula.Text) & [Ô]$] [Ô], conn2)
Dim dt2 As New DataTable()
MyDataAdapter2.Fill(dt2)

For Each dr2 As DataRow In dt2.Rows
Dim lvi2 As New ListViewItem()
For i2 As Integer = 1 To dt2.Columns.Count - 1
lvi2.Text = dr2(0).ToString()
lvi2.SubItems.Add(dr2(i2).ToString())
Next
ListView2.Items.Add(lvi2)
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try
KURTGU 03/08/2015 14:08:47
#449501
F001E 03/08/2015 14:10:01
#449502
Não me lembro se no VB tem mas no C# você declara uma variável como HashSet
HashSet<int> Item = new HashSet<int>;
que é uma lista e nunca vai se repetir. Automaticamente ela verifica se um determinado item já existe na lista e não o adiciona novamente.
O que eu faço, no Foreach adiciono no HashSet e depois o HashSet para lista.
KURTGU 03/08/2015 14:20:51
#449503
F001E Nunca Ultilizei essa funcao nem sei por onde comecar...
F001E 03/08/2015 17:39:10
#449505
Resposta escolhida
KURTGU, veja esse link te ajuda..


http://johnnycoder.com/blog/2009/12/22/c-hashsett/
KERPLUNK 03/08/2015 18:29:23
#449507
Já me disseram ser meio estúpido nas minhas respostas, mas vamos ao seu caso:
1 - Não use DataAdapter para ler dados, use um DataReader, ele é mais leve e por consequência, muito mais rápido.
2 - Use uma classe para preencher os dados vindos do DataReader. Assim, você pode trabalhá-los antes de exibir. Exemplo:

Public Class Paciente
Public Property CNS() As String
Get
Return m_CNS
End Get
Set
m_CNS = Value
End Set
End Property
Private m_CNS As String
Public Property Nome() As String
Get
Return m_Nome
End Get
Set
m_Nome = Value
End Set
End Property
Private m_Nome As String
Public Property HIV() As String
Get
Return m_HIV
End Get
Set
m_HIV = Value
End Set
End Property
Private m_HIV As String
Public Function BuscaPacientesPlanilha(CaminhoPlanilha As String, Celula As String) As List(Of Paciente)
Dim _return As List(Of Paciente) = Nothing
Dim connectionString As String = [Ô]Provider = Microsoft.ACE.OLEDB.12.0; Data source=[Ô] & CaminhoPlanilha & [Ô];Extended Properties=[Ô][Ô]Excel 12.0;HDR= yes;[Ô][Ô][Ô]
Dim cn As New OleDbConnection(connectionString)
cn.Open()
Dim cmd As New OleDbCommand([Ô]Select [Num do Cartão SISPRENATAL],[Nome da Usuária] from [[Ô] & CaminhoPlanilha & [Ô]$] [Ô])
Dim dr As OleDbDataReader = cmd.ExecuteReader()
If dr.HasRows Then
_return = New List(Of Paciente)()
While dr.Read()
_return.Add(New Paciente() With { _
Key .CNS = dr.GetString(0), _
Key .Nome = dr.GetString(1) _
})
End While
End If
Return _return

End Function
End Class



Para usar a classe acima, já classificando os resultados distintos, em qualquer lugar do seu código faça:

Dim lista As List(Of Paciente) = New Paciente.BuscaPacientesPlanilha(txtCaminho.Text, txtPlanilha.Text).ToList()
Dim listaFiltrada As List(Of Paciente) = lista.GroupBy(Function(paciente) paciente.CNS).[Select](Function(group) group.First()).ToList()


Neste ponto, [Ô]listaFiltrada[Ô], conterá os dados únicos de paciente(agrupados por CNS) e você pode fazer com eles o que quiser, até mesmo usar o mesmo preenchimento de ListView que está fazendo, assim:

For Each paciente In listaFiltrada
Dim lvi2 As New ListViewItem()
For i2 As Integer = 1 To dt2.Columns.Count - 1
lvi2.Text = paciente.CNS.ToString()
lvi2.SubItems.Add(paciente.Nome.ToString())
Next
ListView2.Items.Add(lvi2)
Next paciente


3 - Mesmo usando DataAdapter, não entendi porque criar duas conexões e dois DataAdapter, só por serem dois grids diferentes. Use o mesmo objeto para os dois grids...
4 - Procure facilitar para o usuário e colocar um botão de [Ô]Procura[Ô] para o campo onde se específica a planilha e, se possível, também uma combo, especificando todas as planilhas encontradas no arquivo escolhido
5 - Uma atenção ao título e ícone do form também é importante. Acho que esse form que você postou não é o [Ô]quente[Ô], mas sim um para testes. Caso eu esteja enganado, verifique isso.

Possivelmente haverá algum erro de sintaxe, escrevi todo o código de cabeça e não conferi compilando, mas deve ser bem parecido e simples de se resolver. Caso haja algum, me fala que eu corrijo.

Boa sorte.
Tópico encerrado , respostas não são mais permitidas