【WinForm】TreeView使用,添加节点,拖拽(以年级,班级,学生为例)

先看看效果

【WinForm】TreeView使用,添加节点,拖拽(以年级,班级,学生为例)

首选是界面的布局

 

为了避免添加层级的混乱,先规定好层级的关系

  • 不能在年级层级添加班级和学生
  • 不能在班级层级添加年级和学生
  • 等等

 

treeView1.SelectedNode.Level 表示树视图的深度

我们可以以此来区分层级关系

  • 年级 树视图的深度为0
  • 班级 树视图的深度为1
  • 学生 树视图的深度为2

添加年级

TreeNode treeNode = new TreeNode(textBox1.Text);
treeView1.Nodes.Add(treeNode);

添加班级

  • 如果选择的节点是年级,则在下级添加
  • 如果选择的节点是班级,则在同级添加
  • 添加学生亦是如此
if (treeView1.SelectedNode == null) return;

TreeNode treeNode = new TreeNode(textBox2.Text);

if (treeView1.SelectedNode.Level == 0)
{
    treeView1.SelectedNode.Nodes.Add(treeNode);
}
else if(treeView1.SelectedNode.Level == 1)
{
    treeView1.SelectedNode.Parent.Nodes.Add(treeNode);
}

添加学生

if (treeView1.SelectedNode == null) return;

TreeNode treeNode = new TreeNode(textBox3.Text);

if (treeView1.SelectedNode.Level == 1)
{
    treeView1.SelectedNode.Nodes.Add(treeNode);
}
else if(treeView1.SelectedNode.Level == 2)
{
    treeView1.SelectedNode.Parent.Nodes.Add(treeNode);
}

修改节点

设置treeView1的LabelEdit为True

选择节点后,在点击一次即可修改

【WinForm】TreeView使用,添加节点,拖拽(以年级,班级,学生为例)

 

删除节点,删除年级,班级,学生都一样

if (treeView1.SelectedNode == null) return;
treeView1.SelectedNode.Remove();

 

节点拖拽

学生在班级之间的拖拽,班级在年级之间的拖拽(比如升学)

private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
{
    DoDragDrop(e.Item, DragDropEffects.Move);//开始拖放操作
}

private void treeView1_DragEnter(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Move;
}

private void treeView1_DragDrop(object sender, DragEventArgs e)
{
    TreeNode drayNode = null;//拖拽的对象
    if (e.Data.GetDataPresent(typeof(TreeNode)))
        drayNode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));

    Point point = treeView1.PointToClient(new Point(e.X, e.Y));//目标节点位置
    TreeNode targetTreeNode = treeView1.GetNodeAt(point);//目标节点

    //目标节点不为空,目标节点不属于本身
    if (targetTreeNode != null && targetTreeNode != drayNode)
    {
        if (drayNode.Level == targetTreeNode.Level)//拖到同级,如学生拖到学生
        {
            TreeNode tempNode = drayNode;
            drayNode.Remove();
            targetTreeNode.Parent.Nodes.Add(tempNode);
        }
        else if (drayNode.Level == targetTreeNode.Level + 1)//拖到上级,如学生拖到班级
        {
            TreeNode tempNode = drayNode;
            drayNode.Remove();
            targetTreeNode.Nodes.Add(tempNode);
        }
    }
}

把小明从一年(1)班,拖到二年(1)班

【WinForm】TreeView使用,添加节点,拖拽(以年级,班级,学生为例)

把一年(1)班的所有人升为二年(4)班

【WinForm】TreeView使用,添加节点,拖拽(以年级,班级,学生为例)