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

Acumatica独立PXTreeView节点选中回调事件实现咨询

问题描述

我正在构建独立的PXTreeView,包含多个节点,希望点击节点时触发图(Graph)中的方法或操作。目前主/明细模式运行正常,但不确定节点选中触发回调的需求是否受支持。遇到的具体问题:

  • 使用Events.FieldSelecting<TreeViewNode, TreeViewNode.nodeID>事件时,节点选中会触发树中所有节点的该事件,无法识别实际选中的节点。
  • 尝试用PXTreeItemBinding的NavigateURLField字段赋值,但节点选中时完全被忽略。
  • 需要类似按钮Link Command的机制,能基于选中节点执行自定义操作(比如导航到动态URL)。
已尝试的代码
public class TreeViewTest : PXGraph
{
    public PXSelect Nodes;
    public PXSelect<TreeViewNode, Where<TreeViewNode.nodeID, Equal<Current<TreeViewNode.nodeID>>>> SelectedNode;

    protected void _(Events.FieldSelecting<TreeViewNode, TreeViewNode.nodeID> e)
    {
        if (e.Row == null)
            return;

        var x = e.Row;
    }

    protected virtual IEnumerable nodes([PXDBGuid] Guid? nodeID)
    {
        if (nodeID == null)
        {
            var root = new TreeViewNode
            {
                NodeID = new Guid("00000000-0000-0000-0000-000000000000"),
                NodeName = "Root"
            };
            yield return root;
        }
        else
        {
            PXResultset<TreeViewNode> nodesForParent = PXSelect<TreeViewNode, Where<TreeViewNode.parentID, Equal<Required<TreeViewNode.parentID>>>>.Select(this, nodeID);

            foreach (var item in nodesForParent)
            {
                TreeViewNode node = item;
                yield return node;
            }
        }
    }
}
解决方案

1. 准确捕获节点选中事件

放弃FieldSelecting事件,改用RowSelected事件——它仅在节点被选中时触发,且能直接获取当前选中的行:

protected void _(Events.RowSelected<TreeViewNode> e)
{
    if (e.Row == null) return;
    
    // 在这里处理选中节点后的逻辑,比如获取选中节点ID
    Guid selectedNodeId = e.Row.NodeID;
    // 执行自定义操作,如业务逻辑处理
}

2. 实现动态导航URL

如果需要点击节点跳转至动态URL,按以下步骤操作:

  • 在TreeViewNode DAC中添加一个非数据库存储的字符串字段(如NavigateURL):
    public class TreeViewNode : IBqlTable
    {
        // 现有字段...
        [PXString(255)]
        [PXUIField(DisplayName = "Navigate URL")]
        public string NavigateURL { get; set; }
        public abstract class navigateURL : BqlString.Field<navigateURL> { }
    }
    
  • 在FieldSelecting事件中为该字段赋值动态URL:
    protected void _(Events.FieldSelecting<TreeViewNode, TreeViewNode.navigateURL> e)
    {
        if (e.Row == null) return;
        
        // 根据节点ID生成动态跳转地址
        e.ReturnValue = $"~/Pages/Custom/TargetPage.aspx?NodeID={e.Row.NodeID}";
    }
    
  • 在ASPX页面的PXTreeItemBinding中配置NavigateURLField="NavigateURL"。

3. 自定义命令实现复杂操作

如果需要执行更复杂的业务逻辑,可通过自定义PXAction结合客户端事件实现:

  1. 在图中添加自定义操作:
    public PXAction<TreeViewNode> NodeClickAction;
    [PXButton(CommitChanges = true)]
    [PXUIField(DisplayName = "Node Click")]
    protected void nodeClickAction()
    {
        TreeViewNode selectedNode = SelectedNode.Current;
        if (selectedNode != null)
        {
            // 在这里编写选中节点后的自定义业务逻辑
        }
    }
    
  2. 在ASPX页面的PXTreeView中绑定客户端点击事件:
    <px:PXTreeView ID="treeView" runat="server" DataSourceID="ds" DataMember="Nodes">
        <ClientSideEvents NodeClick="function(s,e){ PX.ProcessAction('ds', 'NodeClickAction', [e.node.id]); }" />
        <Items>
            <px:PXTreeItemBinding TextField="NodeName" ValueField="NodeID" />
        </Items>
    </px:PXTreeView>
    

点击节点时会触发自定义的NodeClickAction,并传入选中节点ID,后续逻辑可在图中处理。


内容的提问来源于stack exchange,提问作者Jimbo Jones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:53:33