2017-08-07 1 views
0

J'ai créé un contrôle (appelé Table) composé de deux PictureBox et de deux étiquettes. J'essaie de faire glisser et déposer d'un panneau à l'autre, mais cela ne fonctionne pas. Voici mon code:Glisser-déposer sur le contrôle personnalisé C#

void TableExampleMouseDown(object sender, MouseEventArgs e) 
    { 
     tableExample.DoDragDrop(tableExample, DragDropEffects.Copy); 
    } 

    void Panel2DragEnter(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Copy; 
    } 

    void Panel2DragDrop(object sender, DragEventArgs e) 
    { 
     panel2.Controls.Add((Table) e.Data.GetData(e.Data.GetFormats()[0])); 
    } 

Il est évident que je l'ai mis AllowDrop à true dans panel2. Déjà lorsque je clique sur l'objet Table (qui est dans panel1), le curseur de la souris ne change pas. Il semble que l'événement MouseDown ne se déclenche pas ...

Merci!

Ceci est la partie du code constructeur dans lequel je souscris Handlers:

 this.tableExample.MouseDown += new System.Windows.Forms.MouseEventHandler(this.TableExampleMouseDown); 
     this.label2.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Label2MouseDown); 
     this.panel1.DragDrop += new System.Windows.Forms.DragEventHandler(this.Panel1DragDrop); 
     this.panel1.DragEnter += new System.Windows.Forms.DragEventHandler(this.Panel1DragEnter); 
+0

place pour un (https://msdn.microsoft.com/en-us/library/5557y8b4.aspx) [** ** point d'arrêt] dans 'MouseDown' et voir si elle fait feu ou ne pas. –

+0

J'ai essayé et j'ai vu qu'il ne se déclenche pas ... Au lieu de cela, si je fais la même chose sur un contrôle standard tel qu'un TextBox, ça fonctionne correctement ... – Pietro

+0

Donc, vous ne semblez pas vraiment vous abonner l'événement ... Voir ma réponse ci-dessous. –

Répondre

0

Vous semblez avoir oublié de souscrire à l'événement MouseDown. Écrire simplement un événement n'est pas suffisant.

Mettre cela dans le gestionnaire d'événements ou dans le constructeur du formulaire:

tableExample.MouseDown += new MouseEventHandler(TableExampleMouseDown); 

Pour plus d'informations, reportez-vous à la documentation: How to: Subscribe to and Unsubscribe from Events - Microsoft Docs.


EDIT:

Il se pourrait aussi que vous appuyez sur l'une des commandes de l'enfant de votre contrôle personnalisé. Les contrôles enfants ont leurs propres événements MouseDown.

Pour faire les contrôles enfants soulèvent également l'événement MouseDown du contrôle des parents a mis ce dans le constructeur de votre contrôle personnalisé:

MouseEventHandler mouseDownHandler = (object msender, MouseEventArgs me) => { 
    this.OnMouseDown(me); 
}; 
foreach(Control c in this.Controls) { 
    c.MouseDown += mouseDownHandler; 
} 

EDIT 2:

Based sur le nouveau code que vous avez ajouté à la question, vous semblez avoir oublié de vous abonner aux événements pour panel2:

this.panel2.DragDrop += new System.Windows.Forms.DragEventHandler(this.Panel2DragDrop); 
this.panel2.DragEnter += new System.Windows.Forms.DragEventHandler(this.Panel2DragEnter); 
+0

Ok, merci. C'était probablement une erreur de distraction. Quoi qu'il en soit, maintenant l'événement MouseDown se déclenche, mais DragEnter et DragDrop ne le sont toujours pas. Ou mieux, si je glisse et dépose une étiquette sur panel2, ils fonctionnent correctement, mais quand j'essaie de faire glisser tableExample, toujours rien ... – Pietro

+0

@Pietro: Pourriez-vous partager plus de code dans votre question? Par exemple le constructeur de formulaire afin que nous puissions voir à quels événements vous vous abonnez. –

+0

J'ai édité ma question avec un peu plus de code. Merci – Pietro