2017-12-13 5 views
0

Schnelles Problem Sortierung:Tabelle nicht richtig in bestimmten Spalte (MVC)

Ich habe einige verwendet Javascript finde ich meine Tabellen all ihren Kopf klicken, um zu sortieren, und dies in den meisten Fällen absolut einwandfrei funktioniert. Strings, Ints, usw. werden bei richtiger Kennzeichnung auf der ganzen Seite korrekt sortiert.

  function sortTable(n) { 

     var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0; //declares necessary variables 

     table = document.getElementById("toSortTable"); 

     switching = true; 

     dir = "asc"; 

     while (switching) { 

      switching = false; 
      rows = table.getElementsByTagName("tr"); 

      for (i = 1; i < (rows.length - 1) ; i++) { 

       shouldSwitch = false; 

       x = rows[i].getElementsByTagName("td")[n]; 
       y = rows[i + 1].getElementsByTagName("td")[n]; 

       if (dir == "asc") { 

        if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) { //compares the 2 values 
         shouldSwitch = true;/
         break; 
        } 

       } else if (dir == "desc") { 
        if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) { 
         shouldSwitch = true; 
         break; 
        } 
       } 
      } 
      if (shouldSwitch) { 
       rows[i].parentNode.insertBefore(rows[i + 1], rows[i]); 
       switching = true; 
       switchcount++; 
      } else { 
       if (switchcount == 0 && dir == "asc") { 
        dir = "desc"; 
        switching = true; 
       } 
      } 
     } 
    } 

Wie gesagt, diese JS auf den meisten Seiten zu funktionieren scheint i zuweisen, aber es gibt mir ein paar Probleme in einer Tabelle. Auf einem meiner Tische liefert die Sortierung einfach nicht die richtige Reihenfolge.

https://imgur.com/a/7EZ5y (weiß nicht, wie diese einzubetten)

Die Tabelle angeklickt wurde (das heißt sortiert) in beiden Bildern von insgesamt Abrechnungskosten. Ich habe gelesen, dass eine verpatzte Sortierung auftreten kann, wenn einer der Werte einen Leerraum enthält, also wird das Feld als Zeichenkette anstelle von dec/int erkannt, aber das war in der DB nicht der Fall, ebenso wie der seltsame Eintrag, der in der Mitte und nicht vor/nach dem Rest der Ints/Dez.

Das einzige, was ich zu sein off vorstellen kann, ist mein Controller, dass meine auffüllt VM:

  public ActionResult Index() 
    { 
     List<InvoiceVM> listOfInvoices = new List<InvoiceVM>(); 
     var iNVOICES = db.INVOICES.Include(i => i.INVOICES_TO_CREDIT); 



     foreach (var entry in iNVOICES) 
     { 
      bool check = false; 
      foreach (var checkDupe in listOfInvoices) 
      { 
       if (checkDupe.invoiceNo == entry.INV_NO) 
       { 
        check = true; 
       } 
      } 
      if (check == true) 
      { 
       check = false; 
      } 
      else 
      { 
       InvoiceVM toAdd = new InvoiceVM(); 
       toAdd.account = entry.ACCOUNT; 
       toAdd.subDate = entry.SUB_DATE; 
       toAdd.cc = entry.CC; 
       toAdd.reference = entry.SOLUTION_OWNER; 
       toAdd.invoiceNo = entry.INV_NO; 
       toAdd.project = entry.PROJECT_ID; 
       toAdd.ikeaProject = entry.SLTN_NAME; 
       toAdd.invoiceNo = entry.INV_NO; 
       toAdd.autoNo = Convert.ToInt32(entry.AUTO_ID); 

       foreach (var invoice in iNVOICES) 
       { 
        if (invoice.INV_NO == toAdd.invoiceNo) 
        { 
         toAdd.totalCost += Convert.ToInt32(invoice.EMP_TOTAL_COST); 
        } 
       } 

       listOfInvoices.Add(toAdd); 

      } 

     } 
     return View(listOfInvoices); 

    } 

(Ich weiß, das wahrscheinlich über einige super einfach GroupBy + Summe gelöst werden könnte diesen Code machen sehen super Müll, glücklich diesen Vorschlag zu nehmen, wenn jemand es aufstellen möchte).

Wie auch immer, das wird korrekt ausgefüllt, da die in den obigen Bildern angezeigten Werte die richtigen Summen von Werten in der tatsächlichen Rechnungstabelle sind. Außerdem sind die einzelnen Werte auf den "Gesamtkosten" für die 42k höher als die 11k (falls die Sortierung einen ursprünglichen Wert anstelle des summierten Werts verwendet hat). Beide Werte wurden im Controller durch andere Werte kombiniert. Dies ist jedoch nicht relevant, sobald die Werte an eine VM übergeben wurden.

Ich würde nach mehr Antworten darauf suchen, und ich bin mir sicher, dass der Fehler irgendwo in meinem Controller ist, aber ich habe einfach keine Ahnung, wonach ich suchen soll. Die Sortierung funktioniert perfekt in allen anderen Tabellen und funktioniert auch perfekt in der Tabelle auf derselben Seite für alle Spalten außer der Gesamtkosten. Jede Hilfe wäre willkommen.

Vielen Dank!

Antwort

0

Sind Sie absolut sicher, dass dieses Skript die numerischen Werte korrekt in anderen Tabellen sortiert? Sie haben das erwähnt, solange alles richtig "markiert" ist, aber was bedeutet das? Können Sie irgendwie angeben, dass bestimmte Tabellen-Datenzellen nur Zahlen sind?

Da etwas in Controller falsch ist, bezweifle ich, dass das hier der Fall ist. Der Controller füttert die Ansicht mit den Daten, aber die Sortierung ist ausschließlich auf das Javascript zurückzuführen.

Es ist natürlich möglich, die Sortierung in der Steuerung zu tun, können Sie ein Beispiel here ansehen.

zur Sache jetzt aber hier Ihr Skript ruft die Werte aus dem angegebenen Tabellenzellen:

x = rows[i].getElementsByTagName("td")[n]; 
y = rows[i + 1].getElementsByTagName("td")[n]; 

und hier ist einer der Vergleiche:

x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase() 

Ich glaube nicht das Abrufen innerHTML und ändern es in Kleinbuchstaben ist in der Lage, einen Unterschied zwischen einer Zahl und einer Zeichenfolge zu unterscheiden.Ich könnte mich irren, aber ich habe ein paar einfache Tests gemacht und es hat gut mit der alphabetischen Sortierung zurechtgekommen. Bei Zahlen ist es jedoch beispielsweise 1002, kleiner als 14 zu sein.

Sie könnten versuchen, weitere bedingte Prüfungen hinzuzufügen, wenn die x- und y-Variablen numbers or strings sind, speichern Sie sie dann in neue numerische Variablen und führen Sie dann die Sortierung durch.

Oder Sie können alternative Sortierlösung versuchen: DataTables. Es ist ziemlich geschickt ein Paket, obwohl jQuery basiert. (in keiner Weise mit ihnen verbunden, ich nur es selbst).

+0

Sie scheinen absolut richtig zu sein, dass die JS es niemals schafft, Zahlen richtig zu sortieren, aber es gelang, die wenigen Einträge, die wir ausprobierten, auszumachen. Hoppla! Ich suchte das DataTables-Paket auf und es enthielt eine Menge Funktionen, die ich sowieso auf der ganzen Linie brauchen würde. Nach ein paar Höhen und Tiefen wegen schäbiger Manuals habe ich es geschafft, es perfekt funktionieren zu lassen. Vielen Dank! –

Verwandte Themen