Files
lserp_cs_6.0/插件库/Lskj.Control/TreeViewEx.cs
T
2026-07-02 10:11:39 +00:00

1125 lines
46 KiB
C#

/******************************
* 说明:自定义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
{
/// <summary>
/// 自定义TreeView
/// </summary>
public partial class TreeViewEx : UserControl
{
private string checkValues;
private DragTreeNodeEventHandler dragEvent;
public delegate void DragTreeNodeEventHandler(TreeNode ParentNode);
#region public property
/// <summary>
/// The tree node key field
/// </summary>
public string TreeNodeKeyField;
/// <summary>
/// The tree node text field
/// </summary>
public string TreeNodeTextField;
/// 弹出框回车事件
/// </summary>
public event KeyEventHandler OnGridViewEnter;
/// <summary>
///单击节点事件
/// </summary>
public event TreeNodeMouseClickEventHandler OnTreeNodeMouseClick;
/// <summary>
///双击节点事件
/// </summary>
public event TreeNodeMouseClickEventHandler OnTreeNodeMouseDoubleClick;
/// <summary>
/// 数据源
/// </summary>
/// <value>The data source.</value>
public DataTable DataSource { private set; get; }
/// <summary>
/// 选中树节点后
/// </summary>
public event TreeViewEventHandler TreeNodeSelectAfter;
/// <summary>
/// Gets the TreeView.
/// </summary>
/// <value>The TreeView.</value>
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
/// <summary>
/// <para>说明:绑定树结构</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-09-04 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="treeTable">The tree table.</param>
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<DataRow>().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<DataRow>().Where(y => !string.IsNullOrEmpty(y[TreeNodeKeyField] + "") && (y[TreeNodeKeyField] + "").Length <= lengthLimitation).OrderBy(x => x[TreeNodeKeyField]).CopyToDataTable();
}
Dictionary<string, List<TreeNode>> nodesDic = new Dictionary<string, List<TreeNode>>();
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<TreeNode> childNodesList = nodesDic[tnKey];
childNodesList.Add(tNode);
}
else
{
List<TreeNode> childNodesList = new List<TreeNode>();
childNodesList.Add(tNode);
nodesDic.Add(tnKey, childNodesList);
}
tNode.Tag = tnKey;
}
else
{
TreeNode tNode = this.TreeView.Nodes.Add(tnKey, tnStr);
if (nodesDic.ContainsKey(tnKey))
{
List<TreeNode> childNodesList = nodesDic[tnKey];
childNodesList.Add(tNode);
}
else
{
List<TreeNode> childNodesList = new List<TreeNode>();
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<TreeNode> nodes = nodesDic.ContainsKey(pKey) ? nodesDic[pKey] : new List<TreeNode>();
TreeNode[] nodes = tvMain.Nodes.Find(pKey, true);
if (nodes.Count() > 0)
{
TreeNode tNode = nodes[0].Nodes.Add(tnKey, tnStr);
if (nodesDic.ContainsKey(tnKey))
{
List<TreeNode> childNodesList = nodesDic[tnKey];
childNodesList.Add(tNode);
}
else
{
List<TreeNode> childNodesList = new List<TreeNode>();
childNodesList.Add(tNode);
nodesDic.Add(tnKey, childNodesList);
}
tNode.Tag = tnKey;
}
else
{
TreeNode tNode = this.TreeView.Nodes.Add(tnKey, tnStr);
if (nodesDic.ContainsKey(tnKey))
{
List<TreeNode> childNodesList = nodesDic[tnKey];
childNodesList.Add(tNode);
}
else
{
List<TreeNode> childNodesList = new List<TreeNode>();
childNodesList.Add(tNode);
nodesDic.Add(tnKey, childNodesList);
}
tNode.Tag = tnKey;
}
}
else
{
TreeNode node = tvMain.Nodes.Add(tnKey, tnStr);
if (nodesDic.ContainsKey(tnKey))
{
List<TreeNode> childNodesList = nodesDic[tnKey];
childNodesList.Add(node);
}
else
{
List<TreeNode> childNodesList = new List<TreeNode>();
childNodesList.Add(node);
nodesDic.Add(tnKey, childNodesList);
}
node.Tag = tnKey;
}
}
}
if (!string.IsNullOrWhiteSpace(TreeNodeLength))
{
treeTable = treeTableNew.Copy();
treeTable = treeTable.Rows.Cast<DataRow>().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<TreeNode> childNodesList = nodesDic[tnKey];
childNodesList.Add(tNode);
}
else
{
List<TreeNode> childNodesList = new List<TreeNode>();
childNodesList.Add(tNode);
nodesDic.Add(tnKey, childNodesList);
}
tNode.Tag = tnKey;
}
else
{
TreeNode tNode = this.TreeView.Nodes.Add(tnKey, tnStr);
if (nodesDic.ContainsKey(tnKey))
{
List<TreeNode> childNodesList = nodesDic[tnKey];
childNodesList.Add(tNode);
}
else
{
List<TreeNode> childNodesList = new List<TreeNode>();
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<DataRow>().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<TreeNode> childNodesList = nodesDic[tnKey];
childNodesList.Add(tNode);
}
else
{
List<TreeNode> childNodesList = new List<TreeNode>();
childNodesList.Add(tNode);
nodesDic.Add(tnKey, childNodesList);
}
tNode.Tag = tnKey;
}
else
{
TreeNode tNode = this.TreeView.Nodes.Add(tnKey, tnStr);
if (nodesDic.ContainsKey(tnKey))
{
List<TreeNode> childNodesList = nodesDic[tnKey];
childNodesList.Add(tNode);
}
else
{
List<TreeNode> childNodesList = new List<TreeNode>();
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();
}
/// <summary>
/// <para>说明:绑定树结构</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-09-04 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="treeTable">The tree table.</param>
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<DataRow>().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<DataRow>().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();
}
/// <summary>
/// <para>说明:绑定树结构</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-09-04 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="treeTable">The tree table.</param>
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<DataRow>().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();
}
/// <summary>
/// <para>说明:添加子节点</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2020-12-20 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="treeNode">The tree node.</param>
/// <param name="childs">The childs.</param>
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<DataRow>().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());
}
}
}
/// <summary>
/// <para>说明:开启树结构拖拽</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2020-12-20 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="dragCall">The drag call.</param>
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);
}
/// <summary>
/// <para>说明:绑定特殊树结构</para>
/// <para>创建人:王一帆</para>
/// <para>创建日期:2019-09-05 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="treeTable">The tree table.</param>
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<DataRow>().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();
}
/// <summary>
/// <para>说明:获取控件选择值</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-09-04 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <returns>System.String.</returns>
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(',');
}
/// <summary>
/// <para>说明:获取复选框选中值</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-09-04 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <returns>System.String.</returns>
public string GetSelectValue()
{
checkValues = string.Empty;
TreeNode currNode = tvMain.SelectedNode;
if (currNode != null)
{
checkValues = currNode.Name;
}
return checkValues;
}
/// <summary>
/// <para>说明:获取选中节点值</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2018-01-02 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <returns>System.String.</returns>
public string GetSelectNodeValue()
{
string parentValue = string.Empty;
if (this.TreeView.SelectedNode != null)
{
parentValue = this.TreeView.SelectedNode.Tag + "";
}
return parentValue;
}
/// <summary>
/// <para>说明:</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期: </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
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);
}
}
}
/// <summary>
/// 取消勾选所有节点
/// </summary>
public void UnCheckAllNodes()
{
try
{
foreach (TreeNode treeNode in this.TreeView.Nodes)
{
UnCheckNode(treeNode);
}
}
catch (Exception)
{
}
}
/// <summary>
/// 取消勾选节点及子节点
/// </summary>
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
/// <summary>
/// <para>说明:选择后</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-09-04 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="TreeViewEventArgs"/> instance containing the event data.</param>
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);
}
}
/// <summary>
/// <para>说明:选中后</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-09-04 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="TreeViewEventArgs"/> instance containing the event data.</param>
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);
}
}
/// <summary>
/// <para>说明:选中节点之后,选中节点的所有子节点</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-09-04 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="currNode">The curr node.</param>
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);
}
}
/// <summary>
/// <para>说明:选中节点之后,选中节点的所有子节点</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-09-04 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="currNode">The curr node.</param>
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);
}
}
/// <summary>
/// <para>说明:选中当权节点下所有子节点</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-02 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="currNode">The curr node.</param>
/// <param name="state">if set to <c>true</c> [state].</param>
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 树结构拖拽
/// <summary>
/// <para>说明:</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2020-12-20 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="ItemDragEventArgs"/> instance containing the event data.</param>
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);
}
}
/// <summary>
/// 绑定键盘事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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 注册回调函数
/// <summary>
/// <para>说明:树结构回车回调函数</para>
/// <para>创建人:王一帆</para>
/// <para>创建日期:2021-03-29 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="currNode">The curr node.</param>
/// <param name="state">if set to <c>true</c> [state].</param>
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);
}
}
/// <summary>
/// <para>说明:单击树结构回调函数</para>
/// <para>创建人:王一帆</para>
/// <para>创建日期:2021-03-29 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="currNode">The curr node.</param>
/// <param name="state">if set to <c>true</c> [state].</param>
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);
}
}
/// <summary>
/// <para>说明:双击树结构回调函数</para>
/// <para>创建人:曹屹峰</para>
/// <para>创建日期:2023-09-22 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="currNode">The curr node.</param>
/// <param name="state">if set to <c>true</c> [state].</param>
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<TreeNode> searchtreeNodes = new List<TreeNode>();
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<TreeNode>();
//获取全部节点中符合条件的节点
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);
}
}
}
/// <summary>
/// 搜索框回车事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txt_Key_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
BtnSearch_Click(null, null);
}
}
}
}