2016-05-04 3 views
3

Das aktuelle Anpassungsprojekt, an dem ich arbeite, hat die Anforderung, ein Raster mit einer "Sortierreihenfolge" für Datensätze anzuzeigen/zu bearbeiten. Das Feld "SortOrder" kann nur mit den Schaltflächen "Nach oben/Nach unten" gelesen werden, damit der Benutzer die Elemente im Raster neu ordnen kann.Verschieben Sie Datensätze im Raster mit "SortOrder" -Feld und "Up"/"Down" -Buttons

Die Spalte "SortOrder" im DAC ist ein einfaches Int-Feld.

Die PXSelect-Anweisung für das Raster verwendet eine OrderBy >>, um die Datensätze anzuzeigen.

Das Gitter in der ASPX ist eine Up/Down-Taste, die erhöht/verringert den „SortOrder“ Wert für den aktuellen ausgewählten Datensatz eines definiert mit „syncPosition = true“

Ich habe hinzugefügt.

Das Problem, auf das ich gestoßen bin, ist, dass beim ersten Klicken auf "Up" oder "Down" das Feld "SortOrder" aktualisiert wird, die Zeilen jedoch nicht verschoben werden. Sobald ich auf Speichern klicke, um das Update zu speichern, wird das Raster mit der richtigen Reihenfolge aktualisiert.

Ich habe den Rest des Codes durchgesehen, aber alle anderen Situationen, in denen dies verwendet wird, sind für Baumansichten, nicht für Gitter.

Ich habe versucht, eine View.RequestRefresh() am Ende meiner Aktion hinzufügen, aber dies verursacht nicht die Neuordnung.

Was wäre der beste Weg ohne Persist nach jedem Zug, um das Grid zu aktualisieren und die aktuelle Reihenfolge aus den Cache-Werten widerzuspiegeln? Wie immer nehme ich an, ich übersehe etwas Einfaches.

Jeder Rat würde geschätzt werden.

Antwort

3

Ich habe mir den Quelltext des generischen Anfrage-Designers angeschaut - er hat einen Auf/Ab-Knopf im Gitter, um die Felder neu zu ordnen. Die Ansichten haben keine OrderBy-Klausel:

public PXSelect<GIFilter, Where<GIFilter.designID, Equal<Current<GIDesign.designID>>>> Parameters; 

SortiertNach nicht notwendig ist, weil das Zeilennr Feld ein Schlüsselfeld - System ordnet automatisch die Datensätze von den Schlüsselfeldern.

public abstract class lineNbr : IBqlField { } 
    [PXDBInt(IsKey = true)] 
    [PXDefault] 
    [PXLineNbr(typeof(GIDesign))] 
    [PXParent(typeof(Select<GIDesign, 
     Where<GIDesign.designID, Equal<Current<GIFilter.designID>>>>))] 
    public virtual int? LineNbr { get; set; } 

Der Code für die Schaltfläche wie folgt aussieht:

 [PXButton(ImageKey = Sprite.Main.ArrowUp, Tooltip = ActionsMessages.ttipRowUp)] 
     [PXUIField(DisplayName = ActionsMessages.RowUp, MapEnableRights = PXCacheRights.Update)] 
     protected void moveUpFilter() 
     { 
      if (this.Parameters.Current == null) 
       return; 
      GIFilter prev = PXSelect<GIFilter, Where<GIFilter.designID, Equal<Current<GIDesign.designID>>, And<GIFilter.lineNbr, Less<Current<GIFilter.lineNbr>>>>, OrderBy<Desc<GIFilter.lineNbr>>>.Select(this); 
      if (prev != null) 
       this.SwapItems(this.Parameters.Cache, prev, this.Parameters.Current); 
     } 
     [PXButton(ImageKey = Sprite.Main.ArrowDown, Tooltip = ActionsMessages.ttipRowDown)] 
     [PXUIField(DisplayName = ActionsMessages.RowDown, MapEnableRights = PXCacheRights.Update)] 
     protected void moveDownFilter() 
     { 
      if (this.Parameters.Current == null) 
       return; 
      GIFilter next = PXSelect<GIFilter, Where<GIFilter.designID, Equal<Current<GIDesign.designID>>, And<GIFilter.lineNbr, Greater<Current<GIFilter.lineNbr>>>>, OrderBy<Asc<GIFilter.lineNbr>>>.Select(this); 
      if (next != null) 
       this.SwapItems(this.Parameters.Cache, next, this.Parameters.Current); 
     } 

Die SwapItems Funktion Aktionen zwischen allen Bewegung geteilt nach oben/nach unten bewegen:

private void SwapItems(PXCache cache, object first, object second) 
    { 
     object temp = cache.CreateCopy(first); 
     foreach (Type field in cache.BqlFields) 
      if (!cache.BqlKeys.Contains(field)) 
       cache.SetValue(first, field.Name, cache.GetValue(second, field.Name)); 
     foreach (Type field in cache.BqlFields) 
      if (!cache.BqlKeys.Contains(field)) 
       cache.SetValue(second, field.Name, cache.GetValue(temp, field.Name)); 
     cache.Update(first); 
     cache.Update(second); 
    } 

Schließlich gibt es ein bisschen JavaScript-Code im ASPX-Code - möglicherweise ist es das, was Ihnen fehlt, damit die Funktion ordnungsgemäß funktioniert. Ich bin nicht genau sicher, was es tut, aber würde Sie ermutigen, SM208000.aspx in einem Editor zu öffnen und nach commandResult suchen. Sehen Sie sich auch die Callback-Befehle an, die in den Grids definiert sind, die Up/Down unterstützen - das kann etwas damit zu tun haben.

+1

Vielen Dank für den Zeiger. Am Ende wurde die "Order By" in der ersten Ansicht entfernt und die Move-Methoden wurden aktualisiert, um den obigen zu entsprechen. Die JavaScript-Methoden behalten einfach die aktuelle Zeile, die nach dem Verschieben ausgewählt wurde, so dass Sie weiter auf/ab klicken können –

+0

@JeffWilliams danke für die Weiterverfolgung – Gabriel

Verwandte Themen