3 votes

faire glisser les contrôles utilisateur d'un panneau d'affichage à un autre

Comment ajouter la capacité de glisser-déposer d'un contrôle utilisateur personnalisé à partir de 2 panneaux d'affichage Flowlay ?

Usercontrol continue d'être null sur la ligne de code suivante

    private void flowLayoutPanel1_DragDrop(object sender, DragEventArgs e)
    {
        UserControl userControl = e.Data.GetData(typeof(UserControl)) as UserControl;

3voto

Samuel Points 21085

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X