Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
List view
lunedì 11 dicembre 2006 - 15.05
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
ANNA79
Profilo
| Junior Member
62
messaggi | Data Invio:
lun 11 dic 2006 - 15:05
Salve,
qualcono sa dirmi come si puo fare l'ordinamento dei record in una listview cliccando su una determinata colonna?
grazie
AntCiar
Profilo
| Expert
936
messaggi | Data Invio:
lun 11 dic 2006 - 15:13
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
62
messaggi | Data Invio:
lun 11 dic 2006 - 15:24
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
936
messaggi | Data Invio:
lun 11 dic 2006 - 15:28
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
936
messaggi | Data Invio:
lun 11 dic 2006 - 15:39
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
62
messaggi | Data Invio:
lun 11 dic 2006 - 15:44
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
62
messaggi | Data Invio:
lun 11 dic 2006 - 16:11
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
936
messaggi | Data Invio:
lun 11 dic 2006 - 16:33
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.
Torna su
Stanze Forum
Elenco Threads
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 !