【问题标题】:TTreeView check all parents from childTTreeView 检查孩子的所有父母
【发布时间】:2021-06-11 07:53:09
【问题描述】:

当用户检查一个父级时,这是一个检查所有子级的代码。但是如何检查所有父母检查一个孩子?顺便一提。我尝试使用Node->getPrevSibling();但没有效果。

void __fastcall TForm1::UpdateChildStates( TTreeNode *Node )
{
    int state = TreeView_GetItemState(TreeView1->Handle, Node->ItemId, TVIS_STATEIMAGEMASK);
    int StateIndex = ((state & TVIS_STATEIMAGEMASK)>>12);

    Node = Node->getFirstChild();
    while( Node )
    {
        Node->StateIndex = StateIndex;
        UpdateChildStates( Node );
        Node = Node->getNextSibling();
    }
}
//-------------------------------------------------------------------------

void __fastcall TForm1::TreeView1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
  TTreeNode *Node;

  THitTests HitTests = TreeView1->GetHitTestInfoAt(X, Y);
  if( HitTests.Contains(htOnStateIcon) )
    Node = TreeView1->GetNodeAt( X, Y );
  else return;

  if( Node )
  {
    TreeView1->Items->BeginUpdate();

    try {
        UpdateChildStates(Node);
    }
    __finally {
        TreeView1->Items->EndUpdate();
    }
  }
}

【问题讨论】:

    标签: c++ c++builder


    【解决方案1】:

    使用Node = Node->Parent;遍历父节点

    【讨论】:

    • 这样下面和下面都检查了
    • 如果你例如单击一个节点,设置其StateIndex 并递归遍历父节点(设置每个节点StateIndex)它无法检查下的任何节点。除非你做错了什么。
    • 你的意思是这样吗? Node = Node->Parent; while( Node ) { Node->StateIndex = StateIndex; UpdateParentStates( Node ); Node = Node->getPrevSibling(); }
    • 几乎,但不是。如果您想拜访父母链,拨打Node = Node->getPrevSibling(); 是多余的。每个节点只有一个父节点。我不明白为什么在遍历父母时要包括任何级别的兄弟姐妹。
    • @Jacek Node = Node->Parent; while( Node ) { Node->StateIndex = StateIndex; Node = Node->Parent; }
    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2023-02-06
    相关资源
    最近更新 更多