使用 "SortOrder" 字段和 "Up"/"Down" 按钮在网格中移动记录 up/down
Move records up/down in grid with "SortOrder" field and "Up"/"Down" buttons
我正在处理的当前自定义项目需要显示/编辑带有 "Sort Order" 记录的网格。 "SortOrder" 字段是只读的,带有 up/down 按钮以允许用户重新排序网格中的项目。
DAC中的"SortOrder"列是一个简单的Int字段。
网格的 PXSelect 语句使用 OrderBy>> 来显示记录。
ASPX 中的网格是用 "SyncPosition= true"
定义的
我添加了一个 Up/Down 按钮,该按钮 increments/decrements 当前选定记录的 "SortOrder" 值。
我 运行 遇到的问题是,第一次单击 "Up" 或 "Down" 时,"SortOrder" 字段会更新,但行不会移动。单击“保存”以保留更新后,网格将以正确的顺序刷新。
我已经查看了其余代码,但所有其他使用它的情况都是针对树视图,而不是网格。
我试过在我的操作末尾添加 View.RequestRefresh() 但这不会导致重新排序。
在每次移动后没有 Persist 的情况下,让网格更新并反映缓存值中的当前顺序的最佳方法是什么?像往常一样,我假设我忽略了一些简单的事情。
如有任何建议,我们将不胜感激。
我查看了通用查询设计器源代码 - 它在网格中有一个 up/down 按钮来重新排列字段。视图没有 OrderBy 子句:
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
。还要检查在支持 up/down 的网格上定义的 CallbackCommands - 它可能与它有关。
我正在处理的当前自定义项目需要显示/编辑带有 "Sort Order" 记录的网格。 "SortOrder" 字段是只读的,带有 up/down 按钮以允许用户重新排序网格中的项目。
DAC中的"SortOrder"列是一个简单的Int字段。
网格的 PXSelect 语句使用 OrderBy>> 来显示记录。
ASPX 中的网格是用 "SyncPosition= true"
定义的我添加了一个 Up/Down 按钮,该按钮 increments/decrements 当前选定记录的 "SortOrder" 值。
我 运行 遇到的问题是,第一次单击 "Up" 或 "Down" 时,"SortOrder" 字段会更新,但行不会移动。单击“保存”以保留更新后,网格将以正确的顺序刷新。
我已经查看了其余代码,但所有其他使用它的情况都是针对树视图,而不是网格。
我试过在我的操作末尾添加 View.RequestRefresh() 但这不会导致重新排序。
在每次移动后没有 Persist 的情况下,让网格更新并反映缓存值中的当前顺序的最佳方法是什么?像往常一样,我假设我忽略了一些简单的事情。
如有任何建议,我们将不胜感激。
我查看了通用查询设计器源代码 - 它在网格中有一个 up/down 按钮来重新排列字段。视图没有 OrderBy 子句:
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
。还要检查在支持 up/down 的网格上定义的 CallbackCommands - 它可能与它有关。