2016-05-04 2 views
3

Текущий проект настройки, над которым я работаю, требует отображения/редактирования сетки с «порядком сортировки» для записей. Поле «SortOrder» считывается только с помощью кнопок «вверх/вниз», чтобы пользователь мог повторно заказать элементы в сетке.Перемещение записей вверх/вниз в сетке с полем «SortOrder» и кнопками «Вверх»/«Вниз»

Столбец «SortOrder» в ЦАП является простым полем Int.

Оператор PXSelect для сетки использует OrderBy >> для отображения записей.

Сетка в ASPX является определяется с «SyncPosition = True»

Я добавил кнопку вверх/вниз, который увеличивает/уменьшает значение «SortOrder» для текущей выбранной записи.

Проблема, с которой я сталкиваюсь, заключается в том, что при первом нажатии «Вверх» или «Вниз» поле «SortOrder» обновляется, однако строки не перемещаются. Как только я нажму «Сохранить», чтобы сохранить обновление, сетка затем обновится с правильным порядком.

Я просмотрел остальную часть кода, но все другие ситуации, когда это используется, предназначены для древовидных представлений, а не для сеток.

Я попытался добавить View.RequestRefresh() в конце моего действия, но это не вызывает переупорядочения.

Что было бы лучшим способом без Персиста после каждого перехода, чтобы получить сетку, чтобы обновить и отобразить текущий порядок из значений кеша? Как обычно, я предполагаю, что я пропускаю что-то простое.

Любые советы будут оценены.

ответ

3

Я посмотрел на общий исходный код конструктора запросов - он имеет кнопку вверх/вниз в сетке для изменения порядка полей. Представления не имеет пункта 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); 
    } 

Наконец, есть немного кода JavaScript в коде ASPX - это может быть или не быть тем, что вам не хватает, чтобы функция работала правильно; я не совсем уверен, что он делает, но будет поощрять вас открывать SM208000.aspx в редакторе и искать commandResult. Также проверьте CallbackCommands, которые определены на сетках, которые поддерживают вверх/вниз - возможно, что-то с этим связано.

+1

Благодарим за указатель. В итоге он удалил «Order By» в начальном виде и обновил методы перемещения, чтобы быть более симулятивными к приведенным выше. Методы javascript просто удерживают текущую строку после перемещения, поэтому вы можете продолжать нажимать вверх/вниз –

+0

@JeffWilliams благодарит за продолжение – Gabriel

Смежные вопросы