【问题标题】:Unable to delete child nodes of a parent node (Devexpress TreeList)无法删除父节点的子节点(Devexpress TreeList)
【发布时间】:2015-01-09 07:21:27
【问题描述】:

我正在尝试从TreeList 中删除焦点节点及其所有子节点(如果有)。问题是我无法检索子节点。我尝试了两种方法:

  1. 我使用了TreeListNodeIterator,它返回一个TreeListNodes 对象,其中包含焦点行的子对象:

    Public Class TreeListOperationGetChildNodes
            Inherits TreeListOperation
            Private _child_nodes As TreeListNodes
    
        Public Sub New(tree As TreeList)
            _child_nodes = New TreeListNodes(tree)
        End Sub
    
        Public Overrides Sub Execute(node As DevExpress.XtraTreeList.Nodes.TreeListNode)
            _child_nodes.Add(node)
        End Sub
    
        Public ReadOnly Property ChildNodes() As TreeListNodes
            Get
                Return _child_nodes
            End Get
        End Property
    
    End Class
    

然后使用这个child_nodes 对象从TreeList 中删除所有节点:

Dim child_nodes As TreeListNodes = New TreeListNodes(DataTreeList)
Dim op As New TreeListOperationGetChildNodes(DataTreeList)
Dim nodes As TreeListNodes = New TreeListNodes(DataTreeList)
DataTreeList.NodesIterator.DoLocalOperation(op, nodes)
child_nodes = op.ChildNodes 

For Each node As TreeListNode In child_nodes
   DataTreeList.DeleteNode(node)
Next
  1. 我尝试的另一种方法是循环遍历树列表的所有节点,看看它们的 parent_id 是否等于焦点节点 id。如果是,则将它们放入堆栈中。最后,为堆栈中的每个节点调用删除节点。

    Dim nodeStack As New Stack(Of DevExpress.XtraTreeList.Nodes.TreeListNode)
    nodeStack.Push(DataTreeList.FocusedNode)
    FillStack(DataTreeList.FocusedNode, nodeStack)
    For i As Integer = 0 To nodeStack.Count - 1 Step +1
        DataTreeList.DeleteNode(nodeStack.Pop)
    Next
    
    Private Sub FillStack(ByVal node As DevExpress.XtraTreeList.Nodes.TreeListNode, ByVal nodestack As Stack(Of DevExpress.XtraTreeList.Nodes.TreeListNode))
        For Each childnode As DevExpress.XtraTreeList.Nodes.TreeListNode In DataTreeList.Nodes
    
            If DirectCast(DataTreeList.GetDataRecordByNode(childnode), Data).ParentID = _
               DirectCast(DataTreeList.GetDataRecordByNode(node), Data).ID Then
    
                nodestack.Push(childnode)
                FillStack(childnode, nodestack)
    
            End If
        Next
    End Sub
    

上面代码sn-ps的问题:

  1. 这里的节点迭代器返回chlid_nodes空(未找到子节点)
  2. FillDeleteStack DataTreeList.Nodes 中仅包含2 个仅作为父节点的节点。所以堆栈总是空的。

我不明白为什么我不能遍历子节点。为什么TreeList中的节点集合只包含父节点而不包含子节点?

【问题讨论】:

    标签: vb.net devexpress devexpress-windows-ui xtratreelist


    【解决方案1】:

    0。要删除焦点节点及其所有子节点,您只需使用TreeList.DeleteNode 方法:

    DataTreeList.DeleteNode(DataTreeList.FocusedNode)
    

    1。您正在使用 TreeListNodes(TreeList) 构造函数,它创建了一个 empty 节点集合。如果您想获取现有节点的集合,则可以使用 TreeList.NodesTreeListNode.Nodes 属性:

    nodes = DataTreeList.Nodes
    ' or
    nodes = DataTreeList.FocusedNode.Nodes
    

    2。 TreeList.Nodes 属性返回 TreeListroot 节点的集合。如果要获取TreeList 中的所有可见节点,则可以使用TreeList.GetNodeList 方法。

    【讨论】:

    • 1.我正在创建 TreeListNodes(TreeList) 构造函数,它创建一个空节点集合-Right。但后来我使用 TreeListNodeIterator 并将子节点添加到这个集合中。最后的意思是它应该有所有的子节点。 2. 这让我很困惑。我一直使用 TreeList.Nodes 并且能够检索所有节点(包括子节点)。但是在使用 TreeList 时,我总是会看到无法预料的行为。无论如何,我将尝试使用 GetNodeList。谢谢 nempoBu4!
    • @LittleMissSunshine 您正在使用带有空集合的迭代器:DataTreeList.NodesIterator.DoLocalOperation(op, nodes),其中nodes 变量是空集合:Dim nodes As TreeListNodes = New TreeListNodes(DataTreeList)
    • @LittleMissSunshine 你试过DataTreeList.DeleteNode(DataTreeList.FocusedNode)吗?
    • 哦,是的!我不知何故错过了 node = DataTreeList.FocusedNode 分配! :( 。是的,我也尝试过 DeleteNode ,但它给出了 Operation not supported 异常,我今天意识到这是因为我的 TreeList(list) 数据源不支持删除。但现在它已经解决了。用我的节点迭代器进行更正后,它是工作正常。谢谢!
    猜你喜欢
    • 2015-02-10
    • 2015-11-19
    • 1970-01-01
    • 2013-02-04
    • 2013-01-30
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多