Conta le righe uguali

di il
7 risposte

Conta le righe uguali

Buongiorno, avrei un problema:
Ho una datagridview in cui ho riportato dei nomi anche ripetuti più di una volta, e ho una listview in cui riscrivo i nomi presenti nella datagridview ma riportando solo 1 volta il nome scritto, e nella colonna affianco il numero di volte che si ripete:

datagridview
nome | eta
marco |12
luca |23
marco |15
luca |53


listview:

marco | 2
luca |2

io il nome senza ripeterlo l'ho messo, non riesco solo a trovare il numero di volte che si ripete un nome:

Io ho provato con due for, usando indice i e indice j, prendendo il primo nome della listview, e confrontarlo con tutti quelli della datagrid, se era uguale incrementava una variabile, fino alla lunghezza di datagrid, poi aumentavo l'indice di listview prendendo il nome successivo e rifacevo la stessa cosa, ma nn funziona, riuscireste a darmi una mano?

7 Risposte

  • Re: Conta le righe uguali

    La questione è semplice, basta confrontare le righe del datagridview
    Ma se non mostri il tuo codice, di cosa possiamo discutere?

    Non sei nuovo, non capisco perché dobbiamo sempre chiedere il codice...
  • Re: Conta le righe uguali

    Scusate la mia risposta cosi in ritardo, allora io per confrontare la datagrid e la listview uso il seguente codice, ma non funziona…
    
      For i = 0 To ListView1.Items.Count - 1
    
                For j = 0 To DataGridView4.RowCount - 1
    
                    Dim riga As Integer = j, col = 0
    
                    If ListView1.Items(i).SubItems(0).Text = DataGridView1.Rows(riga).Cells(col).ToString Then
                        cont = cont + 1
                    End If
                              Next
                                ListView1.Items(i).SubItems(1).Text = cont
                    cont = 0
    
            Next
    
  • Re: Conta le righe uguali

    io il nome senza ripeterlo l'ho messo, non riesco solo a trovare il numero di volte che si ripete un nome:
    è questo il codice che devi mostrare, devi inserire un contatore al momento che scarti i nomi uguali
  • Re: Conta le righe uguali

    ors ha scritto:


    Scusate la mia risposta cosi in ritardo, allora io per confrontare la datagrid e la listview uso il seguente codice, ma non funziona…
    
      For i = 0 To ListView1.Items.Count - 1
    
                For j = 0 To DataGridView4.RowCount - 1
    
                    Dim riga As Integer = j, col = 0
    
                    If ListView1.Items(i).SubItems(0).Text = DataGridView1.Rows(riga).Cells(col).ToString Then
                        cont = cont + 1
                    End If
                              Next
                                ListView1.Items(i).SubItems(1).Text = cont
                    cont = 0
    
            Next
    

    Ecco la soluzione completa!
    Prova questo codice che ho fatto da 0 e che funziona, rimuovi il msgbox che ti guida passo-passo dopo aver compreso il meccanismo della procedura.
    
    
    '############################
    'CURSORE
    '9-10-2018
    'Soluzione lista nomi univoci
    '############################
    
    'Inserire in un Form1 un oggetto DataGridView, un ListView e 2 Pulsanti.
    
    Public Class Form1
        Public Nome As String 'Variabile per i campi
        Public Eta As Integer 'Variabile per i campi
        Public NomiPresenti() As String 'Insieme dei nomi predefiniti
        Public EtaPresenti() As Integer 'Insieme delle età predefinite
        Public NRiga As Integer 'Contatore delle righe
    
        Private Sub BT_PopolaDG_Click(sender As Object, e As EventArgs) Handles BT_PopolaDG.Click
            'Rimuovo le colonne 
            If DGV_ElencoDati.ColumnCount > 0 Then
                DGV_ElencoDati.Columns.Remove("Col0")
                DGV_ElencoDati.Columns.Remove("Col1")
                DGV_ElencoDati.Columns.Remove("Col2")
            End If
    
            'Rimuovo tutte le righe se sono già presenti
            If DGV_ElencoDati.RowCount > 0 Then
                For Each Riga As DataRow In DGV_ElencoDati.Rows()
                    Riga.Delete() 'Elimino la riga
                Next
            End If
    
            ' Aggiungo le colonne all'oggetto DGV_ElencoDati
            DGV_ElencoDati.Columns.Add("Col0", "NRiga")
            DGV_ElencoDati.Columns.Add("Col1", "Nome")
            DGV_ElencoDati.Columns.Add("Col2", "Eta")
    
            'Popolo l'oggetto con dati casuali
            NRiga = 0
            For a = 0 To 10
                NRiga = NRiga + 1
                Nome = NomiPresenti(Int(Rnd(1) * 5) + 1)
                Eta = EtaPresenti(Int(Rnd(1) * 10) + 1)
                'MsgBox(DGV_ElencoDati.Rows.Count().ToString())
    
                DGV_ElencoDati.Rows.Add()
                DGV_ElencoDati.Rows.Item(a).Cells(0).Value = NRiga.ToString()
                DGV_ElencoDati.Rows.Item(a).Cells(1).Value = Nome.ToString()
                DGV_ElencoDati.Rows.Item(a).Cells(2).Value = Eta
            Next
    
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Randomize(Date.Now.Second)
            'Inizializza la lista dei nomi 
            NomiPresenti = {"aa", "bb", "cc", "dd", "ee", "ff"}
            MsgBox("Nomi =" + NomiPresenti(2))
            EtaPresenti = {"40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50"}
            'Popola casualmente l'oggetto DataGridView chiamato DGV_ElencoDati
        End Sub
    
        Private Sub BT_RiportaNomiUnivoci_Click(sender As Object, e As EventArgs) Handles BT_RiportaNomiUnivoci.Click
            If DGV_ElencoDati.Rows.Count < 1 Then Exit Sub 'Esce dalla sub perchè l'elenco è vuoto
        
            'Rimuovo tutte le righe se sono già presenti
            If LV_NomiUnivoci.Items.Count > 0 Then
                For Each R As ListViewItem In LV_NomiUnivoci.Items
                    R.Remove() 'Rimuovo la riga
                Next
            End If
            'Rimuovo le colonne 
            If LV_NomiUnivoci.Columns.Count > 0 Then
                LV_NomiUnivoci.Columns.RemoveAt(3)
                LV_NomiUnivoci.Columns.RemoveAt(2)
                LV_NomiUnivoci.Columns.RemoveAt(1)
                LV_NomiUnivoci.Columns.RemoveAt(0)
            End If
    
            ' Aggiungo le colonne all'oggetto LG_NomiUnivoci
            LV_NomiUnivoci.Columns.Add("Col0", "NRiga")
            LV_NomiUnivoci.Columns.Add("Col1", "Nomi")
            LV_NomiUnivoci.Columns.Add("Col2", "eta")
            LV_NomiUnivoci.Columns.Add("Col3", "Occorrenze")
    
    
    
            Dim Occorrenze As Integer
            Dim Campo(4) As String
            Dim NomeDaConfrontare As String = ""
    
            'Popolo l'oggetto con dati filtrati (Solo nomi univoci + quantità delle Occorrenze)
    
            '1) Leggo la prima riga dal DGV_ElencoDati e l'aggiungo alla lista LV_NomiUnivoci
            NRiga = 0 ' Contatore delle varietà dei nomi non ripetuti che occuperanno le nuove righe nella lista
            Nome = DGV_ElencoDati.Rows(0).Cells(1).Value.ToString()
            Eta = DGV_ElencoDati.Rows(0).Cells(2).Value.ToString()
            NRiga = NRiga + 1 'Contatore delle nuove righe della lista
            Campo(0) = NRiga.ToString()
            Campo(1) = Nome.ToString()
            Campo(2) = Eta.ToString()
            Campo(3) = "1"
    
            Dim MiaNuovaRiga = New ListViewItem(Campo)
            LV_NomiUnivoci.Items.Add(MiaNuovaRiga) 'Aggiunge una nuova riga di campi
    
            '2) Leggo le sucessive righe dal DGV_ElencoDati e l'aggiungo alla lista LV_NomiUnivoci filtrandole
            For a = 0 + 1 To DGV_ElencoDati.RowCount - 2
                Occorrenze = 1 'Inizializzo il contatore delle Occorrenze per questo nome            
                NomeDaConfrontare = DGV_ElencoDati.Rows(a).Cells(1).Value.ToString()
                Eta = DGV_ElencoDati.Rows(a).Cells(2).Value.ToString()
                'Se l'oggetto lista ha almeno una riga allora 
                If LV_NomiUnivoci.Items.Count > 0 Then
                    'Scorro tutte le righe per confrontare se c'è già in lista
                    For b = 0 To LV_NomiUnivoci.Items.Count - 1
                        'Riga As ListViewItem In LV_NomiUnivoci.Items
                        If LV_NomiUnivoci.Items(b).SubItems(1).Text.ToString() = NomeDaConfrontare Then
                            LV_NomiUnivoci.Items(b).SubItems(1).Text = LV_NomiUnivoci.Items(b).SubItems(1).Text
                            LV_NomiUnivoci.Items(b).SubItems(2).Text = LV_NomiUnivoci.Items(b).SubItems(2).Text + " ; " + DGV_ElencoDati.Rows(a).Cells(2).Value.ToString()
                            LV_NomiUnivoci.Items(b).SubItems(3).Text = (Int(Val(LV_NomiUnivoci.Items(b).SubItems(3).Text.ToString()) + 1)).ToString()
                            LV_NomiUnivoci.Refresh()
                            MsgBox("INFORMAZIONE PASSO-PASSO:" + vbCrLf + "a= " + a.ToString() + vbCrLf + "Nome da confrontare = " + NomeDaConfrontare + vbCrLf + "  LV_NomiUnivoci.Items(b).SubItems(1).Text =  " + LV_NomiUnivoci.Items(b).SubItems(1).Text.ToString() + vbCrLf + vbCrLf + "Premere ok per continuare")
    
                            Occorrenze = Occorrenze + 1 'Qui non funge da contatore ma da interruttore, indica che è stato riscontrato un doppione
                        End If
                    Next b  'Fine For tra le ighe della lista
                End If
    
                'Se non ci sono Occorrenze aggiungo una nuova riga alla lista LV_NomiUnivoci
                If Occorrenze <= 1 Then
                    NRiga = NRiga + 1 'Contatore delle nuove righe della lista
                    Campo(0) = NRiga.ToString()
                    Campo(1) = NomeDaConfrontare.ToString()
                    Campo(2) = Eta.ToString()
                    Campo(3) = Occorrenze.ToString()
                    MiaNuovaRiga = New ListViewItem(Campo)
                    LV_NomiUnivoci.Items.Add(MiaNuovaRiga)
                End If
    
            Next a
    
        End Sub
    End Class
    
    
  • Re: Conta le righe uguali

    È comunque difficile discutere con chi (ors) pone la domanda e scappa.
  • Re: Conta le righe uguali

    Scusate, avete ragione per la mia risposta in ritardo, ma pultroppo e un brutto periodo, ma tornando a noi, funziona sia il codice da me proposto, sia quello consigliato da voi. Il problema è stata la mia distrazione , siccome io facevo il for, e inserivo il dato nella colonna due della listform, ma in realtà mi sono accorto che non avevo creato la colonna 2 nella listform, ma avevo solo la colonna 1, per questo non funzionava e mi dava errore
  • Re: Conta le righe uguali

    ors ha scritto:


    Scusate, avete ragione per la mia risposta in ritardo, ma pultroppo e un brutto periodo, ma tornando a noi, funziona sia il codice da me proposto, sia quello consigliato da voi. Il problema è stata la mia distrazione , siccome io facevo il for, e inserivo il dato nella colonna due della listform, ma in realtà mi sono accorto che non avevo creato la colonna 2 nella listform, ma avevo solo la colonna 1, per questo non funzionava e mi dava errore
    Non devi scusarti, un in bocca al lupo per il tuo futuro, con la consapevolezza che ogni difficoltà e problema della vita possono essere superate e risolte, fatti forza e coraggio, spera, lotta e non desistere.
Devi accedere o registrarti per scrivere nel forum
7 risposte