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,按以下步骤操作:
- 在
TreeViewNodeDAC中添加一个非数据库存储的字符串字段(如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结合客户端事件实现:
- 在图中添加自定义操作:
public PXAction<TreeViewNode> NodeClickAction; [PXButton(CommitChanges = true)] [PXUIField(DisplayName = "Node Click")] protected void nodeClickAction() { TreeViewNode selectedNode = SelectedNode.Current; if (selectedNode != null) { // 在这里编写选中节点后的自定义业务逻辑 } } - 在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
相关产品推荐
相关产品推荐

