List view

lunedì 11 dicembre 2006 - 15.05

ANNA79 Profilo | Junior Member

Salve,
qualcono sa dirmi come si puo fare l'ordinamento dei record in una listview cliccando su una determinata colonna?
grazie

AntCiar Profilo | Expert

Ciao.
Io ho risolto il problema realizzando una classe estesa della listview classica.
ti posto un po di codice (in c#)

Spero ti possa essere di aiuto.
Ciao




public class SortedListView: ListView
{

private Sorter sorterClass = new Sorter;

protected override void OnColumnClick(ColumnClickEventArgs e)
{

if (sorterClass .Columns.Count == 1)
{
sorterClass .Columns.Count = this.Columns.Count;
}
// Switch sortorder if nescesary
if (sorterClass .Column == e.Column)
{
sorterClass .SwitchSortOrder();
}
else
{
sorterClass .Sorting = SortOrder.Descending;
}
// Set column to sort
sorterClass .Column = e.Column;
// Perform sort
this.Sort();
if (sorterClass .Sorting == SortOrder.Descending)
{
this.Columns[e.Column].ImageIndex = 0;
}
else if (sorterClass .Sorting == SortOrder.Ascending)
{
this.Columns[e.Column].ImageIndex = 1;
}
else if (sorterClass .Sorting == SortOrder.None)
{
this.Columns[e.Column].ImageIndex = -1;
}

base.OnColumnClick(e);
}

private class Sorter : IComparer
{
int col;
SortOrder so;
SorterColumns columns;


public ListViewSorter()
{
col = 0;
so = SortOrder.Ascending;
columns = new SorterColumns();
}


// This is the only method we need to implement
// from the System.Collections.IComparer interface.
// We must return 1 if x is bigger than y, 0 if
// equal and -z if x is less than y.
public int Compare(object x, object y)
{
string s1;
string s2;


if (col == 0)
{
s1 = ((ListViewItem)x).Text;
s2 = ((ListViewItem)y).Text;
}
else
{
s1 = ((ListViewItem)x).SubItems[col].Text;
s2 = ((ListViewItem)y).SubItems[col].Text;
}


if (so == SortOrder.Descending)
{
string temp;


temp = s1;
s1 = s2;
s2 = temp;
}


switch (columns[col].SortType)
{
case SortTypes.SortText:
return s1.CompareTo(s2);
case SortTypes.SortNumeric:
return long.Parse(s1).CompareTo(long.Parse(s2));
case SortTypes.SortDate:
return DateTime.Parse(s1).CompareTo(DateTime.Parse(s2));
default:
return 0;
}
}


public int Column
{
get { return col; }
set { col = value; }
}


public SortOrder Sorting
{
get { return so; }
set { so = value; }
}


// Switches the sortorder from Ascending to Descending
// and vice versa.
public void SwitchSortOrder()
{
if (so == SortOrder.None)
so = SortOrder.Ascending;
else if (so == SortOrder.Ascending)
so = SortOrder.Descending;
else
so = SortOrder.Ascending;
}


public SorterColumns Columns
{
get { return columns; }
}


/// <summary>
/// SorterColumns class :
/// Holds the array of the SorterColumn class.
/// You can change its size and set the SortType
/// of each SorterColumn object. It uses an Indexer
/// to retrieve the correct element from the array.
/// </summary>
public class SorterColumns
{
SorterColumn[] columns;
int count;


private void NewSize(int newsize)
{
int i;


columns = new SorterColumn[count];
for (i = 0; i < count; i++)
{
columns[i] = new SorterColumn(SortTypes.SortText);
}
}


public SorterColumns()
{
count = 1;
NewSize(count);
}


public SorterColumn this[int index]
{
get { return columns[index]; }
}


public int Count
{
get { return count; }
set
{
count = value;
NewSize(count); ;
}
}
}


/// <summary>
/// SorterColumn Class :
/// Only used to hold information about the type of
/// sorting that should be used for this column.
/// </summary>
public class SorterColumn
{
SortTypes st;


public SorterColumn()
{
st = SortTypes.SortText;
}


public SorterColumn(SortTypes SortType)
{
st = SortType;
}


public SortTypes SortType
{
get { return st; }
set { st = value; }
}
}
}

}

}

ANNA79 Profilo | Junior Member

ODDIO tutto sto casino per ordinare dei dati in una lista?
non è che magari in Vb.net c'è una maniera più breve?

AntCiar Profilo | Expert

a dire il vero anche io quando ho cercato del codice per effettuare degli ordinamenti nella listview ho trovato cose spaventose. Per VB non so se vi è qualcosa. Quello che ho postato prima a mio parere è quello più comprensibile (nell'ipotesi di un adattamento futuro).

AntCiar Profilo | Expert

Mi viene in mente un vecchio metodo, un po dispendioso, ma sempre efficace.
Utilizzare un dataview

Sull'evento ColumnClick della listView invochi una Sub passandogli come parametro l'indice della colonna su cui hai cliccato.
All'interno della sub ti crei un DataView agganciato alla tabella dati ed usi il sort del listview.

Posto un po di codice di esempio (wuesta volta in VB)
Ciao


Private OldColId as integer = 0
Private OldColOrd as string = "ASC"


Private sub RiempiListView(Byval ColOrd as integer)

Dim DV as DataView = New DataView(TabDati)

if OldColId = ColOrd Then
if OldColOrd = "ASC" Then
OldColOrd = "DESC"
else
OldColOrd = "ASC"
end if
else
OldColOrd = "ASC"
end if

OldColId = ColOrd

DV.Sort = GetColName(ColOrd) & " " & OldColOrd
Dim i as integer
Dim Elem as ListViewiItem

For i = 0 to DV.Count-1
Elem = New ListViewItem()
.....
.....
.....
.....
me.Listview1.Items.Add(Elem)
next
End sub


private function GetColName(Byval Id as integer)
select case Id
case 0
return "xxxx" 'Indica il nome della colonna presente nella DataView su cui ordinare
case 1
.......
end select
end function

ANNA79 Profilo | Junior Member

vabbè
grazie mille mi immergerò in questa immensità di codice per cercare di adattarlo al meglio al mio codice

grazie
Anna

ANNA79 Profilo | Junior Member

scusa
ma per quale motivo se scrivo

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

ListView1.ListViewItemSorter = New OrdinamentoListView(e.Column)
ListView1.Sort()

End Sub


e clicco sulla colonna non mi entra nella routine? in cosa sbaglio?

AntCiar Profilo | Expert

Se il codice viene eseguito lo stesso ma sul breakpoint non si ferma allora vuol dire che nelle impostazioni del progetto la voce "Genera informazioni di Debug" non è spuntata.



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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5