2012-02-09 5 views
-1

У меня проблема с DragDrop.DragDrop между элементами управления

private void Form0_Load(object sender, EventArgs e) 
    { 
     PictureBox panel1 = new PictureBox(); 
     PictureBox panel2 = new PictureBox(); 

     mainPanel.Dock = DockStyle.Fill; 
     this.Controls.Add(mainPanel); 

     panel1.Location = new Point(10, 10); 
     panel1.Size = new System.Drawing.Size(500, 300); 
     panel1.BorderStyle = BorderStyle.FixedSingle; 

     Button b2 = new Button(); 
     b2.Location = new Point(10, 10); 
     panel2.Controls.Add(b2); 
     panel2.Location = new Point(10, 10); 
     panel2.Size = new System.Drawing.Size(200, 100); 
     panel2.BorderStyle = BorderStyle.FixedSingle; 

     foreach (Control c in panel1.Controls) 
     { 
      c.MouseDown += new MouseEventHandler(control_MouseDown); 
      c.MouseMove += new MouseEventHandler(control_MouseMove); 
      c.MouseUp += new MouseEventHandler(control_MouseUp); 
      c.AllowDrop = true; 
     } 
     panel1.AllowDrop = true; 

     panel1.DragEnter += new DragEventHandler(container_DragEnter); 
     panel1.DragDrop += new DragEventHandler(container_DragDrop); 
     panel1.DragOver += new DragEventHandler(container_DragOver); 

     foreach (Control c in panel2.Controls) 
     { 
      c.MouseDown += new MouseEventHandler(control_MouseDown); 
      c.MouseMove += new MouseEventHandler(control_MouseMove); 
      c.MouseUp += new MouseEventHandler(control_MouseUp); 
      c.AllowDrop = true; 
     } 
     panel2.AllowDrop = true; 

     panel2.DragEnter += new DragEventHandler(container_DragEnter); 
     panel2.DragDrop += new DragEventHandler(container_DragDrop); 
     panel2.DragOver += new DragEventHandler(container_DragOver); 

     mainPanel.Controls.Add(panel1); 
     mainPanel.Controls.Add(panel2); 
     mainPanel.Controls.Add(pb); 
    } 

    private void control_MouseDown(object sender, MouseEventArgs e) 
    { 
     Control c = sender as Control; 
     isDragging = true; 
     clickOffsetX = e.X; 
     clickOffsetY = e.Y; 
    } 

    private void control_MouseMove(object sender, MouseEventArgs e) 
    { 
     Control c = sender as Control; 
     if (isDragging == true) 
     { 
      c.Left = e.X + c.Left - clickOffsetX; 
      c.Top = e.Y + c.Top - clickOffsetY; 
      if (c.Location.X + clickOffsetX > c.Parent.Width || 
       c.Location.Y + clickOffsetY > c.Parent.Height || 
       c.Location.X + clickOffsetX < 0 || 
       c.Location.Y + clickOffsetY < 0) 

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

    private void control_MouseUp(object sender, MouseEventArgs e) 
    { 
     isDragging = false; 
    } 

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

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

     //if (e.Data.GetDataPresent(typeof(Bitmap))) 
     //{ 
     // e.Effect = DragDropEffects.Copy; 
     //} 
     //else 
     //{ 
     // e.Effect = DragDropEffects.None; 
     //} 
    } 

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

Это рабочий пример. Но я не могу отключить Controls от родительского до дочернего элемента управления. Что такое магия? Как отменить управление другим элементом управления (от панели 1 до панели2 в моем примере).

+1

Существует нет ma ГИК. –

+0

@justAuser: что вы хотите делать? на каком кодере вы хотите сбросить другой элемент управления? может у, пожалуйста, объясните сценарий. – Smack

+0

@ Smack: Вопрос в том, как я могу бросить ребенка другому ребенку того же самого родителя? – justAuser

ответ

1

Есть некоторые ответы здесь в SO, которые могут помочь вам:

Смотреть это Move controls when Drag and drop on panel in C#

это полный пример того, как провести конструктор форм:

Tailor Your Application by Building a Custom Forms Designer with .NET

Проверьте это также на простое падение перетаскивания матрицы: Basic drag and drop in WinForms

+0

Спасибо! Я увижу. – justAuser

+0

Я уже видел эти примеры. Это нормально. Но в моем случае нет решений, которые могли бы помочь. Вопрос в том, как я могу переместить ребенка другому ребенку того же самого родителя? – justAuser

+0

отправьте идентификатор элемента управления, который вы перетаскиваете, и удалите его из родителя и добавьте в эту подпанель, на котором вы бросаете .. вы можете найти элемент управления с идентификатором в родительском. –

Смежные вопросы