当前位置: 首页 > news >正文

DELPHI实现dbTreeView的节点拖动并更新

目录

【前提说明】

【打开拖动功能】

【启用拖动】

【拖动结束处理】

【拖动功能涉及的自定义函数】


【前提说明】

DELPHI版本:D12
控件类型:dxDBTreeView

【打开拖动功能】


我们先在窗体打开的事件中,将dxDBTreeView控件的拖动功能打开,代码如下:

```


procedure TFrmOrganization.FormShow(Sender: TObject);
begindxDBTreeView1.DragMode := dmAutomatic;  // 允许自动拖动
end;


```

【启用拖动】

procedure TFrmOrganization.dxDBTreeView1DragOver(Sender, Source: TObject; X,Y: Integer; State: TDragState; var Accept: Boolean);
varSourceNode, TargetNode: TdxDBTreeNode;
beginAccept := (Source = dxDBTreeView1);  // 仅允许同一控件内拖放SourceNode := dxDBTreeView1.Selected as TdxDBTreeNode;TargetNode := dxDBTreeView1.GetNodeAt(X, Y) as TdxDBTreeNode;// 允许拖放到空白处(根节点)if Assigned(SourceNode) thenbeginAccept := True; // 默认允许if Assigned(TargetNode) thenbegin// 额外检查目标合法性Accept := (SourceNode.KeyFieldValue <> TargetNode.KeyFieldValue) and(not IsNodeChild(SourceNode.KeyFieldValue, TargetNode.KeyFieldValue));end;end;end;

【拖动结束处理】

procedure TFrmOrganization.dxDBTreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
varSourceNode, TargetNode: TdxDBTreeNode;NewParentUID: Variant;
beginSourceNode := dxDBTreeView1.Selected as TdxDBTreeNode;TargetNode := dxDBTreeView1.GetNodeAt(X, Y) as TdxDBTreeNode;if Assigned(SourceNode) thenbegin// 如果拖放到空白处,设置为根节点(ParentUID = Null)NewParentUID := null;if Assigned(TargetNode) thenNewParentUID := TargetNode.KeyFieldValue;// 检查是否允许拖放if (SourceNode.KeyFieldValue <> NewParentUID) and(not IsNodeChild(SourceNode.KeyFieldValue, NewParentUID)) thenbeginUpdateNodeParent(StrToInt(SourceNode.KeyFieldValue),StrToInt(NewParentUID));end;end;end;

【拖动功能涉及的自定义函数】

function TFrmOrganization.IsNodeChild(AParentKey, ACheckKey: Variant): Boolean;
varCurrentKey: Variant;
beginResult := False;if VarIsNull(ACheckKey) then Exit;CurrentKey := ACheckKey;while (not VarIsNull(CurrentKey)) and (CurrentKey <> AParentKey) dobeginCurrentKey := GetParentKeyByChildKey(CurrentKey);end;Result := (CurrentKey = AParentKey);
end;// 辅助函数:根据子节点 Key 获取父节点 Key
function TFrmOrganization.GetParentKeyByChildKey(AChildKey: Variant): Variant;
begin// 示例:通过数据集查询if CDS1.Locate(dxDBTreeView1.KeyField, AChildKey, []) thenResult := CDS1.FieldByName(dxDBTreeView1.ParentField).ValueelseResult := Null;
end;procedure TFrmOrganization.UpdateNodeParent(ASourceKey, ATargetKey: Integer);
varUID:string;
begin
//此处更新数据库,需要与自己程序的字段相对应UID:=IntToStr(ASourceKey);CDS.Close;CDS.CommandText:='update Organization set ParentUID = '''+IntToStr(ATargetKey)+''' where UID = '''+UID+''' ';CDS.Execute;
end;

http://www.xdnf.cn/news/132283.html

相关文章:

  • 为什么说美颜SDK动态贴纸才是直播、短视频平台的下一个爆点?看完你就懂了!
  • 连续帧点云目标检测结果展示,python实现
  • 这个免费的AI插件,居然让我5分钟看完2小时的YouTube视频!
  • 大麦项目pro版本来袭!扫平面试中的一切疑难杂症!
  • 视频丨Google 最新 AI 眼镜原型曝光:轻量 XR+情境感知 AI 打造下一代计算平台
  • 【C语言练习】002. 理解C语言的基本语法结构
  • 存储新势力:助力DeepSeek一体机
  • GIT下载步骤
  • Base64编码原理:二进制数据与文本的转换技术
  • 因泰立H13激光雷达赋能垃圾发电厂,炉渣体积测量与装车智能化
  • 跨Linux发行版CPU指令集兼容性深度解析与实践指南
  • 一文读懂Nginx应用之 CentOS安装部署Nginx服务
  • 当智驾成标配,车企暗战升级|2025上海车展
  • 告别 “幻觉” 回答:RAG 中知识库与生成模型的 7 种对齐策略
  • CUDA编程之Grid、Block、Thread线程模型
  • 用 ESP32 模拟 Wiegand 刷卡器:开发门禁系统必备的小工具
  • 【CODEMATE】进制转换(transform) 粤港澳青少年信息学创新大赛 C/C++/Python 解题思路
  • WebUI可视化:第2章:技术基础准备
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(11): てあります。
  • 《拆掉思维里的墙》 古典-摘抄
  • k8s(9) — zookeeper集群部署(亲和性、污点与容忍测试)
  • Xmind快捷键大全
  • 【Dify系列教程重置精品版】第1课 相关概念介绍
  • android jatpack Compose 多数据源依赖处理:从状态管理到精准更新的架构设计
  • const(C++)
  • Modbus主从通信功能码与报文格式
  • C++初窥门径
  • 一文读懂 Redis 主从、哨兵、集群模式:工作机制、优缺点全梳理
  • 2025年C/C++基础面试题全解析 | 突破技术盲区,直击大厂核心考点
  • 代码随想录从子序列到编辑距离