Eliminare duplicati in fase di caricamento nella listview

mercoledì 25 giugno 2014 - 16.04
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Visual Studio 2010  |  MySQL 5.5

Mau67 Profilo | Expert

Ciao al forum,
Ho la necessità di caricare dei dati in una ListView, il problema è che nella select alcuni dati in visualizzazione sono giustamente duplicati quando si caricano i dati da più tabelle, come faccio a non visualizzare i duplicati?

Questo è un esempio di codice che uso per visualizzare i dati nella listview
Dim Sql As String = "Select lavoratori_storico_mansioni.ID,azienda.Ragione_Sociale,azienda_unita_produttiva.Unita_Produttiva," & _
"mansione.mansione,Date_Format(lavoratori_storico_mansioni.Data_Inizio, '%d/%m/%Y') As Data_Inizio,Date_Format(lavoratori_storico_mansioni.Data_Fine, '%d/%m/%Y') As Data_Fine," & _
"lavoratori_storico_mansioni.Corrente,lavoratori_storico_mansioni.ID_Unita_Produttiva,lavoratori_storico_mansioni.ID_Mansione,lavoratori_storico_mansioni.ID_Partita_Iva" & _
" From lavoratori_storico_mansioni Inner Join azienda_unita_produttiva On azienda_unita_produttiva.ID = lavoratori_storico_mansioni.ID_Unita_Produttiva Inner Join" & _
" azienda On azienda.Partita_Iva = azienda_unita_produttiva.ID_Partita_Iva Inner Join mansione On mansione.ID = lavoratori_storico_mansioni.ID_Mansione" & _
" Where lavoratori_storico_mansioni.ID_Codice_Fiscale = '" & Selected.SubItems(3).Text & "' Order By lavoratori_storico_mansioni.Data_Inizio "
' Svuota la casella ListView1 e
' la casella di testo
ListView2.Items.Clear()

Dim thisCommand As New MySqlCommand(Sql, Connection)
' Set the view to show details.
ListView2.View = View.Details
' Allow the user to edit item text.
ListView2.LabelEdit = True
' Allow the user to rearrange columns.
ListView2.AllowColumnReorder = True
' Display check boxes.
ListView2.CheckBoxes = False
' Select the item and subitems when selection is made.
ListView2.FullRowSelect = True
' Display grid lines.
ListView2.GridLines = True
' Sort the items in the list in ascending order.
ListView2.Sorting = SortOrder.None


Try


Me.ListView2.Columns.Clear()
Connection.Open()

Dim thisReader As MySqlDataReader = thisCommand.ExecuteReader()

While (thisReader.Read())
Dim item As New ListViewItem(thisReader.Item(0).ToString, 0)
item.SubItems.Add(thisReader.Item(1).ToString)
item.SubItems.Add(thisReader.Item(2).ToString)
item.SubItems.Add(thisReader.Item(3).ToString)
item.SubItems.Add(thisReader.Item(4).ToString)
item.SubItems.Add(thisReader.Item(5).ToString)
item.SubItems.Add(thisReader.Item(6).ToString)
item.SubItems.Add(thisReader.Item(7).ToString)
item.SubItems.Add(thisReader.Item(8).ToString)
item.SubItems.Add(thisReader.Item(9).ToString)
ListView2.Items.AddRange(New ListViewItem() {item})
End While

ListView2.Columns.Add("ID", 0, HorizontalAlignment.Left)
ListView2.Columns.Add("Azienda", 250, HorizontalAlignment.Left)
ListView2.Columns.Add("Unità Produttiva", 250, HorizontalAlignment.Left)
ListView2.Columns.Add("Mansione", 200, HorizontalAlignment.Left)
ListView2.Columns.Add("Data Inizio", 100, HorizontalAlignment.Left)
ListView2.Columns.Add("Data Fine Rapp.", 100, HorizontalAlignment.Left)
ListView2.Columns.Add("Corrente", 100, HorizontalAlignment.Center)
ListView2.Columns.Add("ID Unità Produttiva", 0, HorizontalAlignment.Left)
ListView2.Columns.Add("ID Mansione", 0, HorizontalAlignment.Left)
ListView2.Columns.Add("ID P.IVA", 0, HorizontalAlignment.Left)

Catch ex As Exception
'MsgBox(ex.Message)

End Try
Connection.Close()

Grazie in anticipo
Mau67

luigidibiasi Profilo | Guru

Quale è il campo che ti permette di capire se due item sono duplicati?
Ipotizzo sia questo:
>thisReader.Item(1).ToString

Puoi usare un arraylist per fare una cosa del genere:

Dim duplicati as arraylist = new arraylist
>Dim thisReader As MySqlDataReader = thisCommand.ExecuteReader()
>
> While (thisReader.Read())

' se è la prima volta che vedi questo elemento lo aggiungi
if NOT duplicati.contains(thisReader.Item(1).ToString) then
duplicati.add(thisReader.Item(1).ToString)
else
continue ' se già lo hai visto precedentemente lo salti
end if

>Dim item As New ListViewItem(thisReader.Item(0).ToString, 0)
>item.SubItems.Add(thisReader.Item(1).ToString)
>item.SubItems.Add(thisReader.Item(2).ToString)
>item.SubItems.Add(thisReader.Item(3).ToString)
>item.SubItems.Add(thisReader.Item(4).ToString)
>item.SubItems.Add(thisReader.Item(5).ToString)
>item.SubItems.Add(thisReader.Item(6).ToString)
>item.SubItems.Add(thisReader.Item(7).ToString)
>item.SubItems.Add(thisReader.Item(8).ToString)
>item.SubItems.Add(thisReader.Item(9).ToString)
>ListView2.Items.AddRange(New ListViewItem() {item})
> End While


Spero di aver capito bene il problema.
Ciao,
Luigi Di Biasi




http://www.dibiasi.it/
http://www.luigidibiasi.it
http://yadamp.unisa.it/
http://yadamp.unisa.it/grimd
http://www.cilentiamoci.it

Mau67 Profilo | Expert

Ciao grazie per la risposta,
si hai centrato il problema solo che io ho 4 colonne nella listview
Dim item As New ListViewItem(thisReader.Item(0).ToString, 0)
item.SubItems.Add(thisReader.Item(1).ToString)
item.SubItems.Add(thisReader.Item(2).ToString)
item.SubItems.Add(thisReader.Item(3).ToString)
ListView1.Items.AddRange(New ListViewItem() {item})

in tutte le colonne ci sono duplicati il problema e che voglio ottenere questo:

Colonna1 colonna2 colonna3 colonna4
pippo casa rossa ottimo
porta gialla
maniglia

Non sò se ho reso l'idea
con il codice che mi hai gentilmente postato
Dim duplicati As ArrayList = New ArrayList
Dim thisReader As MySqlDataReader = thisCommand.ExecuteReader()

While (thisReader.Read())
' se è la prima volta che vedi questo elemento lo aggiungi
If Not duplicati.Contains(thisReader.Item(0).ToString) Then
duplicati.Add(thisReader.Item(0).ToString)

Else
Continue While
' se già lo hai visto precedentemente lo salti
End If
Dim item As New ListViewItem(thisReader.Item(0).ToString, 0)
item.SubItems.Add(thisReader.Item(1).ToString)
item.SubItems.Add(thisReader.Item(2).ToString)
item.SubItems.Add(thisReader.Item(3).ToString)
ListView1.Items.AddRange(New ListViewItem() {item})
End While
thisReader.Close()

ottengo questo:

Colonna1 colonna2 colonna3 colonna4
pippo casa rossa ottimo

manca il resto nelle colonne, pensi che c'è una soluzione al mio problema?
Grazie
Mau67

Mau67 Profilo | Expert

Ciao provo e riprovo ma il risultato è sempre lo stesso!
c'è qualche altra soluzione?
Grazie
Mau67

luigidibiasi Profilo | Guru

nella add invece di inserire solo il valore della prima colonna inserisci la concatenazione dei valori delle 4 colonne


> motd

dim key as string = thisReader.Item(1).ToString & thisReader.Item(2).ToString & thisReader.Item(3).ToString & thisReader.Item(4).ToString

if NOT duplicati.contains(key) then
duplicati.add(key)
else
continue ' se già lo hai visto precedentemente lo salti
end if
Luigi Di Biasi

http://www.dibiasi.it/
http://www.luigidibiasi.it
http://yadamp.unisa.it/
http://yadamp.unisa.it/grimd
http://www.cilentiamoci.it
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5