首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何强制用户输入在执行操作时自动提交和保存?

如何强制用户输入在执行操作时自动提交和保存?
EN

Stack Overflow用户
提问于 2021-03-02 18:47:11
回答 2查看 309关注 0票数 1

我有一个自定义图,在本例中称为MyGraph。该页包含一个表单选项卡,其方式类似于已存储的项页,其中标头是我的DAC (MyDAC)的几个字段,而第一个选项卡上的表单是我的附加字段的形式。为了便于讨论,这些观点是MyView和MyCurrentView。

在“已存储的项”页面上,我可以在ItemSettings视图(“常规设置”选项卡)中设置一个值,然后执行一个操作,该操作也恰好保存我的用户输入。在我的自定义页面中,当我执行一个操作时,类似的"MyCurrentView“选项卡的用户输入会丢失。我已经为T230的行动再次复习了培训材料,但我似乎无法克服这个问题。下面的代码示例展示了我如何执行操作"ConvertIt“的两个简化方法。在调试期间,myDAC和myDAC2都包含陈旧的数据,这表明在Button属性和DataSource回调命令中,每个CommitChanges都没有按预期更新视图。未保存的用户输入是通过仅在MyCurrentView中显示给UI的字段输入的。

T230培训指南指出,我应该在操作栏中设置AutoCallBack行为,这对于网格来说似乎是可能的,但对于表单则不可能。培训指南的例子是:

代码语言:javascript
复制
<ActionBar>
    <CustomItems>
        <px:PXToolBarButton Text="Complete">
            <AutoCallBack Command="Complete" Target="ds">
                <Behavior CommitChanges="True" ></Behavior>
            </AutoCallBack>
        </px:PXToolBarButton>
    </CustomItems>
</ActionBar>

由于我通过action.AddMenuAction(ConvertIt)将操作挂在“操作”菜单上;因此,我似乎没有一种方法来指定培训指南中描述的行为。

定义的视图

代码语言:javascript
复制
public PXSelect<MyDAC> MyView;
public PXSelect<MyDAC, Where<MyDAC.tagID, Equal<Current<MyDAC.tagID>>>> MyCurrentView;

定义的行动-方法1

代码语言:javascript
复制
#region convertIt Action
public PXAction<MyDAC> convertIt;
[PXUIField(DisplayName = "My DAC Label", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Select)]
[PXButton(CommitChanges = true)]
public virtual void ConvertIt()
{

    this.Save.Press();   // Seems to make no difference in saving the unsaved user entry

    MyDAC myDAC = MyView.Current;
    MyDAC myDAC2 = MyCurrentView.Current;

    ** DO THE WORK OF THE ACTION HERE **

}
#endregion

定义的行动-方法2

代码语言:javascript
复制
#region convertIt Action
public PXAction<MyDAC> convertIt;
[PXUIField(DisplayName = "My DAC Label", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Select)]
[PXButton(CommitChanges = true)]
public virtual IEnumerable ConvertIt(PXAdapter adapter)
{

    MyDAC myDAC = MyView.Current;
    MyDAC myDAC2 = MyCurrentView.Current;

    ** DO THE WORK OF THE ACTION HERE **

    return adapter.Get();
}
#endregion

ASPX数据资源定义

代码语言:javascript
复制
<px:PXDataSource ID="ds" runat="server" Visible="True" Width="100%"
    TypeName="MyGraph"
    PrimaryView="MyView">
    <CallbackCommands>
        <px:PXDSCallbackCommand CommitChanges="True" Name="ConvertIt" ></px:PXDSCallbackCommand>
    </CallbackCommands>
</px:PXDataSource>

简而言之,当我完成操作时,用户输入就会丢失。我尝试在我的操作开始时包括this.Save.Press(),但是我已经在操作结束时保存了。无论如何,Debug不会在视图中显示我的用户输入的值,尽管我期望在执行操作之前,在按钮和数据源上提交这些更改。

在阻止应用UI更新的C#代码或ASPX页面定义中,我遗漏了什么?有趣的是,MyView视图中的UI更改是应用的,而不是MyCurrentView中的更改,除非我在从菜单中选择操作之前手动按下保存按钮。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-04 15:39:55

我最近也遇到了这个问题。在从操作中打开智能面板时,很容易强迫页面回发到服务器,但是如果没有面板打开,如何强制在不提交更新的字段中更改数据的发布?我发现实现这一目标的唯一方法是编辑ASPX并将StartNewGroup="true“和CommitChanges="true”添加到添加操作的操作文件夹的PXDSCallbackCommand中。

代码语言:javascript
复制
<px:PXDataSource ID="ds" runat="server" Visible="True" Width="100%"
    TypeName="MyGraph"
    PrimaryView="MyView">
    <CallbackCommands>
        <px:PXDSCallbackCommand CommitChanges="True" Name="ActionFolder" StartNewGroup="True" />
    </CallbackCommands>
</px:PXDataSource>

对于操作,您应该使用第二种方法。

代码语言:javascript
复制
public PXAction<MyDAC> convertIt;
[PXUIField(DisplayName = "My DAC Label", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Select)]
[PXButton(CommitChanges = true)]
public virtual IEnumerable ConvertIt(PXAdapter adapter)
{
    MyDAC myDAC = MyView.Current;
    MyDAC myDAC2 = MyCurrentView.Current;

    **DO THE WORK OF THE ACTION HERE **
        
    return adapter.Get();
}

public MyGraph()
{
    actionFolder.AddMenuAction(convertIt);
}
票数 2
EN

Stack Overflow用户

发布于 2021-03-23 15:24:23

无法保存聚焦字段值。值在控件失去焦点时保存。但是,当焦点从未提交字段转移到操作按钮(用户单击)时,当前字段值将丢失。这里不确定这是问题所在,但请记住,在单击操作按钮之前,用户必须从未提交值的控件编辑器中签出,否则该值将丢失。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66445343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档