upravení komponenty listview   zodpovězená otázka

VB.NET

Ahoj, zajímalo by mě, jetli můžu resp. jak si upravit komponentu ListView. Chtěl bych si vytvořit vlastní ListView, teda ne úplně vlastní, ale že bych použil ten standardní a do něj implementoval řazení podle sloupců. Takže bych přidal do ListView funkci na řazení, proměnnou která by obsahovala index sloupce podle ktereho se bude řadit a proměnnou která by povolovala nebo zakazovala to řazení. To by nebyl problém, ale zajímá mě něco jinýho... jak zařídit, aby se při uálosti ColumnClick provedlo seřazení a aby se mi v hlavičce sloupce vykreslila šipka, která ukazuje směr řazení?

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

ListView je připraven na implementaci vlastního řazení bez jakékoliv modifikace. Stačí si implementovat vlastní IComparer a přiřadit jeho instanci do vlastnosti ListViewItemSorter. Na událost ColumnClick potom měníte způsob řazení, případně obrázek se šipkou. Následující příklad ukazuje IComparer jak jsem ho implementoval já pro svoje účely řazení v ListView:

  Public Class ListViewItemComparer
    Implements IComparer
    Private _columnIndex As Integer
    Private _sortOrder As SortOrder
    Public Sub New(ByVal columnIndex As Integer)
      Me.New(columnIndex, SortOrder.Ascending)
    End Sub
    Public Sub New(ByVal columnIndex As Integer, ByVal sortOrder As SortOrder)
      If columnIndex < 0 Then
        Throw New ArgumentOutOfRangeException("columnIndex")
      End If
      _columnIndex = columnIndex
      _sortOrder = sortOrder
    End Sub
    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
      Dim value1 = DirectCast(x, ListViewItem).SubItems(_columnIndex).Text
      Dim value2 = DirectCast(y, ListViewItem).SubItems(_columnIndex).Text
      If IsNumeric(value1) AndAlso IsNumeric(value2) Then
        Return CDbl(value1).CompareTo(CDbl(value2)) * _sortOrder
      Else
        Return value1.CompareTo(value2) * _sortOrder
      End If
    End Function
    Public Property SortOrder() As SortOrder
      Get
        Return _sortOrder
      End Get
      Set(ByVal value As SortOrder)
        _sortOrder = value
      End Set
    End Property
    Public Property Column() As Integer
      Get
        Return _columnIndex
      End Get
      Set(ByVal value As Integer)
        _columnIndex = value
      End Set
    End Property
  End Class

Použití:

'Nastavit výchozí vzestupné řazení podle prvního sloupce
ListView1.ListViewItemSorter = New ListViewItemComparer(0)

Změna řazení (vzestupně/sestupně) klepnutím na záhlaví sloupce (načtení obrázku si tam dopište sám, je to primitivní, inspirovat se můžete zde: http://www.vbnet.cz/forum-tema--817-sort... ):

  Private Sub ListView1_ColumnClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
    Dim itemSorter = DirectCast(ListView1.ListViewItemSorter, ListViewItemComparer)
    itemSorter.Column = e.Column
    itemSorter.SortOrder *= -1
    ListView1.Sort()
  End Sub

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Mockrát děkuju, je to jednoduší než jsem čekal. Díky

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

ještě jeden dotaz, nějak nemůžu přijít na to, jak zjistit podle kterýho sloupce a jak je seřazeno

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

No to je vidět, že jste se na ten ukázkový kód ani nepodíval. Vlastnost SortOrder určuje řazení (vzestupně/sestupně), Column určuje sloupec podle kterého se bude řadit (obsahuje-li číselnou hodnotu tak se porovnává jako číslo Double, jinak jako String). Po nastavení hodnot je třeba zavolat metodu Sort u ListView.

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

S odstupem času pátrám po řazení sloupců.

Díky za tento tip, který mi velmi pomohl.

Případně i zde:

http://www.vb-helper.com/howto_net_listv...

Ohledně zobrazování šipek v záhlaví sloupce:

http://stackoverflow.com/questions/25412...

Nedaří se mi kód převést, nemáte podobný tip pro vb.net?

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

Co je na tak jednoduchém C# kódu nesrozumitelné a nepřevoditelné do VB?

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

Věřím, že pro profíky zde to žádný problém nebude...

V deklaracích api docela tápu, nakonec se mi povedlo

doplnit potřebné konstanty a vb.net verzi rozchodit.

Seřazení je velmi rychlé a funguje pro text, čísla

i datumy, prostě paráda. Každopádně díky za reakci,

a hlavně za Váš předchozí tip, který mě dopostrčil

na správnou cestu.

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