2010-09-26 5 views
0

Je n'arrive pas à comprendre pourquoi la tentative de glisser du texte d'une étiquette standard vers le Bloc-notes (ou tout autre texte acceptant le contrôle) ne fonctionne pas. J'ai regardé la documentation et les exemples et je ne vois pas le problème. Le curseur reste un cercle avec une ligne à travers et si j'enregistre un rappel FeedBack l'événement est toujours NONE. Création d'une application Windows Forms standard, suppression d'un contrôle Label et enregistrement de MouseDown & Événements MouseMove J'ai ce code que j'appelle label1.DoDragDrop (label1, DragDropEffects.All | DragDropEffects.Link). Toute aide serait appréciée.DoDragDrop de l'étiquette standard ne fonctionne pas

Voici ma forme de code:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace DragDropLabel 
{ 
    public partial class Form1 : Form 
    { 
     Point m_ClickLocation; 
     bool _bDragging = false; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void OnLabelMouseDown(object sender, MouseEventArgs e) 
     { 
      m_ClickLocation = e.Location; 
      _bDragging = true; 
     } 

     private void OnLabelMouseMove(object sender, MouseEventArgs e) 
     { 
      if (_bDragging) 
      { 
       Point pt = e.Location; 
       Size dragSize = SystemInformation.DragSize; 
       if (Math.Abs(pt.X - m_ClickLocation.X) > dragSize.Width/2 || 
        Math.Abs(pt.Y - m_ClickLocation.Y) > dragSize.Height/2) 
       { 
        DragDropEffects rc = label1.DoDragDrop(label1, DragDropEffects.All | DragDropEffects.Link); 
        _bDragging = false; 
       } 
      } 
     } 

    } 
} 

Répondre

1

contrôles d'édition standard() ne sont pas zones de texte drag & drop et n'acceptera aucun texte abandonné.

+0

Je pensais que tout contrôle dérivé de contrôle prend en charge glisser-déposer. L'étiquette est utilisée comme source de glisser-déposer et non comme cible. – AlanKley

+0

@AlanKley: Je m'en rends compte. Cependant, les boîtes de texte standard n'acceptent pas le glisser-déposer, donc vous ne pouvez pas les laisser tomber. Si vous faites glisser vers Wordpad ou un autre contrôle d'édition riche, cela devrait fonctionner correctement. – SLaks

+0

Merci SLaks, vous avez raison à propos de Wordpad vs Notepad, si je fais le changement suggéré par Max pour utiliser lable1.text plutôt que label1. – AlanKley

1

D'abord, changer

DragDropEffects rc = label1.DoDragDrop(label1, DragDropEffects.All | DragDropEffects.Link); 

à

label1.DoDragDrop(label1.Text, DragDropEffects.Copy); 

Deuxièmement, vous devez préparer votre cible de dépôt. Supposons, c'est un textbox. Voici la méthode d'extension exmple qui permettra de cofigure une zone de texte en appelant MyTextBox.EnableTextDrop():

static class TextBoxExtensions 
{ 
    public static void EnableTextDrop(this TextBox textBox) 
    { 
     if(textBox == null) throw new ArgumentNullException("textBox"); 

     // first, allow drop events to occur 
     textBox.AllowDrop = true; 
     // handle DragOver to provide visual feedback 
     textBox.DragOver += (sender, e) => 
      { 
       if(((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) && 
        e.Data.GetDataPresent(typeof(string))) 
       { 
        e.Effect = DragDropEffects.Copy; 
       } 
      }; 
     // handle DragDrop to set text 
     textBox.DragDrop += (sender, e) => 
      { 
       if(((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) && 
        e.Data.GetDataPresent(typeof(string))) 
       { 
        ((TextBox)sender).Text = (string)e.Data.GetData(typeof(string)); 
       } 
      }; 
    } 
} 
+0

Merci Max. Je ne suis pas en train d'implémenter la cible de baisse. Je veux tomber dans d'autres applications modifier le contrôle, bloc-notes, extc. J'ai pensé à tort que Notepad était une cible de largage valide quand il semble que ce n'est pas le cas. Vous avez correctement indiqué que je devais passer dans label1.Text! – AlanKley