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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值