如何清除智能面板对话框(PXFilter)的输入?

How do I clear the input of a Smart Panel dialog (PXFilter)?

我在自定义屏幕中创建了一个智能面板来请求用户输入,用于促进将库存从正常库存转移到隔离区域。我经常使用的原始智能面板示例是 SOOrderEntry 图中的 Copy Order (SO301000)。在这种情况下,我需要做一些验证,用户很可能会决定关闭智能面板并更新屏幕中的文档,然后再重新打开智能面板。如果用户点击取消按钮,我需要智能面板在每次打开时重置回默认设置。

我认为这可能会在 ASPX 屏幕定义中处理,但我找不到表单本身的正确设置。我在选择器上使用 AutoRefresh 以在每次打开它们时进行刷新,但我需要表单本身做同样的事情并在每次打开时刷新回默认值。当我导航到图表的主 DAC 的另一条记录时,所需的行为确实会自动发生,但我似乎无法强制智能面板在每次打开时自动刷新。我查看了 ASPX 中表单的各种选项,但如果有的话我就忽略了。

与 SOOrderEntry 上的 CopyOrder 类似,这是我的图表中的代码示例。

public PXFilter<StockParamFilter> stockparamfilter;

#region AddFromStock
public PXAction<MyTag> addFromStock;
[PXUIField(DisplayName = Messages.AddFromStock, MapEnableRights = PXCacheRights.Insert, MapViewRights = PXCacheRights.Insert)]
[PXButton]
protected virtual IEnumerable AddFromStock(PXAdapter adapter)
{
    MyTag tag = Tags.Current;

    if (tag?.TranRefNbr != null)
    {
        throw new PXException(Messages.TagAlreadyReceived);
    }

    MyTagEntry graph = PXGraph.CreateInstance<MyTagEntry>();

    WebDialogResult dialogResult = stockparamfilter.AskExt(setStockStateFilter, true);
    if (dialogResult == WebDialogResult.OK || (IsContractBasedAPI && dialogResult == WebDialogResult.Yes))
    {
        // My Business Logic Here
    }
    return adapter.Get();
}
#endregion

#region CheckStockParams (OK Button in Smart Panel)
public PXAction<MyTag> checkStockParams;
[PXUIField(DisplayName = "OK", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]
[PXLookupButton]
public virtual IEnumerable CheckStockParams(PXAdapter adapter)
{
    return adapter.Get();
}
#endregion

#region setStockStateFilter
private void setStockStateFilter(PXGraph aGraph, string ViewName)
{
    checkStockStateFilter();
}
#endregion

#region checkStockStateFilter
protected virtual void checkStockStateFilter()
{
    // My Business Logic Here to set bool enableStockParams = ???
    checkStockParams.SetEnabled(enableStockParams);
}
#endregion

这似乎是我过去做过的事情,但我似乎找不到代码。我认为这与 stockparamfilter 是 PXFilter 而不是 PXSelect(或 SelectFrom)有关。

我试过 stockparamfilter.ClearDialog() 但没有成功。我试过 stockparamfilter.RequestRefresh() 没有运气。我什至尝试了 stockparamfilter.DeleteCurrent() ,当我点击取消时它似乎有效,但是当我点击确定时我的代码没有执行。当我使用 stockparamfilter.Cache.SetDefaultExt(filter) 时,我似乎也得到了想要的结果;在每个领域,直到我点击 OK 什么也没做。就像每次我尝试操纵过滤器时,我都会打破智能面板,而不会在跟踪中出现任何错误。事实上,这是我尝试失败的列表:

StockParamFilter filter = stockparamfilter.Current;
stockparamfilter.View.Clear();
stockparamfilter.View.RequestRefresh();

stockparamfilter.Cache.Clear();
stockparamfilter.View.RequestRefresh();
stockparamfilter.View.RequestFiltersReset();
stockparamfilter.DeleteCurrent();

stockparamfilter.ClearDialog();

stockparamfilter.Cache.SetDefaultExt<StockParamFilter.locationID>(filter);
stockparamfilter.Cache.SetDefaultExt<StockParamFilter.toLocationID>(filter);
stockparamfilter.Cache.SetDefaultExt<StockParamFilter.qty>(filter);
stockparamfilter.Cache.SetDefaultExt<StockParamFilter.lotSerialNbr>(filter);
stockparamfilter.Cache.SetDefaultExt<StockParamFilter.origRefNbr>(filter);

可让我将智能面板重置为默认值的 ASPX 代码或 C# 代码是什么?

非常感谢 Acumatica 的 Hughes Beausejour 提供的离线协助。为可能遇到此问题的其他人发布解决方案。

首先,了解 AskExt 生成 2 遍代码很重要。第一关提示智能面板。响应智能面板后,代码再次执行,但在第二个上下文中跳过询问。考虑到这一点,正如 Hughes 向我解释的那样,我的代码无法正常工作的原因变得清晰了。

要在表单初始化时执行代码,该代码必须在询问发生之前执行。否则,表单已呈现,然后初始化代码执行得太晚了。此外,必须对其进行调节,使其仅在用户未对智能面板做出 OK 响应时触发。 (没有意识到代码执行了两次,我没有意识到我在两次过程中都重置了字段。当我可以重置表单时,后续处理将失败,因为我也在该过程中重置了它.) 在该代码之后,AskExt 可用于呈现表单以及用户响应的正常处理。

我的代码如下所示:

StockParamFilter filter = stockparamfilter.Current;

// If the user response is anything except an affirmative, default the fields
if (!(stockparamfilter.View.Answer == WebDialogResult.OK || (IsContractBasedAPI && stockparamfilter.View.Answer == WebDialogResult.Yes)))
{
    stockparamfilter.Cache.SetDefaultExt<StockParamFilter.locationID>(filter);
    stockparamfilter.Cache.SetDefaultExt<StockParamFilter.toLocationID>(filter);
    stockparamfilter.Cache.SetDefaultExt<StockParamFilter.qty>(filter);
    stockparamfilter.Cache.SetDefaultExt<StockParamFilter.lotSerialNbr>(filter);
    stockparamfilter.Cache.SetDefaultExt<StockParamFilter.origRefNbr>(filter);
}

// Present the Smart Panel Dialog (happens only on the 1st pass - AskExt causes the code to execute twice)
WebDialogResult dialogResult = stockparamfilter.AskExt(setStockStateFilter, true);

// If the response was affirmative, execute the business logic
if (dialogResult == WebDialogResult.OK || (IsContractBasedAPI && dialogResult == WebDialogResult.Yes))
{
    // Do Business Logic Based On User Response In Smart Panel
}