如何实现treeview分开查询,不要一次全查出?当用户展开节点时,再去取数据。如果一次性展开,太慢了。还有有子节点前的+号也不能少。

解决方案 »

  1.   


    procedure TCustomTreeView.CreateParams(var Params: TCreateParams);
    const
      BorderStyles: array[TBorderStyle] of DWORD = (0, WS_BORDER);
      LineStyles: array[Boolean] of DWORD = (0, TVS_HASLINES);
      RootStyles: array[Boolean] of DWORD = (0, TVS_LINESATROOT);
      ButtonStyles: array[Boolean] of DWORD = (0, TVS_HASBUTTONS);
      EditStyles: array[Boolean] of DWORD = (TVS_EDITLABELS, 0);
      HideSelections: array[Boolean] of DWORD = (TVS_SHOWSELALWAYS, 0);
      DragStyles: array[TDragMode] of DWORD = (TVS_DISABLEDRAGDROP, 0);
      RTLStyles: array[Boolean] of DWORD = (0, TVS_RTLREADING);
      ToolTipStyles: array[Boolean] of DWORD = (TVS_NOTOOLTIPS, 0);
      AutoExpandStyles: array[Boolean] of DWORD = (0, TVS_SINGLEEXPAND);
      HotTrackStyles: array[Boolean] of DWORD = (0, TVS_TRACKSELECT);
      RowSelectStyles: array[Boolean] of DWORD = (0, TVS_FULLROWSELECT);
    begin
      InitCommonControl(ICC_TREEVIEW_CLASSES);
      inherited CreateParams(Params);
      CreateSubClass(Params, WC_TREEVIEW);
      with Params do
      begin
        Style := Style or LineStyles[FShowLines] or BorderStyles[FBorderStyle] or
          RootStyles[FShowRoot] or ButtonStyles[FShowButtons] or
          EditStyles[FReadOnly] or HideSelections[FHideSelection] or
          DragStyles[DragMode] or RTLStyles[UseRightToLeftReading] or
          ToolTipStyles[FToolTips] or AutoExpandStyles[FAutoExpand] or
          HotTrackStyles[FHotTrack] or RowSelectStyles[FRowSelect];
        if Ctl3D and NewStyleControls and (FBorderStyle = bsSingle) then
        begin
          Style := Style and not WS_BORDER;
          ExStyle := Params.ExStyle or WS_EX_CLIENTEDGE;
        end;
        WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW);
      end;
    end;procedure TCustomTreeView.CreateWnd;
    var
      I: Integer;
    begin
      FStateChanging := False;
      inherited CreateWnd;
      TreeView_SetBkColor(Handle, ColorToRGB(Color));
      TreeView_SetTextColor(Handle, ColorToRGB(Font.Color));
      if FMemStream <> nil then
      begin
        Items.BeginUpdate;
        try
          Items.ReadData(FMemStream);
          Items.ReadExpandedState(FMemStream);
          FreeAndNil(FMemStream);
          SetTopItem(Items.GetNodeFromIndex(FSaveTopIndex));
          FSaveTopIndex := 0;
          if FSaveIndexes <> nil then
          begin
            for I := 0 to FSaveIndexes.Count - 1 do
              FSelections.Add(Items.GetNodeFromIndex(Integer(FSaveIndexes[I])));
            FreeAndNil(FSaveIndexes);
            ValidateSelection;
            SetSelected(Selections[0]);
          end
          else
            SetSelected(Items.GetNodeFromIndex(FSaveIndex));
          FSaveIndex := 0;
        finally
          Items.EndUpdate;
        end;
      end;
      if FSaveIndent <> -1 then
        Indent := FSaveIndent;
      if (Images <> nil) and Images.HandleAllocated then
        SetImageList(Images.Handle, TVSIL_NORMAL);
      if (StateImages <> nil) and StateImages.HandleAllocated then
        SetImageList(StateImages.Handle, TVSIL_STATE);
    end;procedure TCustomTreeView.DestroyWnd;
    var
      Node: TTreeNode;
      I: Integer;
    begin
      FStateChanging := True;
      FRClickNode := nil;
      if FCreateWndRestores and (Items.Count > 0) then
      begin
        FMemStream := TMemoryStream.Create;
        Items.WriteData(FMemStream);
        Items.WriteExpandedState(FMemStream);
        FMemStream.Position := 0;
        FSaveTopIndex := 0;
        FSaveIndex := 0;
        Node := GetTopItem;
        if Node <> nil then
          FSaveTopIndex := Node.AbsoluteIndex;
        Items.BeginUpdate;
        try
          if MultiSelect and (FSelections.Count > 1) then
          begin
            FSaveIndexes := TList.Create;
            for I := 0 to FSelections.Count - 1 do
              FSaveIndexes.Add(Pointer(TTreeNode(FSelections[I]).AbsoluteIndex));
            FSelections.Clear;
          end
          else
          begin
            Node := Selected;
            if Node <> nil then
              FSaveIndex := Node.AbsoluteIndex;
          end;
          Items.Clear;
        finally
          Items.EndUpdate;
        end;
      end;
      FSaveIndent := Indent;
      inherited DestroyWnd;
    end;function TCustomTreeView.GetHitTestInfoAt(X, Y: Integer): THitTests;
    var
      HitTest: TTVHitTestInfo;
    begin
      Result := [];
      with HitTest do
      begin
        pt.X := X;
        pt.Y := Y;
        TreeView_HitTest(Handle, HitTest);
        if (flags and TVHT_ABOVE) <> 0 then Include(Result, htAbove);
        if (flags and TVHT_BELOW) <> 0 then Include(Result, htBelow);
        if (flags and TVHT_NOWHERE) <> 0 then Include(Result, htNowhere);
        if (flags and TVHT_ONITEM) = TVHT_ONITEM then
          Include(Result, htOnItem)
        else
        begin
          if (flags and TVHT_ONITEM) <> 0 then Include(Result, htOnItem);
          if (flags and TVHT_ONITEMICON) <> 0 then Include(Result, htOnIcon);
          if (flags and TVHT_ONITEMLABEL) <> 0 then Include(Result, htOnLabel);
          if (flags and TVHT_ONITEMSTATEICON) <> 0 then Include(Result, htOnStateIcon);
        end;
        if (flags and TVHT_ONITEMBUTTON) <> 0 then Include(Result, htOnButton);
        if (flags and TVHT_ONITEMINDENT) <> 0 then Include(Result, htOnIndent);
        if (flags and TVHT_ONITEMRIGHT) <> 0 then Include(Result, htOnRight);
        if (flags and TVHT_TOLEFT) <> 0 then Include(Result, htToLeft);
        if (flags and TVHT_TORIGHT) <> 0 then Include(Result, htToRight);
      end;
    end;
      

  2.   

    上面的说什么呢?对于楼主的问题,可以在OnExpanding事件建子树!
      

  3.   

    要想拿加号:
    TreeView1.Items.Item[0].HasChildren := true;
      

  4.   


    要想拿加号:
    TreeView1.Items.Item[0].HasChildren := true;-----
    这个做没有试过
    不过以前在VB下就是加入一个子结点,再把它删除,加号就出来了