TdxDBTreeView的节点移动排序

利用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;

原文地址:https://www.cnblogs.com/djcsch2001/p/2035725.html