using DevExpress.Utils.DragDrop; using DevExpress.XtraEditors; using DevExpress.XtraTreeList; using DevExpress.XtraTreeList.Handler; using DevExpress.XtraTreeList.Nodes; using SqlSugar; using System.ComponentModel; using System.Reflection; namespace HStation.WinFrmUI.Basic { public partial class SysCatalogManageMainPanel : DocumentPage { public SysCatalogManageMainPanel() { InitializeComponent(); this.PageTitle.Caption = "分类管理"; this.treeList1.InitialMultiColSettings(); this.PageTitle.HeaderSvgImage = this.svgImage32[0]; this.PageTitle.SvgImageSize = new Size(24, 24); this.typeTreeListCtrl2.FocusedChangedEvent += TypeTreeListCtrl2_FocusedChangedEvent; } private List _allBindingList; private Yw.BLL.SysCatalog _bll; private List _IndexList; public override void InitialDataSource() { this.typeTreeListCtrl2.SetBindingData(); _bll = new Yw.BLL.SysCatalog(); } //聚焦切换 private async void TypeTreeListCtrl2_FocusedChangedEvent(long typeID) { _allBindingList = new List(); var alllist = await _bll.GetByTypeID(typeID); _allBindingList.Clear(); foreach (var item in alllist) { _allBindingList.Add(new SysCatalogViewModel(item)); } this.catalogViewModelBindingSource.DataSource = _allBindingList; _IndexList = _allBindingList.Select(x => new SysCatalogViewModel(x)).ToList(); this.catalogViewModelBindingSource.ResetBindings(false); this.treeList1.ExpandAll(); } //添加 private void BtnAdd_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var dlg = new AddSysCatalogDlg(); var typeID = this.typeTreeListCtrl2.GetCurrentID(); if (typeID == 0) return; dlg.SetBindingData(typeID); dlg.ReloadDataEvent += async (rhs) => { var id = await _bll.Insert(rhs); if (id > 0) { var model = await _bll.GetByID(id); _allBindingList.Add(new SysCatalogViewModel(model)); this.catalogViewModelBindingSource.ResetBindings(false); return true; } return false; }; dlg.ShowDialog(); } //编辑 private void barBtnEditPumpCurve_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var dlg = new EditSysCatalogDlg(); var vm = this.treeList1.GetCurrentViewModel(_allBindingList); if (vm == null) { MessageBoxHelper.ShowWarning("请选择数据行!"); return; } dlg.SetBindingData(vm.ID); dlg.ReloadDataEvent += async (rhs) => { if (await _bll.Update(rhs)) { vm.Reset(rhs); this.catalogViewModelBindingSource.ResetBindings(false); return true; } return false; }; dlg.ShowDialog(); } //删除 private async void BtnDelete_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var currentVm = this.treeList1.GetCurrentViewModel(_allBindingList); if (currentVm == null) { MessageBoxHelper.ShowWarning("请选择数据行!"); return; } if (MessageBoxHelper.IsClickOk($"确认删除数据行?", "提示")) return; try { var result = await _bll.DeleteByID(currentVm.ID); if (result) { _allBindingList.Remove(currentVm); this.catalogViewModelBindingSource.ResetBindings(false); MessageBoxHelper.ShowSuccess($"删除成功!"); } else { MessageBoxHelper.ShowError($"删除失败!"); return; } } catch (Yw.Dto.InternalException ex) { MessageBoxHelper.ShowError(ex.ErrorMsg); } } //相应属性编辑 private async void BtnPropEdit_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var currentVm = this.treeList1.GetCurrentViewModel(_allBindingList); if (currentVm != null) { var dlg = new SetSysPropForCatalogDlg(); dlg.SetBindingData(currentVm.ID); dlg.ShowDialog(); } else { MessageBoxHelper.ShowWarning("选择数据行!"); return; } } /// ///设置父级 /// private void barBtnUpdateParent_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var currentVm = this.treeList1.GetCurrentViewModel(_allBindingList); if (currentVm == null) { MessageBoxHelper.ShowWarning("请选择数据行!"); return; } var dlg = new UpdateCatalogParentDlg(); dlg.SetBindingData(currentVm.TypeID, currentVm.ID, currentVm.ParentID); dlg.ReloadEvent += async (parentId) => { var bol = await _bll.UpdateTreeSortCode(currentVm.ID, parentId, 1); if (bol) { this.InitialDataSource(); return true; } return false; }; dlg.ShowDialog(); } private TreeListNode currentDragNode = null; private void treeList1_DragDrop(object sender, DragEventArgs e) { currentDragNode = (TreeListNode)e.Data.GetData(typeof(TreeListNode)); var currentvm = GetViewModel(currentDragNode); var dragInsertPosition = AjustDirection(sender, e); var targetNode = GetTargetNode(e); var targetVm = GetViewModel(targetNode); var currentIndex = _allBindingList.IndexOf(currentvm); //操作目标索引 var targetIndex = _allBindingList.IndexOf(targetVm); //目标位置索引 if (dragInsertPosition == DragInsertPosition.AsChild || targetVm == null || currentvm == null) { e.Effect = DragDropEffects.None; return; } if (dragInsertPosition == DragInsertPosition.After) { _IndexList.RemoveAt(currentIndex); _IndexList.Insert(targetIndex + 1, currentvm); } else if (dragInsertPosition == DragInsertPosition.Before) { _IndexList.RemoveAt(currentIndex); _IndexList.Insert(targetIndex - 1, currentvm); } if (currentvm.ParentID == targetVm.ParentID) { /* var sortIndex = currentvm.SortCode; currentvm.SortCode = targetVm.SortCode; targetVm.SortCode = sortIndex;*/ SetTreeListSorter(currentvm.ParentID); return; } e.Effect = DragDropEffects.None; } /// /// 获取拖动过程中的方向 /// 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; } private async void SetTreeListSorter(long parentId) { var sortList = new List(); var targetList = _IndexList.Where(x => x.ParentID == parentId).ToList(); int i = 1; foreach (var item in targetList) { sortList.Add(new Yw.Vmo.Sorter { ID = item.ID, SortCode = i }); i++; } if (!await _bll.UpdateSorter(sortList)) { TipFormHelper.ShowError("修改排序失败!"); } // this.catalogViewModelBindingSource.ResetBindings(false); } 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 SysCatalogViewModel GetViewModel(TreeListNode node) { if (node == null) return default; var vm = this.treeList1.GetDataRecordByNode(node) as SysCatalogViewModel; return vm; } private void barCheckSorter_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (barCheckSorter.Checked) { this.treeList1.OptionsDragAndDrop.DragNodesMode = DragNodesMode.Single; } else { this.treeList1.OptionsDragAndDrop.DragNodesMode = DragNodesMode.None; } } } }