/****************************** * 说明:自定义TreeView * 创建人:龚宇超 * 创建日期:2017-09-04 * 修改人: * 修改日期: * 修改备注: * 版本:1.0.0.0 ******************************/ using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using Lskj.Business.Impl; using Lskj.Business; namespace Lskj.Control { /// /// 自定义TreeView /// public partial class TreeViewEx : UserControl { private string checkValues; private DragTreeNodeEventHandler dragEvent; public delegate void DragTreeNodeEventHandler(TreeNode ParentNode); #region public property /// /// The tree node key field /// public string TreeNodeKeyField; /// /// The tree node text field /// public string TreeNodeTextField; /// 弹出框回车事件 /// public event KeyEventHandler OnGridViewEnter; /// ///单击节点事件 /// public event TreeNodeMouseClickEventHandler OnTreeNodeMouseClick; /// ///双击节点事件 /// public event TreeNodeMouseClickEventHandler OnTreeNodeMouseDoubleClick; /// /// 数据源 /// /// The data source. public DataTable DataSource { private set; get; } /// /// 选中树节点后 /// public event TreeViewEventHandler TreeNodeSelectAfter; /// /// Gets the TreeView. /// /// The TreeView. public TreeView TreeView { get { return tvMain; } } public int SpecNoLen = 2; //树节点长度限制 public string TreeNodeLength; //树节点禁止默认排序 public bool TreeInhibitSort; //树节点选中模式,0默认,1不自动选中子节点 public string TreeCheckModel = "0"; #endregion public TreeViewEx() { InitializeComponent(); this.btnSearch.Click += BtnSearch_Click; this.txt_Key.KeyDown += txt_Key_KeyDown; this.tvMain.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.tvMain_AfterCheck); this.tvMain.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvMain_AfterSelect); this.tvMain.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.OnTreeMouseClick); this.tvMain.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.OnTreeMouseDoubleClick); this.tvMain.KeyUp += new System.Windows.Forms.KeyEventHandler(this.OntvMainKeyUp); } #region public method /// /// 说明:绑定树结构 /// 创建人:龚宇超 /// 创建日期:2017-09-04 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The tree table. public void BindTreeView(DataTable treeTable) { this.DataSource = treeTable; this.tvMain.Nodes.Clear(); this.tvMain.BeginUpdate(); if (treeTable != null && treeTable.Rows.Count > 0) { if (!TreeInhibitSort) { treeTable = treeTable.Rows.Cast().Where(y => !string.IsNullOrEmpty(y[TreeNodeKeyField] + "")).OrderBy(x => x[TreeNodeKeyField]).CopyToDataTable(); } int TreeDigit = treeTable.Rows[0][TreeNodeKeyField].ToString().Length; if (string.IsNullOrEmpty(treeTable.Rows[0][TreeNodeTextField] + "")) { treeTable.Rows.RemoveAt(0); } this.Tag = treeTable.Rows[0]; DataColumnCollection dcc = treeTable.Columns; DataTable treeTableNew = treeTable.Copy(); int lengthLimitation = 0; string sort = "remark"; if (!string.IsNullOrWhiteSpace(TreeNodeLength)) { lengthLimitation = int.Parse(TreeNodeLength); treeTable = treeTable.Rows.Cast().Where(y => !string.IsNullOrEmpty(y[TreeNodeKeyField] + "") && (y[TreeNodeKeyField] + "").Length <= lengthLimitation).OrderBy(x => x[TreeNodeKeyField]).CopyToDataTable(); } Dictionary> nodesDic = new Dictionary>(); for (int i = 0; i < treeTable.Rows.Count; i++) { DataRow dr = treeTable.Rows[i]; string tnKey = dr[TreeNodeKeyField] + ""; string tnStr = dr[TreeNodeTextField] + ""; if (SystemInfo.Instance.TreeSpecialBinding && treeTable.Columns.Contains("pid")) { string pKey = dr["pid"] + ""; //pKey = pKey.Substring(0, pKey.Length - 1); TreeNode[] nodes = tvMain.Nodes.Find(pKey, true); if (nodes.Count() > 0) { TreeNode tNode = nodes[0].Nodes.Add(tnKey, tnStr); if (nodesDic.ContainsKey(tnKey)) { List childNodesList = nodesDic[tnKey]; childNodesList.Add(tNode); } else { List childNodesList = new List(); childNodesList.Add(tNode); nodesDic.Add(tnKey, childNodesList); } tNode.Tag = tnKey; } else { TreeNode tNode = this.TreeView.Nodes.Add(tnKey, tnStr); if (nodesDic.ContainsKey(tnKey)) { List childNodesList = nodesDic[tnKey]; childNodesList.Add(tNode); } else { List childNodesList = new List(); childNodesList.Add(tNode); nodesDic.Add(tnKey, childNodesList); } tNode.Tag = tnKey; } } else { if (tnKey.Length >= TreeDigit * 2) { string pKey = tnKey.Substring(0, tnKey.Length - TreeDigit); //List nodes = nodesDic.ContainsKey(pKey) ? nodesDic[pKey] : new List(); TreeNode[] nodes = tvMain.Nodes.Find(pKey, true); if (nodes.Count() > 0) { TreeNode tNode = nodes[0].Nodes.Add(tnKey, tnStr); if (nodesDic.ContainsKey(tnKey)) { List childNodesList = nodesDic[tnKey]; childNodesList.Add(tNode); } else { List childNodesList = new List(); childNodesList.Add(tNode); nodesDic.Add(tnKey, childNodesList); } tNode.Tag = tnKey; } else { TreeNode tNode = this.TreeView.Nodes.Add(tnKey, tnStr); if (nodesDic.ContainsKey(tnKey)) { List childNodesList = nodesDic[tnKey]; childNodesList.Add(tNode); } else { List childNodesList = new List(); childNodesList.Add(tNode); nodesDic.Add(tnKey, childNodesList); } tNode.Tag = tnKey; } } else { TreeNode node = tvMain.Nodes.Add(tnKey, tnStr); if (nodesDic.ContainsKey(tnKey)) { List childNodesList = nodesDic[tnKey]; childNodesList.Add(node); } else { List childNodesList = new List(); childNodesList.Add(node); nodesDic.Add(tnKey, childNodesList); } node.Tag = tnKey; } } } if (!string.IsNullOrWhiteSpace(TreeNodeLength)) { treeTable = treeTableNew.Copy(); treeTable = treeTable.Rows.Cast().Where(y => !string.IsNullOrEmpty(y[TreeNodeKeyField] + "") && (y[TreeNodeKeyField] + "").Length > lengthLimitation).OrderBy(x => x[sort]).CopyToDataTable(); for (int i = 0; i < treeTable.Rows.Count; i++) { DataRow dr = treeTable.Rows[i]; string tnKey = dr[TreeNodeKeyField] + ""; string tnStr = dr[TreeNodeTextField] + ""; string tnKeyNew = tnKey.Substring(0, lengthLimitation); string sortValue = dr[sort] + ""; if (!sortValue.Contains("-")) { //没有包含 - ,直接加入指定位数的节点中 TreeNode[] nodes = tvMain.Nodes.Find(tnKeyNew, true); if (nodes.Count() > 0) { TreeNode tNode = nodes[0].Nodes.Add(tnKey, tnStr); if (nodesDic.ContainsKey(tnKey)) { List childNodesList = nodesDic[tnKey]; childNodesList.Add(tNode); } else { List childNodesList = new List(); childNodesList.Add(tNode); nodesDic.Add(tnKey, childNodesList); } tNode.Tag = tnKey; } else { TreeNode tNode = this.TreeView.Nodes.Add(tnKey, tnStr); if (nodesDic.ContainsKey(tnKey)) { List childNodesList = nodesDic[tnKey]; childNodesList.Add(tNode); } else { List childNodesList = new List(); childNodesList.Add(tNode); nodesDic.Add(tnKey, childNodesList); } tNode.Tag = tnKey; } } else { //包含 - ,寻找对应特殊排序字段的父节点 //找到特殊排序字段中对应的父级 string parentNodeSortValue = sortValue.Remove(sortValue.LastIndexOf("-"), sortValue.Length - sortValue.LastIndexOf("-")); //根据指定位数的编号和特殊排序字段找到指定父级 DataTable dataTable = treeTable.Rows.Cast().Where(y => (y[TreeNodeKeyField] + "").Substring(0, lengthLimitation).Equals(tnKeyNew) && (y[sort] + "").Equals(parentNodeSortValue)).OrderBy(x => x[sort]).CopyToDataTable(); if (dataTable != null) { TreeNode[] nodes = tvMain.Nodes.Find(dataTable.Rows[0][TreeNodeKeyField] + "", true); if (nodes.Count() > 0) { TreeNode tNode = nodes[0].Nodes.Add(tnKey, tnStr); if (nodesDic.ContainsKey(tnKey)) { List childNodesList = nodesDic[tnKey]; childNodesList.Add(tNode); } else { List childNodesList = new List(); childNodesList.Add(tNode); nodesDic.Add(tnKey, childNodesList); } tNode.Tag = tnKey; } else { TreeNode tNode = this.TreeView.Nodes.Add(tnKey, tnStr); if (nodesDic.ContainsKey(tnKey)) { List childNodesList = nodesDic[tnKey]; childNodesList.Add(tNode); } else { List childNodesList = new List(); childNodesList.Add(tNode); nodesDic.Add(tnKey, childNodesList); } tNode.Tag = tnKey; } } } //TreeNode[] nodes = tvMain.Nodes.Find(tnKeyNew, true); } } } this.tvMain.EndUpdate(); // 默认展开第一个节点 if (this.tvMain.Nodes.Count > 0) this.tvMain.Nodes[0].Expand(); } /// /// 说明:绑定树结构 /// 创建人:龚宇超 /// 创建日期:2017-09-04 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The tree table. public void BindTreeView(DataTable treeTable, string specialId) { string keyField = "pid"; this.DataSource = treeTable; TreeNodeKeyField = specialId; this.tvMain.Nodes.Clear(); this.tvMain.BeginUpdate(); if (treeTable != null && treeTable.Rows.Count > 0) { if (!TreeInhibitSort) { treeTable = treeTable.Rows.Cast().OrderBy(x => x["orderid"] + "").CopyToDataTable(); } DataColumnCollection dcc = treeTable.Columns; for (int i = 0; i < treeTable.Rows.Count; i++) { DataRow dr = treeTable.Rows[i]; string tnparentKey = dr[keyField] + ""; string tnKey = dr[TreeNodeKeyField] + ""; string tnStr = dr[TreeNodeTextField] + ""; if (tnparentKey == "0") { TreeNode tNode = this.TreeView.Nodes.Add(tnKey, tnStr); tNode.Tag = tnKey; DataRow[] rowItems = treeTable.Rows.Cast().Where(x => tnKey.Equals(x[keyField] + "")).ToArray(); if (rowItems != null && rowItems.Count() > 0) { AddChildNode(tNode, keyField, treeTable, rowItems.OrderBy(x => Convert.ToInt32(x["orderid"] + "")).CopyToDataTable()); } } } } this.tvMain.EndUpdate(); // 默认展开第一个节点 if (this.tvMain.Nodes.Count > 0) this.tvMain.Nodes[0].Expand(); } /// /// 说明:绑定树结构 /// 创建人:龚宇超 /// 创建日期:2017-09-04 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The tree table. public void BindTreeView(DataTable treeTable, string TreeNodeKeyField, string TreeNodeTextField, string tagStrField) { this.DataSource = treeTable; this.tvMain.Nodes.Clear(); this.tvMain.BeginUpdate(); if (treeTable != null && treeTable.Rows.Count > 0) { treeTable = treeTable.Rows.Cast().Where(y => !string.IsNullOrEmpty(y[TreeNodeKeyField] + "")).OrderBy(x => x[TreeNodeKeyField]).CopyToDataTable(); int TreeDigit = treeTable.Rows[0][TreeNodeKeyField].ToString().Length; if (string.IsNullOrEmpty(treeTable.Rows[0][TreeNodeTextField] + "")) { treeTable.Rows.RemoveAt(0); } this.Tag = treeTable.Rows[0]; DataColumnCollection dcc = treeTable.Columns; for (int i = 0; i < treeTable.Rows.Count; i++) { DataRow dr = treeTable.Rows[i]; string tnKey = dr[TreeNodeKeyField] + ""; string tnStr = dr[TreeNodeTextField] + ""; string tagStr = dr[tagStrField] + ""; if (tnKey.Length >= TreeDigit * 2) { string pKey = tnKey.Substring(0, tnKey.Length - TreeDigit); TreeNode[] nodes = tvMain.Nodes.Find(pKey, true); if (nodes.Count() > 0) { TreeNode tNode = nodes[0].Nodes.Add(tnKey, tnStr); tNode.Tag = tagStr; } else { TreeNode tNode = this.TreeView.Nodes.Add(tnKey, tnStr); tNode.Tag = tagStr; } } else { TreeNode node = tvMain.Nodes.Add(tnKey, tnStr); node.Tag = tagStr; } } } this.tvMain.EndUpdate(); // 默认展开第一个节点 if (this.tvMain.Nodes.Count > 0) this.tvMain.Nodes[0].Expand(); } /// /// 说明:添加子节点 /// 创建人:龚宇超 /// 创建日期:2020-12-20 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The tree node. /// The childs. public void AddChildNode(TreeNode treeNode, string keyField, DataTable treeTable, DataTable childs) { foreach (DataRow item in childs.Rows) { string tnparentKey = item[keyField] + ""; string tnKey = item[TreeNodeKeyField] + ""; string tnStr = item[TreeNodeTextField] + ""; TreeNode tNode = treeNode.Nodes.Add(tnKey, tnStr); tNode.Tag = tnKey; DataRow[] rowItems = treeTable.Rows.Cast().Where(x => tnKey.Equals(x[keyField] + "")).ToArray(); if (rowItems != null && rowItems.Count() > 0) { AddChildNode(tNode, keyField, treeTable, rowItems.OrderBy(x => Convert.ToInt32(x["orderid"] + "")).CopyToDataTable()); } } } /// /// 说明:开启树结构拖拽 /// 创建人:龚宇超 /// 创建日期:2020-12-20 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The drag call. public void EnableTreeNodeDrag(DragTreeNodeEventHandler dragEvent) { this.dragEvent = dragEvent; this.tvMain.AllowDrop = true; this.tvMain.ItemDrag += new ItemDragEventHandler(OnMainItemDrag); this.tvMain.DragEnter += new DragEventHandler(tvMain_DragEnter); this.tvMain.DragOver += new DragEventHandler(tvMain_DragOver); this.tvMain.DragDrop += new DragEventHandler(tvMain_DragDrop); this.tvMain.KeyDown += new KeyEventHandler(tvMain_KeyDown); } /// /// 说明:绑定特殊树结构 /// 创建人:王一帆 /// 创建日期:2019-09-05 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The tree table. public void BindSpecialTreeView(DataTable treeTable) { this.DataSource = treeTable; this.tvMain.Nodes.Clear(); this.tvMain.BeginUpdate(); if (treeTable != null && treeTable.Rows.Count > 0) { treeTable = treeTable.Rows.Cast().Where(y => !string.IsNullOrEmpty(y[TreeNodeKeyField] + "")).OrderBy(x => x[TreeNodeKeyField]).CopyToDataTable(); this.Tag = treeTable.Rows[0]; SpecNoLen = treeTable.Rows[0]["SpeciesNo"].ToString().Length; for (int i = 0; i < treeTable.Rows.Count; i++) { DataRow dr = treeTable.Rows[i]; string tnKey = dr[TreeNodeKeyField] + ""; string tnStr = dr[TreeNodeTextField] + ""; if (SystemInfo.Instance.TreeSpecialBinding && treeTable.Columns.Contains("pid")) { string pKey = dr["pid"] + ""; TreeNode[] nodes = tvMain.Nodes.Find(pKey, true); if (nodes.Count() > 0) { TreeNode tNode = nodes[0].Nodes.Add(tnKey, tnStr); tNode.Tag = tnKey; } else { TreeNode tNode = this.TreeView.Nodes.Add(tnKey, tnStr); tNode.Tag = tnKey; } } else { if (tnKey.Length > SpecNoLen) { String pKey = tnKey.Substring(0, tnKey.Length - SpecNoLen); TreeNode[] nodes = tvMain.Nodes.Find(pKey, true); if (nodes.Length > 0) { TreeNode tNode = nodes[0].Nodes.Add(tnKey, tnStr); tNode.Tag = tnKey; } } else { TreeNode node = tvMain.Nodes.Add(tnKey, tnStr); node.Tag = tnKey; } } } } this.tvMain.EndUpdate(); } /// /// 说明:获取控件选择值 /// 创建人:龚宇超 /// 创建日期:2017-09-04 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// System.String. public string GetCheckValues(bool isRootNode) { checkValues = string.Empty; foreach (TreeNode tn in tvMain.Nodes) GetCheckedState(tn, isRootNode); return checkValues.Trim(','); } public string GetCheckValues() { checkValues = string.Empty; foreach (TreeNode tn in tvMain.Nodes) GetCheckedState(tn, true); return checkValues.Trim(','); } /// /// 说明:获取复选框选中值 /// 创建人:龚宇超 /// 创建日期:2017-09-04 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// System.String. public string GetSelectValue() { checkValues = string.Empty; TreeNode currNode = tvMain.SelectedNode; if (currNode != null) { checkValues = currNode.Name; } return checkValues; } /// /// 说明:获取选中节点值 /// 创建人:龚宇超 /// 创建日期:2018-01-02 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// System.String. public string GetSelectNodeValue() { string parentValue = string.Empty; if (this.TreeView.SelectedNode != null) { parentValue = this.TreeView.SelectedNode.Tag + ""; } return parentValue; } /// /// 说明: /// 创建人:龚宇超 /// 创建日期: /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public void DeleteTreeNode(TreeNode treeNode, TreeNode deleteNode) { var nodes = treeNode == null ? this.tvMain.Nodes : treeNode.Nodes; foreach (TreeNode item in nodes) { if (item.Tag == deleteNode.Tag) { this.tvMain.Nodes.Remove(item); break; } if (item.Nodes != null && item.Nodes.Count > 0) { this.DeleteTreeNode(item, deleteNode); } } } /// /// 取消勾选所有节点 /// public void UnCheckAllNodes() { try { foreach (TreeNode treeNode in this.TreeView.Nodes) { UnCheckNode(treeNode); } } catch (Exception) { } } /// /// 取消勾选节点及子节点 /// private void UnCheckNode(TreeNode treeNode) { if (treeNode.Nodes != null && treeNode.Nodes.Count > 0) { foreach (TreeNode item in treeNode.Nodes) { item.Checked = false; UnCheckNode(item); } } } #endregion #region private method /// /// 说明:选择后 /// 创建人:龚宇超 /// 创建日期:2017-09-04 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. private void tvMain_AfterSelect(object sender, TreeViewEventArgs e) { try { if (e.Action == TreeViewAction.ByMouse && this.TreeNodeSelectAfter != null) { this.TreeNodeSelectAfter(sender, e); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:选中后 /// 创建人:龚宇超 /// 创建日期:2017-09-04 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The source of the event. /// The instance containing the event data. public void tvMain_AfterCheck(object sender, TreeViewEventArgs e) { try { if (e.Action == TreeViewAction.ByMouse) { if (!TreeCheckModel.Equals("1"))//不等于1选中子节点 { SetChildNodeCheckedState(e.Node, e.Node.Checked); } } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:选中节点之后,选中节点的所有子节点 /// 创建人:龚宇超 /// 创建日期:2017-09-04 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The curr node. private void GetCheckedState(TreeNode currNode, bool isRootNode = false) { bool isContain = currNode.Nodes.Count > 0 && !isRootNode; if (currNode.Checked && !isContain) checkValues += "'" + currNode.Name + "',"; TreeNodeCollection nodes = currNode.Nodes; foreach (TreeNode tn in nodes) { GetCheckedState(tn, isRootNode); } } /// /// 说明:选中节点之后,选中节点的所有子节点 /// 创建人:龚宇超 /// 创建日期:2017-09-04 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The curr node. private void GetCheckedStateAll(TreeNode currNode, bool isRootNode = false) { if (currNode.Checked) checkValues += "'" + currNode.Name + "',"; TreeNodeCollection nodes = currNode.Nodes; foreach (TreeNode tn in nodes) { GetCheckedStateAll(tn, isRootNode); } } /// /// 说明:选中当权节点下所有子节点 /// 创建人:龚宇超 /// 创建日期:2017-11-02 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The curr node. /// if set to true [state]. private void SetChildNodeCheckedState(TreeNode currNode, bool state) { TreeNodeCollection nodes = currNode.Nodes; if (nodes.Count > 0) foreach (TreeNode tn in nodes) { tn.Checked = state; SetChildNodeCheckedState(tn, state); } } #endregion #region 树结构拖拽 /// /// 说明: /// 创建人:龚宇超 /// 创建日期:2020-12-20 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. void OnMainItemDrag(object sender, ItemDragEventArgs e) { try { if (e.Button == MouseButtons.Left) { DoDragDrop(e.Item, DragDropEffects.Move); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } void tvMain_DragEnter(object sender, DragEventArgs e) { //e.Effect = DragDropEffects.Move; } void tvMain_DragOver(object sender, DragEventArgs e) { try { if (e.Data.GetDataPresent(typeof(TreeNode))) { TreeView tv = sender as TreeView; //获得拖放中的节点 TreeNode moveNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode"); tv.SelectedNode = tv.GetNodeAt(tv.PointToClient(new Point(e.X, e.Y))); if (tv.SelectedNode != null) tv.SelectedNode.Expand(); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } void tvMain_DragDrop(object sender, DragEventArgs e) { try { if (e.Data.GetDataPresent(typeof(TreeNode))) { TreeView tv = sender as TreeView; //获得拖放中的节点 TreeNode moveNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode"); //根据鼠标坐标确定要移动到的目标节点 Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y)); TreeNode targetNode = tv.GetNodeAt(pt); //如果目标节点为分组则添加到下级节点的未端,如果目标节点为素材文件则添加为同级节点 TreeNode NewMoveNode = (TreeNode)moveNode.Clone(); if (moveNode.Parent != targetNode.Parent) { return; } if (moveNode.NextNode == targetNode) { targetNode.Parent.Nodes.Insert(targetNode.Index + 1, NewMoveNode); } else { targetNode.Parent.Nodes.Insert(targetNode.Index, NewMoveNode); } //移除拖放的节点 moveNode.Remove(); //更新当前拖动的节点选择 tv.SelectedNode = NewMoveNode; if (dragEvent != null) this.dragEvent(tv.SelectedNode.Parent); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } /// /// 绑定键盘事件 /// /// /// void tvMain_KeyDown(object sender, KeyEventArgs e) { try { TreeView tv = sender as TreeView; //获得拖放中的节点 TreeNode node = tv.SelectedNode; //获得选中节点的值 if (e.Modifiers.CompareTo(Keys.Control) == 0 && e.KeyCode == Keys.Down) { if (node.NextNode == null) //下一个节点为Null时返回 { return; } TreeNode dowNode = node.NextNode; TreeNode newNode = (TreeNode)node.Clone(); //克隆下一个节点及其所有的子节点 node.Parent.Nodes.Insert(dowNode.Index + 1, newNode); //node.Parent.Nodes.Insert(node.Index, newNode); node.Remove(); //删除掉选中节点的下一个节点 tv.SelectedNode = newNode; //重新选中 if (dragEvent != null) this.dragEvent(tv.SelectedNode.Parent); } if (e.Modifiers.CompareTo(Keys.Control) == 0 && e.KeyCode == Keys.Up) { if (node.PrevNode == null) //下一个节点为Null时返回 { return; } TreeNode upNode = node.PrevNode; //获得选中节点的上一个节点 TreeNode newNode = (TreeNode)node.Clone(); //克隆选中的节点 node.Parent.Nodes.Insert(upNode.Index, newNode); node.Remove(); tv.SelectedNode = newNode; if (dragEvent != null) this.dragEvent(tv.SelectedNode.Parent); } } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } #endregion #region 注册回调函数 /// /// 说明:树结构回车回调函数 /// 创建人:王一帆 /// 创建日期:2021-03-29 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The curr node. /// if set to true [state]. private void OntvMainKeyUp(object sender, KeyEventArgs e) { try { TreeNode node = this.TreeView.SelectedNode; if (this.OnGridViewEnter != null) this.OnGridViewEnter(sender, e); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:单击树结构回调函数 /// 创建人:王一帆 /// 创建日期:2021-03-29 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The curr node. /// if set to true [state]. private void OnTreeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { try { if (this.OnTreeNodeMouseClick != null) this.OnTreeNodeMouseClick(sender, e); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } /// /// 说明:双击树结构回调函数 /// 创建人:曹屹峰 /// 创建日期:2023-09-22 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The curr node. /// if set to true [state]. private void OnTreeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { try { if (this.OnTreeNodeMouseDoubleClick != null) this.OnTreeNodeMouseDoubleClick(sender, e); } catch (Exception ex) { string Message = ErrorMessage.PromptErrorMessage(ex); MessageUtil.Show(Message, ex.Message); } } #endregion //查询出来的节点集合 public List searchtreeNodes = new List(); private void BtnSearch_Click(object sender, EventArgs e) { //把上一次搜索的还原 if (searchtreeNodes.Count > 0) { for (int i = 0; i < searchtreeNodes.Count; i++) { TreeNode temp = searchtreeNodes[i]; //展开对应的节点 ExpandNode(temp); if (i == 0 && temp.Parent != null) { tvMain.SelectedNode = temp.Parent; } temp.BackColor = Color.White; //temp.ForeColor = Color.Blue; } } string name = txt_Key.Text + ""; if (string.IsNullOrWhiteSpace(name)) return; //收起全部节点 if (this.tvMain.Nodes.Count > 0) { //tvMain.SelectedNode.Expand(); tvMain.SelectedNode = tvMain.Nodes[0]; tvMain.SelectedNode.Collapse(); } //清除数据 searchtreeNodes = new List(); //获取全部节点中符合条件的节点 foreach (TreeNode node in tvMain.Nodes) { SearchLayernew(node, name); } for (int i = 0; i < searchtreeNodes.Count; i++) { TreeNode temp = searchtreeNodes[i]; //展开对应的节点 ExpandNode(temp); if (i == 0 && temp.Parent != null) { tvMain.SelectedNode = temp.Parent; } temp.BackColor = Color.Yellow; } } //展开对应的节点和它的父节点 private void ExpandNode(TreeNode node) { if (node.Parent != null) { node.Expand(); ExpandNode(node.Parent); } } //获得符合条件的节点 private void SearchLayernew(TreeNode node, string name) { //node.BackColor = Color.White; //node.ForeColor = Color.Black; if (string.Equals(node.Text, name) || node.Text.Contains(name)) { searchtreeNodes.Add(node); } if (node.Nodes.Count != 0) { for (int i = 0; i < node.Nodes.Count; i++) { SearchLayernew(node.Nodes[i], name); } } } /// /// 搜索框回车事件 /// /// /// private void txt_Key_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { BtnSearch_Click(null, null); } } } }