23. december 2006 - 11:26Der 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)
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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; }
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...
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.
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.