zoukankan      html  css  js  c++  java
  • dxDBTreeView的结点间移动

    利用TdxDBTreeView控件(此处设为DBTreeMain)时,可以从表中直接显示出树结构,有时需要拖动对节点进行排序,而且数据表中有字段SortCode用于排序码,此时需要编写对应代码,步骤如下
    1.先设置DBTreeMain的DragMode属性为dmAutomatic
    2.设置DBTreeMain的StateIndexField属性为SortCode
    3.在其OnEndDragTreeNode事件中写入
    var
      m: TNodeAttachMode;
      oldOption: TdxDBTreeViewOptions;
      node: TdxDBTreeNode;
      bm: TBookmarkStr;
      idx: Integer;
    begin
      inherited;
      try
        frmDragOption := TfrmDragOption.Create(nil);
        if frmDragOption.ShowModal = mrOK then
        begin
          //ShowMessage('1');
          if frmDragOption.rgOption.ItemIndex = 0 then
            m := naInsert
          else
            m := naAddChild;
          AttachMode := m;
          with DBTreeMain do
          begin
            oldOption := Options;
            Options := Options - [trCanDBNavigate];
            OnCompare := nil;
            bm := qryTree.Bookmark;
            qryTree.DisableControls;
            Items.BeginUpdate;
            try
              if m = naInsert then
              begin
                node := TdxDBTreeNode(Destination);
                idx := node.ImageIndex;
                UpdateSortCode(Source, idx);
                while node <> nil do
                begin
                  Inc(idx, 10);
                  UpdateSortCode(node, idx);
                  node := TdxDBTreeNode(node.getNextSibling);
                  if node = Source then
                    Break;
                end;
              end
              else //添加子
              begin
                idx := GetChildMaxIdx(Destination) + 10;
                UpdateSortCode(Source, idx);
              end;
            finally
              Items.EndUpdate;
              Options := oldOption;
              OnCompare := DBTreeMainCompare;
              qryTree.EnableControls;
              qryTree.Bookmark := bm;
            end;
          end;
        end
        else
          //
      finally
        frmDragOption.Free;
      end;
    end;

     

    //UpdateSortCode过程
    procedure TfrmSetTree.UpdateSortCode(ANode: TTreeNode; ASortCode: Integer);
    var
      key: Variant;
    begin
      key := TdxDBTreeNode(ANode).KeyFieldValue;
      with qryTree do
      begin
        if Locate('ID', key, []) then
        begin
          Edit;
          FieldByName('SortCode').AsInteger := ASortCode;
          Post;
        end;
      end;
      ANode.ImageIndex := ASortCode;
    end;

     

    //GetChildMaxIdx过程
    function TfrmSetTree.GetChildMaxIdx(ANode: TTreeNode): Integer;
    var
      i: Integer;
    begin
      Result := 0;
      for i := 0 to ANode.Count - 1 do
      begin
        if ANode[i].ImageIndex > Result then
          Result := ANode[i].ImageIndex;
      end;
    end;

     

    4.在其OnCompare事件中写入
    procedure TfrmSetTree.DBTreeMainCompare(Sender: TObject; Node1,
      Node2: TTreeNode; Data: Integer; var Compare: Integer);
    begin
      inherited;
      if Node1.ImageIndex > Node2.ImageIndex then
        Compare := 1
      else if Node1.ImageIndex = Node2.ImageIndex then
        Compare := 0
      else
        Compare := -1;
    end;

  • 相关阅读:
    Remove Nth Node From End of List从尾部开始删除第N个节点
    给乱序的链表排序 · Sort List, 链表重排reorder list LoLn...
    Partition List双色问题链表版
    翻转链表reverse linked list:全部,m~n
    删除链表中的重复元素:不留&留一个&删除一个
    基于快速排序的数组划分:2组 3组 K组(sort color)大小写排序 &#183; Partition Array
    字体 | font (Fonts) – CSS 中文开发手册
    HTML tfoot charoff 属性
    Bootstrap 网格系统
    struct (String) – Python 中文开发手册
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2035715.html
Copyright © 2011-2022 走看看