2016-05-04 7 views
3

私が取り組んでいる現在のカスタマイズプロジェクトでは、レコードの並べ替え順序を使用してグリッドを表示/編集する必要があります。 「SortOrder」フィールドは、ユーザーがグリッド内の項目を並べ替えることができるように、上/下ボタンでのみ読み取られます。"SortOrder"フィールドと "Up"/"Down"ボタンを使用してグリッド内でレコードを上下に移動

DACの "SortOrder"列は単純なIntフィールドです。

グリッドのPXSelectステートメントは、OrderBy >>を使用してレコードを表示しています。

ASPXでグリッドが「真SyncPosition =」私はインクリメントアップ/ダウンボタンを追加しました

で定義されている/現在の選択したレコードのための「ソート順」値をデクリメント。

「Up」または「Down」を初めてクリックすると「SortOrder」フィールドは更新されますが、行は移動しません。 [保存]をクリックして更新を維持すると、グリッドは正しい順序で更新されます。

私はコードの残りの部分を見てきましたが、これが使用されている他のすべての状況は、グリッドではなくツリービューに対するものです。

アクションの最後にView.RequestRefresh()を追加しようとしましたが、これで並べ替えが発生しません。

グリッドにキャッシュ値からの現在の注文を更新し反映させるために移動するたびに、永続性がなくては何が最善の方法でしょうか?いつものように私は単純なものを見落としていると仮定しています。

アドバイスをいただければ幸いです。

答えて

3

一般的な問い合わせデザイナのソースコードを見てきました。グリッドにフィールドを並べ替える上/下ボタンがあります。ビューは、[並べ替え句がありません。

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

のOrderByをLineNbrフィールドがキーフィールドであるため、必要ありません - システムが自動的にキーフィールドでレコードを順序付けます。

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; } 

ボタンのコードは次のようになります。

 [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); 
     } 

SwapItems機能は、すべての移動アップ/の間で共有されているアクションを下に移動:

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); 
    } 

は最後に、ビットがありますASPXコード内のJavaScriptコードを使用することができます。機能を正しく動作させるには、それが欠けているかもしれません。私はそれが何をやっているのかはっきりしていませんが、エディタでSM208000.aspxを開き、commandResultを探すことをお勧めします。また、上/下をサポートするグリッドに定義されているCallbackCommandsもチェックしてください。

+1

ありがとうございます。最終的には、最初のビューで「Order By」を削除し、移動方法を上記のものに近づけるように更新しました。 javascriptメソッドは、移動後に選択された現在の行をそのまま維持するので、上/下をクリックし続けることができます。 –

+0

@JeffWilliamsはフォローアップのおかげで – Gabriel