Есть ли способ эмулировать синхронизацию для сетки в коде? - PullRequest
0 голосов
/ 28 марта 2019

Мне нужно выполнить действие с выбранной в данный момент строкой сетки. Я могу сделать это, импортировав экран в проект настройки, но это единственное изменение, необходимое для экрана. Желая оставить как можно больше Acumatica нетронутым, за исключением случаев, когда это абсолютно необходимо (для облегчения возможности обновления с помощью новых выпусков), я стараюсь не втягивать экран в проект настройки только для включения синхронизации в сетке.

Я создал расширение графика для INSiteMaint, чтобы добавить мою кнопку действия. Я попытался создать объект INLocation, а затем установить его в обработчике события Events.RowSelected. При нажатии моей кнопки действия объект, кажется, всегда является 1-й строкой сетки.

public class INSiteMaint_Extension : PXGraphExtension<INSiteMaint>
{
    INLocation location;

    public override void Initialize()
    {
        base.Initialize();
        Base.action.AddMenuAction(myAction);
    }

    protected void _(Events.RowSelected<INLocation> e)
    {
        INLocation row = e.Row;
        if (row?.LocationID != null)
        {
            location = row;
        }
    }


    #region Print Item Label
    public PXAction<INSite> myAction;
    [PXUIField(DisplayName = "My Action Label", MapEnableRights = PXCacheRights.Select)]
    [PXButton]
    protected virtual IEnumerable MyAction(PXAdapter adapter)
    {

        INSite site = Base.site.Current;
        if (location?.LocationID != null)
        {
        ...

Я также попытался создать представление INLocation для установки Current в обработчике события Events.RowSelected. Это не приводит к ошибкам компиляции, но при таком подходе экран не загружается полностью. Очевидно, что это небезопасный подход.

public class INSiteMaint_Extension : PXGraphExtension<INSiteMaint>
{
    public PXSelect<INLocation> loc;

    public override void Initialize()
    {
        base.Initialize();
        Base.action.AddMenuAction(myAction);
    }

    protected void _(Events.RowSelected<INLocation> e)
    {
        INLocation row = e.Row;
        if (row?.LocationID != null)
        {
            loc.Current = loc.Search<INLocation.locationID>(row.LocationID);
        }
    }


    #region Print Item Label
    public PXAction<INSite> myAction;
    [PXUIField(DisplayName = "My Action Label", MapEnableRights = PXCacheRights.Select)]
    [PXButton]
    protected virtual IEnumerable MyAction(PXAdapter adapter)
    {

        INSite site = Base.site.Current;
        INLocation location = loc.Current;

        if (location?.LocationID != null)
        {
        ...

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

1 Ответ

1 голос
/ 28 марта 2019

Мне пришлось инициировать обратный вызов, очень похожий на то, что вы пытаетесь сделать в другом проекте. Во-первых, в вашей сетке, в которой вы хотите синхронизировать положение, убедитесь, что вы установили SyncPosition = "true" в разделе px: PXGrid, а затем установите AutoCallback для назначения идентификаторов элементов управления, которые вы хотите перекрасить, чтобы они обновлялись. Вот фрагмент из моего кода:

<px:PXGrid ID="gridShipmentLines" runat="server" DataSourceID="ds" Width="100%" SkinID="Details" SyncPosition="true" Height="100%" Style="left: 0px; top: 0px">                
    <AutoCallBack Target="fvLineDetail" Command="Refresh" ActiveBehavior="true">
        <Behavior RepaintControls="None" RepaintControlsIDs="gridShipmentLines,fvShipmentLineDetail,fvInventoryItem" />
    </AutoCallBack>
    <Levels>
        <px:PXGridLevel DataMember="HistoryDocLines">

Я сделал быструю кнопку, чтобы нажать как тестовое действие, чтобы получить текущую HistoryDocLine для проверки получения обновленной строки:

public PXAction<CYHistoryDoc> GetLine;
[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "Get Line", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]        
protected virtual IEnumerable getLine(PXAdapter adapter)
{
    CYHistoryLine HL = HistoryDocLines.Current;            
    return adapter.Get();
}

Я поставил точку останова на последней строке функции и смог получить текущую выбранную HistoryLine. Посмотрим, поможет ли это.

...