我在vs.net2003中用TreeView控件建了一个类似Windows资源管理器的东西,
请问在这个控件中怎么实现资源管理器中目录拖放(光在目录中进行拖放)的功能。
请教高手,最好有事例。

解决方案 »

  1.   

    详情请看:http://www.7622.com/list/15931.htm
    public class Form1 : System.Windows.Forms.Form
     {
      private System.Windows.Forms.TreeView treeView1;
      private System.Windows.Forms.ImageList imageList1;  public Form1()
      {
       InitializeComponent();
      }
      #region Windows 窗体设计器生成的代码
      private void InitializeComponent()
      {
       this.components = new System.ComponentModel.Container();
       System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
       this.treeView1 = new System.Windows.Forms.TreeView();
       this.imageList1 = new System.Windows.Forms.ImageList(this.components);
       this.SuspendLayout();
       // 
       // treeView1
       // 
       this.treeView1.AllowDrop = true;
       this.treeView1.Font = new System.Drawing.Font("宋体", 12F);
       this.treeView1.ImageList = this.imageList1;
       this.treeView1.Location = new System.Drawing.Point(8, 8);
       this.treeView1.Name = "treeView1";
       this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
                          new System.Windows.Forms.TreeNode("This is a very simple example", 1, 1),
                          new System.Windows.Forms.TreeNode("but i dont know another way to do such", 2, 2),
                          new System.Windows.Forms.TreeNode("so I think I can realise this a ticky way", 3, 3),
                          new System.Windows.Forms.TreeNode("yes if this is helpful for you ,that is my glad ", 4, 4),
                          new System.Windows.Forms.TreeNode("ok that is all,have a good day", 0, 0)});
       this.treeView1.Size = new System.Drawing.Size(360, 264);
       this.treeView1.TabIndex = 0;
       this.treeView1.DragOver += new System.Windows.Forms.DragEventHandler(this.treeView1_DragOver);
       this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView1_DragEnter);
       this.treeView1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.treeView1_MouseMove);
       this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView1_ItemDrag);
       this.treeView1.DragLeave += new System.EventHandler(this.treeView1_DragLeave);
       this.treeView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView1_DragDrop);
       // 
       // imageList1
       // 
       this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
       this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
       this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
       // 
       // Form1
       // 
       this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
       this.ClientSize = new System.Drawing.Size(376, 277);
       this.Controls.Add(this.treeView1);
       this.Name = "Form1";
       this.Text = "Form1";
       this.ResumeLayout(false);  }
      #endregion[STAThread]
      static void Main() 
      {
       Application.Run(new Form1());
      }  ImageForm form;
      private void treeView1_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
      {
       TreeNode dragNode = (TreeNode)e.Item;
       form = new ImageForm((Bitmap)imageList1.Images[dragNode.ImageIndex],dragNode.Text);
       form.Load +=new EventHandler(form_Load);
       form.TopLevel = false;
       form.Visible = true;
       this.Controls.Add(form);
       form.BringToFront();   treeView1.DoDragDrop(e.Item,DragDropEffects.Move);
      }  private void treeView1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
      {
       if(e.Data.GetDataPresent(typeof(TreeNode)))
       {
        e.Effect = DragDropEffects.Move;
       }
      }  private void treeView1_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
      {
       TreeView tv = sender as TreeView;
       TreeNode dragNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
       Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
       form.Visible = true;
       form.Location = new Point(pt.X + 18,pt.Y + 6);
       form.BringToFront();
       TreeNode overNode = ((TreeView)sender).GetNodeAt(pt);
       treeView1.SelectedNode = overNode;
       if(overNode == null || dragNode.Equals(overNode))
       {
        e.Effect = DragDropEffects.None;
       }
       else
       {
        e.Effect = DragDropEffects.Move;
        
       }
      }  private void treeView1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
      {
       if(e.Effect == DragDropEffects.Move)
       {
        TreeView tv = sender as TreeView;
        TreeNode dragNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
        Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
        TreeNode destinationNode = ((TreeView)sender).GetNodeAt(pt);
        if(destinationNode.Parent == null)
        {
         treeView1.Nodes.Insert(destinationNode.Index,(TreeNode)dragNode.Clone());
         
        }
        else
        {
         destinationNode.Parent.Nodes.Insert(destinationNode.Index,(TreeNode)dragNode.Clone());
        }
        if(dragNode.Parent == null)
        {
         treeView1.Nodes.Remove(dragNode);
        }
        else
        {
         dragNode.Parent.Nodes.Remove(dragNode);
        }
       }
      }
      
      private void treeView1_DragLeave(object sender, System.EventArgs e)
      {
       form.Visible = false;
      }  private void treeView1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
      {
       if(form != null)
       {
        this.Controls.Remove(form);
        form = null;
       }
      }
     }
      

  2.   

    1)设置 this.treeView1.AllowDrop = true;
    2)节点 Node.DoDrag(...);
    2)写DragDrop事件