using DevExpress.XtraEditors; using DevExpress.XtraTreeList; using DevExpress.XtraTreeList.Handler; using DevExpress.XtraTreeList.Nodes; using System.Reflection; namespace HStation.WinFrmUI.Basic { internal class Class1 { #region Org private async void SaveOrg() { var list = new List(); if (this.treeList1.Nodes != null && this.treeList1.Nodes.Any()) { foreach (TreeListNode node in treeList1.Nodes.Cast()) { var model = GetTreeModel(node); list.Add(model); } } var result = await _bll.Save(_corpration.ID, _sitePolicy.ID, list); if (!result) { XtraMessageBox.Show("保存失败!"); return; } XtraMessageBox.Show("保存成功!"); } private Model.SiteOrgSaveTree GetTreeModel(TreeListNode node) { if (node == null) return default; var vm = GetViewModel(node); var model = new Model.SiteOrgSaveTree(); if (!vm.IsNew) model.ID = vm.ID; model.TargetID = vm.TargetID; model.TargetType = vm.TargetType; if (node.Nodes != null && node.Nodes.Any()) { model.Children = new List(); foreach (TreeListNode childNode in node.Nodes.Cast()) { var childModel = GetTreeModel(childNode); model.Children.Add(childModel); } } return model; } private void DeleteOrg() { var node = this.treeList1.FocusedNode; if (node == null) { XtraMessageBox.Show("请选择数据!"); return; } if (XtraMessageBox.Show($"确认删除数据行(包含子节点)?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) != DialogResult.OK) return; this.treeList1.Nodes.Remove(node); } #endregion Org #region Drag private TreeListNode currentDragNode = null; private void TreeList1_DragOver(object sender, DragEventArgs e) { if (_sitePolicy == null) return; currentDragNode = (TreeListNode)e.Data.GetData(typeof(TreeListNode)); if (currentDragNode != null) { var targetNode = this.treeList1.GetNodeAt(treeList1.PointToClient(new Point(e.X, e.Y))); if (currentDragNode == targetNode) { e.Effect = DragDropEffects.None; return; } e.Effect = DragDropEffects.Move; } else { e.Effect = e.Data.GetDataPresent(typeof(DragSiteOrg)) ? DragDropEffects.Move : DragDropEffects.None; } } private void TreeList1_DragDrop(object sender, DragEventArgs e) { var dragInsertPosition = AjustDirection(sender, e); if (currentDragNode != null) { SetCurrentDragNode(e, dragInsertPosition); currentDragNode = null; } else { AddOtherDragNode(e, dragInsertPosition); } } private void SetCurrentDragNode(DragEventArgs e, DragInsertPosition dragInsertPosition) { var dragNode = (TreeListNode)e.Data.GetData(typeof(TreeListNode)); if (dragNode == null) return; var dragVm = GetViewModel(dragNode); if (dragVm == null) return; long parentId = 0; if (dragInsertPosition != DragInsertPosition.None) { var targetNode = GetTargetNode(e); var targetVm = GetViewModel(targetNode); if (targetVm != null) { if (dragInsertPosition == DragInsertPosition.AsChild) { if (targetVm.TargetType == IStation.ObjectType.SiteInfo) { XtraMessageBox.Show("请拖动至站点组下!"); return; } parentId = targetVm.ID; } else { parentId = targetVm.ParentID; } } } var vmIndex = _allBindingList.FindIndex(x => x.ID == dragVm.ID); if (vmIndex != -1) { var vm = _allBindingList[vmIndex]; vm.ParentID = parentId; } } private void AddOtherDragNode(DragEventArgs e, DragInsertPosition dragInsertPosition) { var dragSiteOrg = (DragSiteOrg)e.Data.GetData(typeof(DragSiteOrg)); if (_allBindingList.Any()) { foreach (var item in _allBindingList) { if (item.TargetType == dragSiteOrg.TargetType && item.TargetID == dragSiteOrg.TargetID) { XtraMessageBox.Show("对象已存在"); return; } } } long parentId = 0; if (dragInsertPosition != DragInsertPosition.None) { var targetNode = GetTargetNode(e); var targetVm = GetViewModel(targetNode); if (targetVm != null) { if (dragInsertPosition == DragInsertPosition.AsChild) { if (targetVm.TargetType == IStation.ObjectType.SiteInfo) { XtraMessageBox.Show("请拖动至站点组下!"); return; } parentId = targetVm.ID; } else { parentId = targetVm.ParentID; } } } var vm = new CurrentViewModel(dragSiteOrg) { PolicyID = _sitePolicy.ID, ParentID = parentId }; _allBindingList.Add(vm); this.treeList1.RefreshDataSource(); this.treeList1.ForceInitialize(); } private TreeListNode GetTargetNode(DragEventArgs e) { var point = new Point(e.X, e.Y); var clientPoint = this.treeList1.PointToClient(point); var targetNode = this.treeList1.GetNodeAt(clientPoint); return targetNode; } private CurrentViewModel GetViewModel(TreeListNode node) { if (node == null) return default; var vm = this.treeList1.GetDataRecordByNode(node) as CurrentViewModel; return vm; } /// /// 获取拖动过程中的方向 /// private DragInsertPosition AjustDirection(object sender, DragEventArgs e) { PropertyInfo pi = typeof(TreeList).GetProperty("Handler", BindingFlags.Instance | BindingFlags.NonPublic); TreeListHandler handler = (TreeListHandler)pi.GetValue(this.treeList1, null); return handler.StateData.DragInfo.DragInsertPosition; } #endregion Drag } }