Le problème avec ce que vous faites est que pour extraire les données qui sont stockées à l'intérieur du drag, vous devez spécifier le paramètre exactes type.
control.DoDragDrop(new Label(), DragDropEffects.Move);
e.Data.GetDataPresent(typeof(Control)) // = false
e.Data.GetDataPresent(typeof(Label)) // = true
Ce que vous devez faire, c'est créer un wrapper et l'utiliser pour votre code de glisser-déposer.
class ControlWrapper
{
public Control Control { get; private set; }
public ControlWrapper(Control control) { Control = control; }
}
control.DoDragDrop(new ControlWrapper(new Label()), DragDropEffects.Move);
e.Data.GetDataPresent(typeof(ControlWrapper)) // = true
Votre code devient alors
ControlWrapper controlWrapper = e.Data.GetData(typeof(ControlWrapper)) as ControlWrapper;
UserControl userControl = controlWrapper.Control as UserControl;
Et, sans vouloir paraître trop prêcheur, vous devriez d'abord vérifier si les données existent sous la forme que vous souhaitez. e.Data.GetDataPresent(typeof(ControlWrapper))
vous dira s'il s'agit de ce format.