none
icomparer

    Domanda

  • buonasera


    una domanda, lavoro con una listview la popolo di dati che carica velocissimamente, diciamo che siano 5000 righe tempo impegato 2/3 secondi, se ricarico altri dati cancellando i precedenti, ripopolo la listview sempre in 2/3 secondi, però se clicco su una colonna per ordinarla usando una classe creata con icomparer di cui posto una riga di codice:

    [String].Compare(CType(y, ListViewItem).SubItems(col).Text, CType(x, ListViewItem).SubItems(col).Text), 

    mi sono reso conto che per ripopolare la listview il tempo che impiega ora è di 3/4 minuti, cosa devo fare perchè ricarichi velocemente la listview?

    Grazie

    Paperino2


    paperino2

    lunedì 11 settembre 2017 18:17

Tutte le risposte

  • salve

    non ho ricevuto risposte , comunque ho risolto in un certo modo che vi posto, l'unico problema che ho riscontrato è, che la prima colonna su cui clikko viene messa in ordine alfabetico o numerico, se clicco una seconda volta su un altra colonna non riordina partendo dal riordino effettuato in precedenza ma dal primo ripopolamento della listview, ho pensato di salvare il file dopo il primo riordino e poi ricaricarlo, non vorrei però allungare troppo i tempi. Vi posto la rutine chiamante e la rutine che riordina, se qualcuno mi  da una dritta.

    questa la rutine che riordina

    Option Strict On
    Public Class sortLW

        Friend WithEvents listWiewLW As System.Windows.Forms.ListView

        Sub riord(ByVal lvwView As ListView, ByVal column As Integer, ByVal ti As String, _
        Optional ByVal NUM As Integer = 0)
            Dim Item As ListViewItem

            Dim a, b, c As Integer
            listWiewLW = lvwView
            If column > lvwView.Columns.Count - 1 Then Exit Sub
            Dim _colonna(lvwView.Columns.Count) As ArrayList
            '_colonna(0) = New ArrayList

            If NUM > 0 Then
                If NUM = 1 Then vero10 = False
                If NUM = 2 Then vero10 = True
            End If

            For a = 0 To lvwView.Columns.Count
                _colonna(a) = New ArrayList
            Next

            b = 0
            Dim primaCOL(lvwView.Items.Count - 1) As Integer 'String
            Dim lwBOOl(lvwView.Items.Count - 1) As Boolean
            ' Dim secondaCOL As Array
            Dim secondaCOL(lvwView.Items.Count - 1) As String

            Try
                With lvwView
                    For Each Item In .Items
                        primaCOL(b) = b
                        _colonna(0).Add(Item.Text)
                        If Item.Checked Then
                            lwBOOl(b) = True
                        End If
                        For a = 1 To lvwView.Columns.Count - 1
                            _colonna(a).Add(Item.SubItems(a).Text)
                        Next
                        secondaCOL(b) = CStr(_colonna(column).Item(b))
                        b += 1
                    Next
                End With

            Catch ex As Exception
                MessageBox.Show("errore di copia", "Copy Error", MessageBoxButtons.OK)
                Exit Sub
            End Try

            'secondaCOL = _colonna(column).ToArray
            Array.Sort(secondaCOL, primaCOL)
            If vero10 Then
                Array.Reverse(primaCOL)
                vero10 = False
            Else
                vero10 = True
            End If

            Dim vero1 As Boolean
            Dim oitem As ListViewItem
            Dim osItem As ListViewItem.ListViewSubItem
            Dim Color_Riga As Color
            Dim Color_Riga1 As Color

            For Each Item In lvwView.Items
                If vero1 Then
                    vero1 = False
                    Color_Riga1 = Item.BackColor
                    Exit For
                Else
                    vero1 = True
                    Color_Riga = Item.BackColor
                    'Exit For
                End If
            Next

            c = listWiewLW.Items.Count - 1

            listWiewLW.BeginUpdate()
            listWiewLW.Items.Clear()

            For a = 0 To c
                oitem = New ListViewItem
                If vero1 Then
                    vero1 = False
                    oitem.BackColor = Color_Riga1
                Else
                    vero1 = True
                    oitem.BackColor = Color_Riga
                End If
                oitem.Text = CStr(_colonna(0).Item(primaCOL(a)))
                If lvwView.CheckBoxes Then
                    oitem.Checked = lwBOOl(primaCOL(a))
                End If
                For b = 1 To lvwView.Columns.Count - 1
                    osItem = New ListViewItem.ListViewSubItem
                    osItem.Text = CStr(_colonna(b).Item(primaCOL(a)))
                    oitem.SubItems.Add(osItem)
                Next b
                Me.listWiewLW.Items.Add(oitem)
            Next a
            listWiewLW.EndUpdate()

        End Sub

    end class

    questa la rutine chiamante ATTENZIONE la rutine chiamante, chiama string e single

    mentre sopra ho postato sola la rutine che riordina la colonna delle stringhe

             Private Sub ListView1_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) _
        Handles ListView1.ColumnClick, ListView4.ColumnClick


            Dim lw As ListView = DirectCast(sender, ListView)
            Dim rior As New sortLW

    Select Case e.Column
               Case 0, 1, 2, 5, 6
            Dim ti As Single
            rior.riord(lw, e.Column, ti)
               Case Else
            Dim ti As String
            rior.riord(lw, e.Column, ti)
            End Select

    end sub

    buon anno a tutti


    paperino2

    giovedì 28 dicembre 2017 20:23