如何在弹出屏幕中完全隐藏PXButton?设置SetVisible后仍报错
核心问题分析
你当前在主图的RowSelected<POReceipt>事件中控制弹出窗口按钮的可见性,这是无效的——弹出窗口拥有独立的Graph实例,主图的事件不会影响到弹出窗口内的Action状态。另外仅设置AutoRepaint等属性不足以触发弹出窗口的UI刷新,必须在弹出窗口对应的Graph中处理按钮可见性。
具体解决方案
1. 定位弹出窗口对应的Graph
找到弹出窗口绑定的目标Graph(比如如果是通过PXPopupWindow或自定义对话框打开的,查看ASPX或代码中指定的Graph类型)。假设弹出窗口的Graph是POReceiptPopupGraph(替换为你实际的Graph名称)。
2. 在弹出窗口Graph中添加控制逻辑
在弹出窗口的Graph里,通过RowSelected事件(或针对弹出窗口中绑定的主DAC的事件)设置Action的可见性:
public class POReceiptPopupGraph : PXGraph<POReceiptPopupGraph> { public PXAction<POReceipt> actionMoveAll; [PXButton(CommitChanges = true)] [PXUIField(DisplayName = "Move All")] protected void ActionMoveAll() { // 原有按钮逻辑 } protected void _(Events.RowSelected<POReceipt> e) { if (e.Row == null) return; // 根据ReceiptType控制按钮可见性 bool shouldHide = e.Row.ReceiptType == POReceiptType.TransferReceipt; actionMoveAll.SetVisible(!shouldHide); // 同时确保禁用状态和可见性同步(避免残留禁用状态导致报错) actionMoveAll.SetEnabled(!shouldHide); } }
注意:如果弹出窗口绑定的是其他DAC,将
RowSelected<POReceipt>替换为对应DAC的事件。
3. 验证ASPX配置
确保弹出窗口中的PXButton正确绑定到目标Action,无需额外冗余的刷新配置(弹出窗口的Graph事件会自动触发UI更新):
<px:PXButton ID="btnMoveAll" runat="server" CommandName="actionMoveAll" Text="Move All" />
4. 替代方案:通过UI绑定控制可见性
如果不想修改后台代码,也可以在ASPX中直接绑定按钮的Visible属性到Graph的自定义属性:
- 在弹出窗口Graph中添加属性:
public bool IsMoveAllVisible => Base.Document.Current?.ReceiptType != POReceiptType.TransferReceipt; - 在ASPX中绑定:
<px:PXButton ID="btnMoveAll" runat="server" CommandName="actionMoveAll" Text="Move All" Visible='<%# DataBinder.Eval(Container, "IsMoveAllVisible") %>' />
关键注意点
- 永远不要在主图事件中控制弹出窗口的UI元素,必须针对弹出窗口的独立Graph做处理。
- 设置
Visible=false时,按钮会从DOM中移除,不会再触发点击报错;如果仅设置Enabled=false,按钮仍会显示并触发禁用提示,这就是你当前遇到的问题。
内容的提问来源于stack exchange,提问作者Kyle Vanderstoep
相关产品推荐
相关产品推荐

