C#DataGridView数据拖动到TreeView中

这个玩意 整了好几天啊。。。。

我的资源中有成品!http://download.csdn.net/source/3576853


两个控件都有把

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;//树控件自己拖动时,选中的项的节点
        private int selectionIdx = 0;//datagridview自己拖动时选中的项的索引
        string nb = "";//datagridview托动时,选中的项名字


        public Form1()
        {
            db = new dbhelper();
            InitializeComponent();
            bdtree();
            dataGridView1.DataSource = db.GetDateTable("select * from t_grid");
            
        }


        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);


                            //dt1 = db.GetDateTable("select * from t_tree where gxid=" + dt.Rows[i][0].ToString() + "");
                        }
                        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)//移动完成时发生
        {
            Point pt;
            TreeNode targeNode;
            pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
            targeNode = this.treeView1.GetNodeAt(pt);
            TreeNode NewMoveNode = new TreeNode(cao);


            if (tnd != null)//树自己拖动
            {
                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();
                    //treeView1.Nodes.Remove(tnd);
                    tnd = null;
                    bdtree();//重调排序方法


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


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


                    treeView1.Nodes.Clear();
                    //treeView1.Nodes.Remove(tnd);
                    tnd = null;
                    bdtree();//重调排序方法




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


                }
            }
            else//从Grid中托数据到treeview
            {
                string mb = targeNode.Text;//挪动到的那个节点
                string mmb = targeNode.Tag.ToString();//id


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


                db.Execute("update t_grid set t_id=" + dt.Rows[0][0].ToString() + " where scontent='" + nb + "'",CommandType.Text);//修改datagridview在数据库中的数据


                dt = db.GetDateTable("select * from t_grid where t_id=" + mmb + "");//从新绑定 datagridview
                dataGridView1.DataSource = dt;
            }
        }


        private void treeView1_DragEnter(object sender, DragEventArgs e)//在拖动完成的时候发生的事件
        {
            if (tnd != null)
            {
                treeView1.Nodes.Remove(tnd);
            }
            //e.Effect = DragDropEffects.Move;
            //判定是否现在拖动的数据是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;
            //}
            e.Effect = DragDropEffects.Move;//很重要 可以挪动到别的控件Move
        }


        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            DataTable dt = db.GetDateTable("select * from t_grid where t_id=" + e.Node.Tag.ToString() + "");
            dataGridView1.DataSource = dt;
        }
        //------------------------------------------------------------------------------------------
        private void dataGridView_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)//获得移动
        {
            if ((e.Clicks < 2) && (e.Button == MouseButtons.Left))
            {
                if ((e.ColumnIndex == -1) && (e.RowIndex > -1))
                    dataGridView1.DoDragDrop(dataGridView1.Rows[e.RowIndex], DragDropEffects.Move);
            }


        }


        private void dataGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.RowIndex >= 0)
                selectionIdx = e.RowIndex;


        }
        //注意DragDrop方法最后,selectionIdx被赋值为拖动行的新行号。 


        private int index2 = 0;
        private void dataGridView_DragDrop(object sender, DragEventArgs e)//拖动完成时发生的事件
        {
            e.Effect = DragDropEffects.Move;
            int idx = GetRowFromPoint(e.X, e.Y);
            if (idx < 0) return;
            index2 = idx;
            if (e.Data.GetDataPresent(typeof(DataGridViewRow)))
            {
                DataGridViewRow row = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow));


                DataRow nr = ((DataTable)dataGridView1.DataSource).NewRow();//选中的行


                string nb = row.Cells[1].Value.ToString();
                for (int i = 0; i < row.Cells.Count; i++)
                {
                    nr[i] = row.Cells[i].Value;
                }
                dataGridView1.Rows.Remove(row);
                ((DataTable)dataGridView1.DataSource).Rows.InsertAt(nr, idx);
                selectionIdx = idx;//新的行号 要挪动到那个行号
            }


        }
        private int GetRowFromPoint(int x, int y)
        {
            for (int i = 0; i < dataGridView1.RowCount; i++)
            {
                Rectangle rec = dataGridView1.GetRowDisplayRectangle(i, false);


                if (dataGridView1.RectangleToScreen(rec).Contains(x, y))
                    return i;
            }


            return -1;
        }


       
        private void dataGridView_SelectionChanged(object sender, EventArgs e)//datagridview中自己换行
        {
            if ((dataGridView1.Rows.Count > 0) && (dataGridView1.SelectedRows.Count > 0))
            {


                if (dataGridView1.Rows.Count <= selectionIdx)
                    selectionIdx = dataGridView1.Rows.Count - 1;
                dataGridView1.Rows[selectionIdx].Selected = true;
                dataGridView1.CurrentCell = dataGridView1.Rows[selectionIdx].Cells[0];
            }


        }
        //在这里判断,如果selectionIdx的值和当前选中的行号不同,则选中行号为selectionIdx的这一行。
        private void dataGridView_DragEnter(object sender, DragEventArgs e)//拖动时候发生的事件
        {
            DataGridViewRow row = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow));


            DataRow nr = ((DataTable)dataGridView1.DataSource).NewRow();//选中的行


            nb = row.Cells[1].Value.ToString();


            e.Effect = DragDropEffects.Move;
        }


        private void dataGridView_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
        {
            //int idx = GetRowFromPoint(e.X, e.Y);


            //if (idx < 0) return;
            //dataGridView.Rows[idx].Selected = true;
            //dataGridView.CurrentCell = dataGridView.Rows[idx].Cells[0];
        }
    }
}



©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值