2010-03-13 10 views
10
Ben paneldeki kontrolleri sürüklemek istediğiniz

ve kontrolümü taşımak ve panele üzerine düşmesi yerini almak istiyorum sürükleyerek. Ben mouseUp, mouseDown, kontrol MouseMove olayları denedim.Ama aradığım şey değil. DragDrop etkinliğini panelde ateşlemek ve kontrolü taşımak istiyorum. Bunu yapabilir miyim? Bana bir fikir verebilirsen, harika olacak. Aşağıda benim kodumun bir parçası. Lütfen düzelt beni. Çok teşekkürler. Kontrol panelinde zaten ve sadece o fare olayları kullanarak, aynı panel içinde onu taşıyorsanızTaşı kontrolleri yaparken sürükle ve bırak panelde C#

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 DragnDrop 
{ 
    public partial class Form1 : Form 
    { 

     public Form1() 
     { 
      InitializeComponent(); 
     } 
     Control mycontrol; 
     int x, y; 
     //Form1 f = new Form1(); 
     private void Form1_Load(object sender, EventArgs e) 
     { 

      foreach (Control c in this.panel1.Controls) 
      { 
       c.MouseMove += new MouseEventHandler(lblDragger_MouseMove); 
       c.MouseUp += new MouseEventHandler(lblDragger_MouseUp); 
       c.MouseDown += new MouseEventHandler(pictureBox1_MouseDown); 
       c.MouseDoubleClick += new MouseEventHandler(pictureBox1_MouseDown); 
      } 
      panel2.AllowDrop = true; 
      foreach (Control c in this.panel2.Controls) 
      { 
       c.MouseDown += new MouseEventHandler(pictureBox1_MouseDown); 
      } 
      panel2.DragOver += new DragEventHandler(panel2_DragOver); 
      panel2.DragDrop += new DragEventHandler(panel2_DragDrop); 
     } 

     bool isDragging ; 
     int clickOffsetX ; 
     int clickOffsetY ; 

     private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      // this.Cursor = Cursors.SizeAll; 
      //pictureBox1 = (PictureBox)sender; 
      Control c = sender as Control; 

      //DoDragDrop(pictureBox1.Image, DragDropEffects.Copy); 
      // validation = true; 
      isDragging = true; 
      clickOffsetX = e.X; 
      clickOffsetY = e.Y; 
      // c.DoDragDrop(c, DragDropEffects.Move); 
     } 

     private void lblDragger_MouseUp(System.Object sender, System.Windows.Forms.MouseEventArgs e) 
     { 
      isDragging = false; 
     } 

     private void panel2_DragEnter(object sender, DragEventArgs e) 
     { 
      if (e.Data.GetDataPresent(typeof(Bitmap))) 
      { 
       e.Effect = DragDropEffects.Copy; 
      } 
      else 
      { 
       e.Effect = DragDropEffects.None; 
      } 
     } 

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

     private void panel2_DragDrop(object sender, DragEventArgs e) 
     { 
      Control c = e.Data.GetData(e.Data.GetFormats()[0]) as Control; 
      mycontrol = c; 
      if (c != null) 
      { 
       c.Location = this.panel2.PointToClient(new Point(e.X, e.Y)); 
       this.panel2.Controls.Add(c); 
      } 
     } 

     private void lblDragger_MouseMove(System.Object sender, 
      System.Windows.Forms.MouseEventArgs e) 
     { 
      Control c = sender as Control; 
      // bool isDragging = true; 
      if (isDragging == true) 
      { 
       c.Left = e.X + c.Left - clickOffsetX; 
       c.Top = e.Y + c.Top - clickOffsetY; 
      } 
     } 

     private void panel1_MouseLeave(object sender, EventArgs e) 
     { 
      Control c = sender as Control; 

      c.DoDragDrop(c, DragDropEffects.Move); 
     } 
    } 
} 

cevap

9

muhtemelen bunu yapmanın en kolay yoludur. Anlayışım, Sürükle ve Bırakın kontroller ve hatta uygulamalar arasında veri aktarımıyla ilgili olduğudur. Örneğin, paneller arasında bir kontrolün aktarılmasına izin vermeye çalışıyorsanız sürükle ve bırak işlemi iyi bir uyum olacaktır.

  1. sizin Fare olayları kullanarak aynı panel içinde sürükleyerek hareket gerçekleştirin:


    her ikisini de yapmak istiyorsanız

    , o zaman burada bir olası bir fikirdir.

  2. Panelde bir MouseLeave olayı aldığınızda, bir DragDrop işlemine başla (bazı örnekler here) Denetimin kontrol panelinden çıkarılmasını veya denetimin bir çeşit "gri çıkış" efekti ekleyebilmesini sağlar. bırakarak.

  3. DragDrop'u hedef panelinizde tutun ve denetimi, bırakma işleminin fare konumuna yerleştirin.

Bu aynı zamanda yeni bir yüzeye geçmiş 'paneli ve sürüklemek için bir yol sunan, etrafında kontrolünü sürükleyerek sezgisel bir his birleştirir.

+0

Yanıtlarınız için teşekkür ederiz, denetimleri panel içinde taşımak istiyorum ve ayrıca denetimleri bir panelden başka bir panele sürükleyip bırakmak istiyorum. Her ikisini de başarmak istiyorum. Bunu nasıl yapabilirim? – Dinu

+0

Eğer c.DoDragDrop (c, DragDropEffects.Move) işlemek için söylediğini you.Here ederiz; İlk panelin mouseLeave olayında ? Doğru mu? Ama aynı panelde yalnızca kontrollerin hareketini yapıyor. :( – Dinu

+0

Aşağıdakileri yapmanız gerekir (genel olarak Google'da bulunabilmek için DragDrop'un bir çok örneği vardır): - Fareyi terk ederken DoDragDrop'u çağırın, kumandayı kullanarak kontrol panelini 'sürükleyin' - Hedef panelinizin AllowDrop değerinin true olarak ayarlandığından emin olun. - Hedef panelinizin DragEnter ve DragDrop olaylarını bağlamayı sağlamak ve gerçek düşme işlemlerini gerçekleştirmek için kullanın. –

0

Sürükle bırakma durumunuzu değiştirmek için fareyi yukarı ve aşağı fare hareketleriyle kullanmanız gerekir. Fareyi indirdiğinde, sürüklemeye başlarsın. Farenizin göreceli konumunu kontrolünüzde ve kontrolünüzün panele göre konumunu kaydedersiniz. Daha sonra, fareyi hareket ettikçe ve kontrolün üst kısmında ve kontrolün içinde farenin orijinal konumuna göre yeniden konumlandırırken izleyin.