接点如下:A--
            |--B
            |--C
              |--D
              |--E
                |-F
现在想实现如下功能:1。多选
                    2。F,E,C和A只能选中一个。如果选中两个或以上需重新选。(既四个都不选中)。

解决方案 »

  1.   

    1、通过设置TreeView的MultiSelect:=True;
    2、在onclick事件里面判断本次选中的结点和selection里面是不是有父子关系
       .parent来...
      

  2.   

    1.同意楼上的。
    2.在选中某个节点时,递归查找该节点的父节点和子节点是否被选中,有被选中就将相关节点的Selected都设为False
      

  3.   

    在ONKICK事件中添加代码
    for i:=0 to TrvTaskList.SelectionCount-1 do
      begin
        showmessage(trim(IntToStr(Pmynode(TrvTaskList.Selections[i].Data).NodeID)));
        showmessage(trim(IntToStr(Pmynode(TrvTaskList.Selections[i].Data).Nodejzq)));
        showmessage(trim(IntToStr(Pmynode(TrvTaskList.Selections[i].Data).Nodecjj)));
      end;
      for i:=0 to TrvTaskList.SelectionCount-1 do
      begin
        case TrvTaskList.Selections[i].Level of
        0: begin       end;
        1: begin
             if TrvTaskList.Selections[i].Parent= nil then break;
             if TrvTaskList.Selections[i].Parent.Selected= true then
             begin
               TrvTaskList.Selections[i].Parent.Selected:= false;
             end;
           end;
        2: begin
             if TrvTaskList.Selections[i].Parent= nil then break;
             if TrvTaskList.Selections[i].Parent.Selected= true then
             begin
               TrvTaskList.Selections[i].Parent.Selected:= false;
             end;
    ***********************************************************************************
             if TrvTaskList.Selections[i].Parent.Parent= nil then break;
             if TrvTaskList.Selections[i].Parent.Parent.Selected= true then
             begin
    ***********************************************************************************
               TrvTaskList.Selections[i].Parent.Parent.Selected:= false;
             end;
           end;
        3: begin
             if TrvTaskList.Selections[i].Parent= nil then break;
             if TrvTaskList.Selections[i].Parent.Selected= true then
             begin
               TrvTaskList.Selections[i].Parent.Selected:= false;
             end;
             if TrvTaskList.Selections[i].Parent.Parent= nil then break;
    ***********************************************************************************
             if TrvTaskList.Selections[i].Parent.Parent.Selected= true then
             begin
    ***********************************************************************************
               TrvTaskList.Selections[i].Parent.Parent.Selected:= false;
             end;
    ***********************************************************************************
             if TrvTaskList.Selections[i].Parent.Parent.Parent= nil then break;
             if TrvTaskList.Selections[i].Parent.Parent.Parent.Selected= true then
             begin
    ***********************************************************************************
               TrvTaskList.Selections[i].Parent.Parent.Parent.Selected:= false;
             end;
           end;
        else
        end;
      end; 
    着是代码。当选择节点的时候:先选子节点,后选父节点。
                               先选父节点,后选子节点。
    带星号部分的代码会出错。因为当Selected:= false超做时。Parent的指针好象会释放掉。
    不知道各位有什么好的方法解决。最好能贴出代码。
      

  4.   

    TreeView很奇怪的,MultiSelect为True的时候,动态设置Item[i].selected会出现很多奇怪的情况,D本身的帮助解释不是很清楚。头大。刚刚调试了很长时间,晕。给你代码:
    function TForm1.FindNodeParent(Node:TTreeNode):Boolean;
    begin
        Result:=false;    if Node.Parent<>nil then
        begin
            Result:=FindNodeParent(Node.Parent);
        end;    if Node.Selected=true then
        begin
            TreeView1.Deselect(Node);
            Result:=true;
        end;
    end;function TForm1.FindNodeChild(Node:TTreeNode):boolean;
    var
        i:integer;
    begin
        Result:=false;    for i:=0 to Node.Count-1 do
        begin
            Result:=FindNodeChild(Node.Item[i]);
            if Node.Item[i].Selected=true then
            begin
                TreeView1.Deselect(Node.Item[i]);
                Result:=true;
            end;
        end;
    end;procedure TForm1.TreeView1Click(Sender: TObject);
    var
        bFind:boolean;
    begin
        bFind:=false;
        if TreeView1.SelectionCount>0 then
        begin
            if FindNodeChild(TreeView1.Selections[0]) then
                    bFind:=true;
            if TreeView1.Selections[0].Parent<>nil then
                if FindNodeParent(Treeview1.Selections[0].Parent) then
                    bFind:=true;
            if bFind then
                TreeView1.Deselect(TreeView1.Selections[0]);
        end;
    end;
      

  5.   

    用 TCheckTreeView吧 简单方便!