Avatar billede majbom Novice
23. december 2006 - 11:26 Der er 10 kommentarer og
2 løsninger

Sortering af ListView

hejsa

efter megen søgen på nettet, har jeg endelig fundet ud af hvordan man kan sortere sit listview på alle kolonner. koden jeg har fundet ser således ud:

class ListViewItemComparer : IComparer
{
private int col;
private string sO;

public ListViewItemComparer()
{
  col = 0;  // Use as default column
  sO = "desc";
}
public ListViewItemComparer(int column)
{
  col = column;
  sO = "desc";
}
public ListViewItemComparer(int column, string sortOrder)
{
  col = column;
  sO = sortOrder;
}
// Implement IComparer.Compare method
public int Compare(object x, object y)
{
  string xText = ((ListViewItem)x).SubItems[col].ToString();
  string yText = ((ListViewItem)y).SubItems[col].ToString();
  if (sO == "desc")
  {
  return String.Compare(xText, yText);
  }
  else
  {
  return String.Compare(yText, xText);
  }
}
}

dog har jeg modificeret den lidt, så den kan sortere både stigende og faldende...

det virker som det skal, så længe jeg sorterer en kolonne med tekst, men hvis det er en kolonne med tal driller det lidt:

hvis jeg f.eks vil sortere en kolonne med tallene 1-20, kommer den til at være i følgende rækkefølge:
1,10,11,12,13,14,15,16,17,18,19,2,20,3,4,5,6,7,8,9

jeg kan så regne ud at den af en eller anden grund mener at 2 er større end 19, men mindre end 20, er har det noget med længden at gøre? årstal kan den godt finde ud af (men de er jo også lige lange)

håber der er nogle der kan hjælpe...

på forhånd tak og GO' JUL! :)
Avatar billede windcape Praktikant
23. december 2006 - 12:18 #1
Uden at kunne fortælle hvordan du skal kode det, kan jeg fortælle at løsning er at bruge en såkaldt "natural sort" :-)
Avatar billede majbom Novice
23. december 2006 - 12:34 #2
hehe okay.. prøver at se om jeg kan finde ud af noget omkring natural sort så :)
Avatar billede windcape Praktikant
23. december 2006 - 12:36 #3
Avatar billede majbom Novice
23. december 2006 - 12:47 #4
tak, det kigger jeg på :)
Avatar billede majbom Novice
24. december 2006 - 10:33 #5
jeg kan ikke bruge det, da StringLogicalComparer ikke findes...
ellers et godt bud.

har søgt som en tosset efter noget numeric compare, men enten så er det med den "StringLogicalComparer" eller noget andet som er fra .NET 1.0

andre der har forslag? :)
Avatar billede windcape Praktikant
24. december 2006 - 13:27 #6
hmf.. har kigget lidt på det. Det kunne godt se ud somon at du bliver nød til at skrive din egen natsort.

Her er en fra Javascript, kan være du kan skrive en kopi i C# :-)

function natcompare(a,b) {
  var ia = 0, ib = 0;
    var nza = 0, nzb = 0;
    var ca, cb;
    var result;

    while (true)
    {
        // only count the number of zeroes leading the last number compared
        nza = nzb = 0;

        ca = a.charAt(ia);
        cb = b.charAt(ib);

        // skip over leading spaces or zeros
        while ( isWhitespaceChar( ca ) || ca =='0' ) {
            if (ca == '0') {
                nza++;
            } else {
                // only count consecutive zeroes
                nza = 0;
            }

            ca = a.charAt(++ia);
        }

        while ( isWhitespaceChar( cb ) || cb == '0') {
            if (cb == '0') {
                nzb++;
            } else {
                // only count consecutive zeroes
                nzb = 0;
            }

            cb = b.charAt(++ib);
        }

        // process run of digits
        if (isDigitChar(ca) && isDigitChar(cb)) {
            if ((result = compareRight(a.substring(ia), b.substring(ib))) != 0) {
                return result;
            }
        }

        if (ca == 0 && cb == 0) {
            // The strings compare the same.  Perhaps the caller
            // will want to call strcmp to break the tie.
            return nza - nzb;
        }

        if (ca < cb) {
            return -1;
        } else if (ca > cb) {
            return +1;
        }

        ++ia; ++ib;
    }
}
Avatar billede windcape Praktikant
24. december 2006 - 13:28 #7
ups, glemte de andre funktioner , du kan se hele scriptet her: http://sourcefrog.net/projects/natsort/natcompare.js
Avatar billede majbom Novice
28. december 2006 - 10:44 #8
hmm det er da vildt at der ikke findes det i .NET 2.0! :0

men det bliver for omfattende hvis jeg skal skrive det hele selv, så vigtigt er det heller ikke...

men mange tak for hjælpen windcape, smid et svar :)
Avatar billede majbom Novice
28. december 2006 - 13:22 #9
kom da lige til at tænke på at man kunne tjekke om værdien var numerisk og så ganske simpelt se hvilken der var højest, så det blev denne løsning:

public int Compare(object x, object y)
{
string xText = ((ListViewItem)x).SubItems[col].Text.ToString();
string yText = ((ListViewItem)y).SubItems[col].Text.ToString();
         
if (IsNumeric(xText) == true)
{
  if (sO == "desc")
  {
  if (Convert.ToInt32(xText) < Convert.ToInt32(yText))
  {
    return -1;
  }
  else
  {
    return 1;
  }
  }
  else
  {
  if (Convert.ToInt32(xText) > Convert.ToInt32(yText))
  {
    return -1;
  }
  else
  {
    return 1;
  }
  }
}
else
{
  if (sO == "desc")
  {
  return String.Compare(xText, yText);
  }
  else
  {
  return String.Compare(yText, xText);
  }
}
}

private bool IsNumeric(string value)
{
try
{
  Double TempDouble = Double.Parse(value);
  return true;
}
catch
{
  return false;
}
}

så sorterer den rigtigt hvis feltet er numerisk :)
Avatar billede majbom Novice
28. december 2006 - 14:16 #10
hmm, det gjorde så at den blev meget langsom til at sortere, når det IKKE var numeriske værdier...

så jeg har lavet det så jeg tjekker navnet på headeren, der bliver trykket på, og så alt efter hvad det er sender jeg en boolean med der foræller comparemetoden om den skal køre numerisk eller almindeligt...
Avatar billede windcape Praktikant
28. december 2006 - 22:46 #11
Her er et svar , siden du nu beder om det ;-) Ved dog ikke om jeg har gjort mig fortjent til det, men jeg vil ihvertfald forsøge at poste en løsning hvis jeg falder over en.

Og godt nytår <:o)-
Avatar billede majbom Novice
29. december 2006 - 00:43 #12
du har fortjent lidt af dem :)

godt nytår
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester