You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Microsoft Business Central AL中实现页面字段的条件隐藏

问题

需求:当“Reason”字段的值为“Other”时,隐藏“Other Reason”字段。

初始页面扩展代码:

pageextension 50101 CJ_PurchaseReturnOrder extends "Purchase Return Order"
{
    layout
    {
        addlast(General)
        {
            field("TO Code"; Rec."TO Code")
            {
                ApplicationArea = all;
                TableRelation = "Transfer Header";
            }
            field("Item Journal Code"; Rec."Item Journal Code")
            {
                ApplicationArea = all;
                TableRelation = "Item Journal Line";
            }
            field("Reason"; Rec.Reason)
            {
                ApplicationArea = all;
            }
            field("Other Reason"; Rec."Other Reason")
            {
                ApplicationArea = all;
            }
        }
    }
}

尝试的代码(未达到隐藏效果):

pageextension 50101 CJ_PurchaseReturnOrder extends "Purchase Return Order"
{
    layout
    {
        addlast(General)
        {
            field("TO Code"; Rec."TO Code")
            {
                ApplicationArea = all;
                TableRelation = "Transfer Header";
            }
            field("Item Journal Code"; Rec."Item Journal Code")
            {
                ApplicationArea = all;
                TableRelation = "Item Journal Line";
            }
            field("Reason"; Rec.Reason)
            {
                ApplicationArea = all;
            }
            field("Other Reason"; Rec."Other Reason")
            {
                ApplicationArea = all;
                Enabled = EnableToCode;
            }
        }
    }
    var
        EnableToCode: Boolean;

    trigger OnAfterGetRecord()
    begin
        if Rec.Reason = Rec.Reason::Other then
            EnableToCode := true
        else
            EnableToCode := false;
    end;
}

期望效果:当前记录的“Reason”字段值为Rec.Reason::Other时隐藏“Other Reason”字段,请问问题出在哪里?


问题分析与修正方案

你存在三个关键错误:

  • 属性使用错误:你设置的Enabled属性仅控制字段是否可编辑,而非是否显示。要实现隐藏效果,需要使用Visible属性。
  • 逻辑判断颠倒:需求是Reason为Other时隐藏Other Reason,因此Visible的取值逻辑应为:当Reason不等于Other时为true,等于Other时为false,你的代码逻辑完全相反。
  • 缺少实时触发机制:仅在OnAfterGetRecord中更新状态,无法响应用户手动修改Reason字段的操作,需要给Reason字段添加OnValidate触发器来实时更新显示状态。

修正后的代码:

pageextension 50101 CJ_PurchaseReturnOrder extends "Purchase Return Order"
{
    layout
    {
        addlast(General)
        {
            field("TO Code"; Rec."TO Code")
            {
                ApplicationArea = all;
                TableRelation = "Transfer Header";
            }
            field("Item Journal Code"; Rec."Item Journal Code")
            {
                ApplicationArea = all;
                TableRelation = "Item Journal Line";
            }
            field("Reason"; Rec.Reason)
            {
                ApplicationArea = all;
                trigger OnValidate()
                begin
                    UpdateOtherReasonVisibility();
                end;
            }
            field("Other Reason"; Rec."Other Reason")
            {
                ApplicationArea = all;
                Visible = IsOtherReasonVisible;
            }
        }
    }
    var
        IsOtherReasonVisible: Boolean;

    trigger OnAfterGetRecord()
    begin
        UpdateOtherReasonVisibility();
    end;

    local procedure UpdateOtherReasonVisibility()
    begin
        IsOtherReasonVisible := Rec.Reason <> Rec.Reason::Other;
    end;
}

说明:

  1. 新增UpdateOtherReasonVisibility本地过程,统一处理显示逻辑,避免代码重复。
  2. 给Reason字段添加OnValidate触发器,修改字段值时立刻调用更新过程,实现实时响应。
  3. OnAfterGetRecord触发器也调用该过程,确保加载记录时显示状态正确。
  4. 将Other Reason的Visible属性绑定到IsOtherReasonVisible变量,实现动态显示/隐藏。

内容的提问来源于stack exchange,提问作者Luna Fleur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:02:38