标准标签的DoDragDrop不起作用

时间:2010-09-26 23:35:17

标签: c# drag-and-drop label

我无法弄清楚为什么尝试将文本从标准Label拖到记事本(或任何其他控件接受文本)不起作用。我查看了文档和示例,但我没有看到问题。光标仍然是一个圆圈,其中有一条直线,如果我注册了一个FeedBack回调,则该事件始终为NONE。创建一个标准的Windows窗体应用程序,删除一个Label控件并注册MouseDown& MouseMove事件我有这个代码,我调用label1.DoDragDrop(label1,DragDropEffects.All | DragDropEffects.Link)。任何帮助将不胜感激。

这是我的表单代码:

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;
                }
            }
        }

    }
}

2 个答案:

答案 0 :(得分:1)

标准编辑控件(文本框)不支持拖放,也不接受任何删除的文本。

答案 1 :(得分:1)

首先,改变

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

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

其次,你必须准备掉落目标。让我们假设,它是文本框。这是一个简单的扩展方法,它允许通过调用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));
                }
            };
    }
}