ListView拖拽至TreeView,TreeView自身拖拽+查询节点

 

  1using System;
  2using System.Collections.Generic;
  3using System.ComponentModel;
  4using System.Data;
  5using System.Drawing;
  6using System.Text;
  7using System.Windows.Forms;
  8using System.Collections;
  9
 10namespace TreeDrag
 11{
 12    public partial class Form1 : Form
 13    {
 14        private Point Position = new Point(00);
 15        public Form1()
 16        {
 17            InitializeComponent();
 18            this.treeView1.ExpandAll();
 19        }

 20
 21        private void Form1_Load(object sender, EventArgs e)
 22        {
 23            this.listView1.AllowDrop = true;
 24            this.treeView1.AllowDrop = true;
 25            ListViewItem listViewItem1 = new ListViewItem("Item01");
 26            ListViewItem listViewItem2 = new ListViewItem("Item02");
 27            listView1.Items.Add(listViewItem1);
 28            listView1.Items.Add(listViewItem2);          
 29        }

 30
 31        private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
 32        {
 33            //判断是否是鼠标右键按动
 34            if (e.Button == MouseButtons.Right)
 35                return;
 36            int nTotalSelected = listView1.SelectedIndices.Count;
 37            //判断组件中是否存在项目
 38            if (nTotalSelected <= 0)
 39                return;
 40            IEnumerator selCol = listView1.SelectedItems.GetEnumerator();
 41            selCol.MoveNext();
 42            ListViewItem lvi = (ListViewItem)selCol.Current;
 43            string mDir = "";
 44            for (int i = 0; i < lvi.SubItems.Count; i++)
 45                mDir += lvi.SubItems[i].Text + " ,";
 46            string str = mDir.Substring(0, mDir.Length - 1);
 47            if (str == "")
 48                return;
 49            //对组件中的字符串开始拖放操作
 50            listView1.DoDragDrop(str, DragDropEffects.Copy | DragDropEffects.Move);
 51
 52        }

 53
 54        private void treeView1_DragEnter(object sender, DragEventArgs e)
 55        {
 56            if (e.Data.GetDataPresent("System.String"))
 57            {
 58                e.Effect = DragDropEffects.Copy;
 59            }

 60            else if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode"))
 61            {
 62                e.Effect = DragDropEffects.Move;
 63            }

 64            else
 65            {
 66                e.Effect = DragDropEffects.None;
 67            }

 68
 69        }

 70
 71        private void treeView1_DragDrop(object sender, DragEventArgs e)
 72        {            
 73            //获得拖放中的节点
 74            TreeNode moveNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
 75            string s = (string)e.Data.GetData("System.String");
 76            if (s != null)
 77            {
 78                s = s.Substring(s.IndexOf(":"+ 1).Trim();
 79            }

 80            //根据鼠标坐标确定要移动到的目标节点
 81            Point pt;
 82            TreeNode targeNode;
 83            pt = ((TreeView)(sender)).PointToClient(new Point(e.X,e.Y));
 84            targeNode = treeView1.GetNodeAt(pt);
 85
 86            //如果目标节点无子节点则添加为同级节点,反之添加到下级节点的未端
 87            if (targeNode.Nodes.Count == 0)
 88            {
 89                if (moveNode != null)
 90                {
 91                    targeNode.Parent.Nodes.Insert(targeNode.Index, (TreeNode)moveNode.Clone());
 92                }

 93                else
 94                {
 95                    TreeNode DragNode = new TreeNode(s);
 96                    targeNode.Nodes.Insert(targeNode.Index + 1, DragNode);
 97                }

 98            }

 99            else
100            {
101                targeNode.Nodes.Insert(targeNode.Nodes .Count, (TreeNode)moveNode.Clone());
102            }

103            //展开目标节点,便于显示拖放效果
104            targeNode.Expand();
105
106            //移除拖放的节点
107            moveNode.Remove();
108
109
110        }
      
111
112        private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
113        {
114            if (e.Button == MouseButtons .Left )
115            {
116                DoDragDrop(e.Item, DragDropEffects.Move);
117            }

118        }

119
120        private void listView1_DragDrop(object sender, DragEventArgs e)
121        {
122            string dummy = "temp";
123            //获得进行"Drag"操作中拖动的字符串
124            string s = (string)e.Data.GetData(dummy.GetType());
125            s = s.Substring(s.IndexOf(":"+ 1).Trim();
126            Position.X = e.X;
127            Position.Y = e.Y;
128            Position = listView1.PointToClient(Position);
129            //在目标组件中加入以此字符串为标题的项目
130            listView1.Items.Add(new ListViewItem(s, 0));
131        }

132
133       
134
135        private void button6_Click(object sender, EventArgs e)
136        {
137            foreach (TreeNode node in this.treeView1.Nodes)
138            {
139                ClearNode(node);
140                FindNode(node, this.textBox1.Text);
141            }
  
142        }

143        public TreeNode FindNode(TreeNode tnParent, string strValue)
144        {
145
146            if (tnParent == nullreturn null;
147
148            for (int i = 0; i < tnParent.Text.Length - strValue.Length + 1; i++)
149            {
150                if (tnParent.Text.Substring(i, strValue.Length) == strValue && (!tnParent.Checked))
151                {
152                    tnParent.BackColor = Color.Yellow;
153                }

154            }

155            TreeNode tnRet = null;
156
157            foreach (TreeNode tn in tnParent.Nodes)
158            {
159
160                tnRet = FindNode(tn, strValue);
161
162                if (tnRet != null)
163                    tnRet.BackColor = Color.Yellow;
164
165            }

166            return tnRet;
167
168
169        }

170
171        public TreeNode ClearNode(TreeNode tnParent)
172        {
173
174            if (tnParent == nullreturn null;
175            tnParent.BackColor = Color.Empty;
176            TreeNode tnRet = null;
177            foreach (TreeNode tn in tnParent.Nodes)
178            {
179                tnRet = ClearNode(tn);
180                if (tnRet != null)
181                    tnRet.BackColor = Color.Empty;
182            }

183            return tnRet;
184        }
     
185    }

186}

187
posted @ 2008-04-29 14:12  龙太子  阅读(1850)  评论(0编辑  收藏  举报