Elemental
2006-04-26, 21:15:05
Hallo,
ich versuch mich gerade das erste mal an einer ListView. Das mit den Spalten sortieren is ja garnet so einfach.
Ich hab mir eine Klasse gemacht, die das IComparer Interface implementiert.
Das dumme ist nur, dass manche Spalten in meiner ListView Integer und andere Strings enthalten. Mein Versuch für die Compare-Methode sieht so aus:
public int Compare(object x, object y)
{
string strText1 = ((ListViewItem)x).SubItems[iCol].Text;
string strText2 = ((ListViewItem)y).SubItems[iCol].Text;
try
{
//try to sort as integer
int iNumber1 = int.Parse(strText1);
int iNumber2 = int.Parse(strText2);
if (bSortAscending)
{
return (iNumber1 - iNumber2);
}
else
{
return (iNumber2 - iNumber1);
}
}
catch (Exception ex)
{
//hide the exception
ex = ex;
}
//sort as string
if (bSortAscending)
{
return String.Compare(strText1, strText2);
}
else
{
return String.Compare(strText2, strText1);
}
}
Das funktioniert wunderbar, wenn die zu sortierende Spalte integer enthält, aber wenn eine Spalte mit Strings sortiert werden soll, ist es sau langsam!
Zuerst hatte ich den ganzen try-catch Teil für integer nicht drin, dann werden die Strings auch schnell sortiert, nur werden die Integer dann natürlich nicht richtig sortiert (d.h. nicht 1,2,3,10,100 sondern 1,10,100,2,3)
Ich mach doch hier nichts neues. Es muss doch einen performanten Weg für sowas geben, oder?
mfG
Elemental
ich versuch mich gerade das erste mal an einer ListView. Das mit den Spalten sortieren is ja garnet so einfach.
Ich hab mir eine Klasse gemacht, die das IComparer Interface implementiert.
Das dumme ist nur, dass manche Spalten in meiner ListView Integer und andere Strings enthalten. Mein Versuch für die Compare-Methode sieht so aus:
public int Compare(object x, object y)
{
string strText1 = ((ListViewItem)x).SubItems[iCol].Text;
string strText2 = ((ListViewItem)y).SubItems[iCol].Text;
try
{
//try to sort as integer
int iNumber1 = int.Parse(strText1);
int iNumber2 = int.Parse(strText2);
if (bSortAscending)
{
return (iNumber1 - iNumber2);
}
else
{
return (iNumber2 - iNumber1);
}
}
catch (Exception ex)
{
//hide the exception
ex = ex;
}
//sort as string
if (bSortAscending)
{
return String.Compare(strText1, strText2);
}
else
{
return String.Compare(strText2, strText1);
}
}
Das funktioniert wunderbar, wenn die zu sortierende Spalte integer enthält, aber wenn eine Spalte mit Strings sortiert werden soll, ist es sau langsam!
Zuerst hatte ich den ganzen try-catch Teil für integer nicht drin, dann werden die Strings auch schnell sortiert, nur werden die Integer dann natürlich nicht richtig sortiert (d.h. nicht 1,2,3,10,100 sondern 1,10,100,2,3)
Ich mach doch hier nichts neues. Es muss doch einen performanten Weg für sowas geben, oder?
mfG
Elemental