C#TreeView数据绑定+拖动节点

来源:互联网 发布:鸡鸣狗吠 兄嫂当知之 编辑:程序博客网 时间:2024/06/11 19:59

搞了好几天啊,郁闷死了。以前学习过,但是忘了,现在搞起来还挺头疼!


我的资源上有成品!


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace treeview2
{
    public partial class Form1 : Form
    {
        dbhelper db;
        string cao = "";
        TreeNode tnd;
        public Form1()
        {
            db = new dbhelper();
            InitializeComponent();
            bdtree();
        }


        private void bdtree()
        {
            db.Execute("update t_tree set isbd=0", CommandType.Text);
            DataTable dt;//
            TreeNode tn;//根目录
            TreeNode tn2;//子目录


            while (1 == 1)//循环去查数据库中的数据,只要数据中有没有绑定到树上的数据就循环,直到所以数据都绑定到了树上。
            {
                dt = db.GetDateTable("select * from t_tree where isbd=0 order by gxid");//读取数据库的数据
                if (dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)//循环剩下的数据
                    {
                        if (dt.Rows[i][2].ToString() == "0")//根目录
                        {
                            tn = new TreeNode();
                            tn.Text = dt.Rows[i][1].ToString();
                            tn.Tag = dt.Rows[i][0].ToString();//标记
                            treeView1.Nodes.Add(tn);
                            db.Execute("update t_tree set isbd=1 where id=" + dt.Rows[i][0].ToString() + "", CommandType.Text);//把添加过的节点在数据库中修改下属性 isbd是否绑定属性。0为没有绑定,1为绑定。

                        }
                        else//非根目录
                        {
                            foreach (TreeNode ts in treeView1.Nodes)
                            {
                                TreeNode targetNode = SearchNode(ts, dt.Rows[i][2].ToString());


                                if (targetNode != null)
                                {
                                    tn2 = new TreeNode();
                                    tn2.Text = dt.Rows[i][1].ToString();
                                    tn2.Tag = dt.Rows[i][0].ToString();
                                    targetNode.Nodes.Add(tn2);
                                    db.Execute("update t_tree set isbd=1 where id=" + dt.Rows[i][0].ToString() + "", CommandType.Text);
                                    break;
                                }
                            }
                        }
                    }
                }
                else
                {
                    break;
                }
            }
        }

//------------------------------------------------------------------------------------------------------------破递归郁闷死我了
        private TreeNode SearchNode(TreeNode td, string selectParentNum)//递归
        {
            if (td.Tag.ToString() == selectParentNum)
            {
                return td;
            }
            TreeNode targetNode = null;
            foreach (TreeNode childNodes in td.Nodes)
            {
                targetNode = SearchNode(childNodes, selectParentNum);
                if (targetNode != null)
                    break;
            }
            return targetNode;
        }


        private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
        {
            cao = e.Item.ToString();
            cao = cao.Substring(10);//获取选中的节点名字
            tnd = (TreeNode)e.Item;

            DataTable dt2 = db.GetDateTable("select * from t_tree where name='" + cao + "'");

            this.DoDragDrop(e.Item, DragDropEffects.Move);
        }


        private void treeView1_DragDrop(object sender, DragEventArgs e)
        {
            //获得拖放中的项
            // ListViewItem lvi = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); 


            //TreeView tr = (TreeView)e.Data.GetData(typeof(TreeView));// e.Data.ToString();
            //string a=tr.Nodes.ToString();
            //string cao =e.Data.ToString();//;;.Data.ToString();
            //根据鼠标坐标确定要移动到的目标节点
            Point pt;
            TreeNode targeNode;
            pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
            targeNode = this.treeView1.GetNodeAt(pt);
            TreeNode NewMoveNode = new TreeNode(cao);//给挪动的节点创建个TreeNode


            if (targeNode != null)//如果目标节点未选中,则添加到一级节点
            {
                string mb = targeNode.Text;//挪动到的那个节点


                DataTable dt = db.GetDateTable("select * from t_tree where name='" + mb + "'");//查出挪动到得那个节点的id,即子节点的关系id


                db.Execute("update t_tree set gxid=" + dt.Rows[0][0].ToString() + " where name='" + cao + "'", CommandType.Text);


                treeView1.Nodes.Clear();


                bdtree();//重调排序方法


                //targeNode.Nodes.Add(NewMoveNode);
                ////更新当前拖动的节点选择
                //treeView2.SelectedNode = NewMoveNode;
                //展开目标节点,便于显示拖放效果
                targeNode.Expand();
                treeView1.ExpandAll();
                treeView1.Refresh();
            }
            else//添加到跟目录上,即一级节点gxid=0
            {


                db.Execute("update t_tree set gxid=0 where name='" + cao + "'", CommandType.Text);


                treeView1.Nodes.Clear();


                bdtree();//重调排序方法




                //this.treeView2.Nodes.Add(NewMoveNode);
                ////更新当前拖动的节点选择
                //treeView2.SelectedNode = NewMoveNode;
                //展开目标节点,便于显示拖放效果
                treeView1.ExpandAll();
                treeView1.Refresh();


            }
        }


        private void treeView1_DragEnter(object sender, DragEventArgs e)
        {
            //判定是否现在拖动的数据是LISTVIEW项
            //ListViewItem lvi = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); 
            string lvi = e.Data.ToString();
            if (lvi != null)
            {
                e.Effect = DragDropEffects.Move;
                treeView1.Nodes.Remove(tnd);
            }
            else
                Cursor = Cursors.No; 
        }


    }
}