Проблема с тем, что вы делаете, заключается в том, что для извлечения данных, которые хранятся внутри перетаскивания, вы должны указать тип точный .
control.DoDragDrop(new Label(), DragDropEffects.Move);
e.Data.GetDataPresent(typeof(Control)) // = false
e.Data.GetDataPresent(typeof(Label)) // = true
Что вам нужно сделать, это создать оболочку и использовать ее для кода перетаскивания.
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
И ваш код теперь становится
ControlWrapper controlWrapper = e.Data.GetData(typeof(ControlWrapper)) as ControlWrapper;
UserControl userControl = controlWrapper.Control as UserControl;
И стараюсь не показаться слишком проповедническим, но вы должны сначала проверить, существуют ли данные в той форме, которую вы хотите. e.Data.GetDataPresent(typeof(ControlWrapper))
скажет вам, если это тот формат.