Setřídění položek v listview   otázka

VB.NET, WinForms

Zdravím, vytvořil jsem podle seriálu "VBnet od začátku" díl 8 a 9 záznam příjmů a výdajů. Po klinutí na záhlaví slupce chci setřídit podle částky nebo podle datumu. Použiju třídu Icomparer, ale regularně setřidit se nedaří. Nemá někdo radu? Díky Jan

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste:

  Private Sub ListView1_ColumnClick(ByVal sender As Object, _
       ByVal e As System.Windows.Forms.ColumnClickEventArgs) _
       Handles ListView1.ColumnClick
     If ListView1.Sorting = SortOrder.Ascending Then
       ListView1.Sorting = SortOrder.Descending
     Else
       ListView1.Sorting = SortOrder.Ascending
     End If
     ListView1.Sort()
  End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jakou třídu IComparer používáte? Pošlete sem kód, který máte. IComparer je rozhraní, ne třída.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Používám kód vyčtený z literatury, údaje se setřídí jen jako string, ne jako čísla. Když změním typ proměnné Item1 program nahlásí chybu přetypování.

Public Class listCompanySorter
    Implements IComparer

    Public Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements System.Collections.IComparer.Compare
        Dim item1, item2 As ListViewItem
        item1 = CType(o1, ListViewItem)
        item2 = CType(o2, ListViewItem)
        If item1.ToString.ToUpper > item2.ToString.ToUpper Then
            Return 1
        Else
            If item1.ToString.ToUpper < item2.ToString.ToUpper Then
                Return -1
            Else
                Return 0
            End If
        End If
    End Function
End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Trochu jsem váš kód poupravil, nyní by měl porovnávat i číselné hodnoty jako číslo (pro celá i desetinná čísla v platném formátu pro formátovací kulturu aktuálního vlákna).

Public Class listCompanySorter
  Implements IComparer
  Public Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements System.Collections.IComparer.Compare
      Dim item1 = DirectCast(o1, ListViewItem).Text
      Dim item2 = DirectCast(o2, ListViewItem).Text
      If (IsNumeric(item1) AndAlso IsNumeric(item2)) Then
        Return CDbl(item1).CompareTo(CDbl(item2))
      Else
        Return item1.CompareTo(item2)
      End If
  End Function
End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback