2016-09-15 2 views
1

J'ai DragDrop et DragEnter événements sur mon SplitContainer.Panel:blocs RichTextBox événement DragDrop

splitContainer.Panel.DragDrop += new System.Windows.Forms.DragEventHandler(this.splitContainerPanelDragDrop); 
    splitContainer.Panel.DragEnter += new System.Windows.Forms.DragEventHandler(this.splitContainerPanelDragEnter); 

Il fonctionne parfaitement avec tous les contrôles à l'intérieur SplitContainer.Panel sauf RichTextBox contrôles.

Comment ça ressemble: enter image description here

Alors DragDrop/DragEnter fonctionne parfaitement dans tous les contrôles à l'intérieur SplitContainer sauf les contrôles qui ont marqué la couleur jaune.

Ce que j'ai essayé:

1) Définir

RichTextBox.AllowDrop = false; 

Je même DragEnter est indisponible avec "l'action n'est pas autorisé" curseur.

2) Set

RichTextBox.AllowDrop = true; 

Après ce curseur est ok, mais cela ne fonctionne pas parce DragEventHandler attend plus dans d'autres cas, cela ne fonctionne pas.

3) Définir variante

RichTextBox.EnableAutoDragDrop=false; 
RichTextBox.AllowDrop=true; 

Même résultat que 2).

Je ne veux pas mettre événement DragDrop/DragEnter pour chaqueRichTextBox à l'intérieur SplitContainer car à l'intérieur FlowLayoutPanel ils sont créés dynamiquement.

La question est: existe-t-il une méthode comme e.PreventDefault analogique en C#? Ou que puis-je faire, sauf la définition d'événements pour chaque RichTextBox pour le faire fonctionner?

+0

Avez-vous essayé [ce] (http: // stackoverflow .com/questions/1465988/capture-dragdrop-event-de-richtextbox-c-sharp? rq = 1): 'EnableAutoDragDrop = false; AllowDrop = true; ' – TaW

+0

Je ne comprends pas très bien ce que vous voulez –

+0

Je veux que les événements DragDrop/DragEnter fonctionnent sur TOUT contrôle à l'intérieur de SplitContaner.Panel, mais cela ne fonctionne pas sur RichTextBox. – DEADMC

Répondre

1

Cela a fonctionné pour moi j'ai créé 2 contrôles personnalisés

sur mesure SplitControl

public partial class SplitControlCustom : SplitContainer 
    { 
     public SplitControlCustom() 
     { 
      InitializeComponent(); 
     } 

     public void ForceDrageDrop(DragEventArgs eventArgs) 
     { 
      OnDragDrop(eventArgs); 
     } 

     public void ForceDragEnter(DragEventArgs eventArgs) 
     { 
      OnDragEnter(eventArgs); 
     } 
    } 

sur mesure RichTextBox

public partial class RichTextBoxCustom : RichTextBox 
{ 
    public RichTextBoxCustom() 
    { 
     InitializeComponent(); 
     this.AllowDrop = true; 
    } 

    protected override void OnDragEnter(DragEventArgs drgevent) 
    { 
     SplitControlCustom parentSplitControl = Parent.Parent as SplitControlCustom; 
     if (parentSplitControl != null) 
     { 
      parentSplitControl.ForceDragEnter(drgevent); 
     } 
    } 

    protected override void OnDragDrop(DragEventArgs drgevent) 
    { 

     SplitControlCustom parentSplitControl = Parent.Parent as SplitControlCustom; 
     if (parentSplitControl != null) 
     { 
      parentSplitControl.ForceDrageDrop(drgevent); 
     } 
    } 
} 

S'il vous plaît laissez-moi savoir si cela a fonctionné

+0

Je vais essayer, merci. – DEADMC

+0

Comme cela est supposé un niveau fixe d'imbrication. – TaW

+0

Eh bien ça devrait marcher mais j'ai un problème avec ça. Il attrape ForceDragDrop, mais OnDragDrop ne lance pas l'événement DragDrop – DEADMC

0

Je ne Je ne vois pas comment vous pouvez faire ce travail directement. Mais, puisque vous êtes déjà prêt à ajouter quelques lignes de code tout en générant les commandes, pourquoi ne pas ajouter les événements nécessaires via quelques lignes de Lambda ..:

Supposons que vous venez de créer un RichTextBox et sont prêts à ajouter à une collection Controls ..:

RichTextBox richTextBox = new RichTextBox(); 
... 
richTextBox.AllowDrop = true; 

richTextBox.DragEnter += (ss, ee) => { ee.Effect = DragDropEffects.Copy; }; 
richTextBox.DragOver += (ss, ee) => { ee.Effect = DragDropEffects.Copy; }; 
richTextBox.DragDrop += (ss, ee) 
         => { splitContainer.Panel_DragDrop(splitContainer.Panel, ee); }; 

les deux premiers lambdas définir l'effet de copier sans aucune vérification; Bien sûr, vous voudrez les ajouter et choisir l'effet approprié.

Le troisième lambda passe le DragEventArgs au cas DragDrop du panneau contenant, maintenant le RTB est en fait 'D & D-through' ..

+0

il ne veut pas définir l'événement DragDrop/DragEnter pour chaque RichTextBox dans SplitContainer –

+0

Ce que je suppose qu'il voulait dire, il ne veut pas ajouter d'événements à la classe de formulaire pour le contrôles ajoutés dynamiquement. Il a besoin de définir toutes sortes de propriétés de toute façon, donc les trois ou quatre lignes ne devraient pas poser de problème. - Je ne voudrais certainement pas ajouter une nouvelle classe pour cette minuscule fonctionnalité, même si ça a marché. – TaW

+0

Bien @CodeJoy a raison, je ne veux pas implémenter d'événements pour chaque richTextBox. C'est bon quand vous avez 1-2 d'entre eux. Mais je peux avoir des centaines richtextbox et ça va poser problème. Surtout quand certains d'entre eux sont créés en cours d'exécution, certains en cours d'exécution. – DEADMC