public partial class TreeViewControl : UserControl
{
public TreeViewControl()
{
InitializeComponent();
}
public bool IsShowCheckBox
{
set
{
this.treeView1.CheckBoxes = value;
}
get
{
return this.treeView1.CheckBoxes;
}
}
/// <summary>
/// 加载树
/// </summary>
/// <param name="source">数据源</param>
public void LoadTree(List<TreeViewEntity> source)
{
if (source == null || source.Count == 0)
return;
treeView1.Nodes.Clear();
List<TreeViewEntity> _roots = source.Where(item => item.ParentNodeText.ToLower() == "root").ToList();
string _root = "";
if (_roots.Count == 0)
{
throw new Exception("没有找到相应根节点,根节点的ParentNodeText值应为root");
}
else
{
_root = _roots[0].NodeText;
}
TreeNode root = new TreeNode(_root);
root.Expand();
treeView1.Nodes.Add(root);
AddChildNodes(source, root);
}
private void AddChildNodes(List<TreeViewEntity> source, TreeNode node)
{
TreeNode _node;
List<TreeViewEntity> _roots = source.Where(item => item.ParentNodeText.ToLower() == node.Text).ToList();
foreach (TreeViewEntity item in _roots)
{
_node = new TreeNode(item.NodeText);
node.Nodes.Add(_node);
AddChildNodes(source, _node);
}
}
#region 联动事件
/// 全选事件
/// <summary>
/// 全选事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (IsShowCheckBox == false)
return;
this.Cursor = Cursors.WaitCursor;
CheckChildNodes(e.Node, e.Node.Checked);
this.Cursor = Cursors.Default;
}
/// 勾选子节点
/// <summary>
/// 勾选子节点
/// </summary>
/// <param name="node"></param>
/// <param name="isChecked"></param>
private void CheckChildNodes(TreeNode node, bool isChecked)
{
node.Checked = isChecked;
if (node.Nodes.Count > 0)
{
foreach (TreeNode item in node.Nodes)
{
CheckChildNodes(item, isChecked);
}
}
}
/// 子联动父事件
/// <summary>
/// 子联动父事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (IsShowCheckBox == false)
return;
this.Cursor = Cursors.WaitCursor;
if (e.Node.Checked)
{
CheckParentNode(e.Node);
}
else
{
UncheckParentNode(e.Node);
}
this.Cursor = Cursors.Default;
}
/// 勾选父节点
/// <summary>
/// 勾选父节点
/// </summary>
/// <param name="node"></param>
private void CheckParentNode(TreeNode node)
{
if (node.Parent != null)
{
node.Parent.Checked = true;
CheckParentNode(node.Parent);
}
}
/// 取消父节点勾选
/// <summary>
/// 取消父节点勾选
/// </summary>
/// <param name="node"></param>
private void UncheckParentNode(TreeNode node)
{
if (node.Parent != null)
{
if (CheckChildNodesStatus(node.Parent))
{
node.Parent.Checked = false;
UncheckParentNode(node.Parent);
}
}
}
/// 获取子节点状态
/// <summary>
/// 获取子节点状态
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private bool CheckChildNodesStatus(TreeNode node)
{
foreach (TreeNode item in node.Nodes)
{
if (item.Checked == true)
return false;
}
return true;
}
#endregion
}
public class TreeViewEntity
{
public TreeViewEntity(string parentNodeText, string nodeText)
{
ParentNodeText = parentNodeText;
NodeText = nodeText;
}
/// <summary>
/// 父节点,如果当前节点已经为父节点,则赋值为"root"
/// </summary>
public string ParentNodeText { set; get; }
/// <summary>
/// 当前节点
/// </summary>
public string NodeText { set; get; }
}
{
public TreeViewControl()
{
InitializeComponent();
}
public bool IsShowCheckBox
{
set
{
this.treeView1.CheckBoxes = value;
}
get
{
return this.treeView1.CheckBoxes;
}
}
/// <summary>
/// 加载树
/// </summary>
/// <param name="source">数据源</param>
public void LoadTree(List<TreeViewEntity> source)
{
if (source == null || source.Count == 0)
return;
treeView1.Nodes.Clear();
List<TreeViewEntity> _roots = source.Where(item => item.ParentNodeText.ToLower() == "root").ToList();
string _root = "";
if (_roots.Count == 0)
{
throw new Exception("没有找到相应根节点,根节点的ParentNodeText值应为root");
}
else
{
_root = _roots[0].NodeText;
}
TreeNode root = new TreeNode(_root);
root.Expand();
treeView1.Nodes.Add(root);
AddChildNodes(source, root);
}
private void AddChildNodes(List<TreeViewEntity> source, TreeNode node)
{
TreeNode _node;
List<TreeViewEntity> _roots = source.Where(item => item.ParentNodeText.ToLower() == node.Text).ToList();
foreach (TreeViewEntity item in _roots)
{
_node = new TreeNode(item.NodeText);
node.Nodes.Add(_node);
AddChildNodes(source, _node);
}
}
#region 联动事件
/// 全选事件
/// <summary>
/// 全选事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (IsShowCheckBox == false)
return;
this.Cursor = Cursors.WaitCursor;
CheckChildNodes(e.Node, e.Node.Checked);
this.Cursor = Cursors.Default;
}
/// 勾选子节点
/// <summary>
/// 勾选子节点
/// </summary>
/// <param name="node"></param>
/// <param name="isChecked"></param>
private void CheckChildNodes(TreeNode node, bool isChecked)
{
node.Checked = isChecked;
if (node.Nodes.Count > 0)
{
foreach (TreeNode item in node.Nodes)
{
CheckChildNodes(item, isChecked);
}
}
}
/// 子联动父事件
/// <summary>
/// 子联动父事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (IsShowCheckBox == false)
return;
this.Cursor = Cursors.WaitCursor;
if (e.Node.Checked)
{
CheckParentNode(e.Node);
}
else
{
UncheckParentNode(e.Node);
}
this.Cursor = Cursors.Default;
}
/// 勾选父节点
/// <summary>
/// 勾选父节点
/// </summary>
/// <param name="node"></param>
private void CheckParentNode(TreeNode node)
{
if (node.Parent != null)
{
node.Parent.Checked = true;
CheckParentNode(node.Parent);
}
}
/// 取消父节点勾选
/// <summary>
/// 取消父节点勾选
/// </summary>
/// <param name="node"></param>
private void UncheckParentNode(TreeNode node)
{
if (node.Parent != null)
{
if (CheckChildNodesStatus(node.Parent))
{
node.Parent.Checked = false;
UncheckParentNode(node.Parent);
}
}
}
/// 获取子节点状态
/// <summary>
/// 获取子节点状态
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private bool CheckChildNodesStatus(TreeNode node)
{
foreach (TreeNode item in node.Nodes)
{
if (item.Checked == true)
return false;
}
return true;
}
#endregion
}
public class TreeViewEntity
{
public TreeViewEntity(string parentNodeText, string nodeText)
{
ParentNodeText = parentNodeText;
NodeText = nodeText;
}
/// <summary>
/// 父节点,如果当前节点已经为父节点,则赋值为"root"
/// </summary>
public string ParentNodeText { set; get; }
/// <summary>
/// 当前节点
/// </summary>
public string NodeText { set; get; }
}
本文介绍了一个自定义的树形控件实现,该控件支持显示复选框,并实现了全选与子节点勾选联动的功能。通过加载特定的数据源,可以构建出具有层级关系的树形结构。
576

被折叠的 条评论
为什么被折叠?



