在RichTextBox中实现C#文本的拖放

3
我有一个C#项目,希望用户能够在WinForm中的RichTextBox内部拖放文本(即移动文本)。我找到了许多示例,展示如何将某些东西拖放到RichTextBox中,但当RichTextBox既是拖动源又是放置目标时,我并没有成功使它们起作用。我该怎么做?下面是我迄今为止的无效尝试。
public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.richTextBox1.AllowDrop = true;
        this.richTextBox1.DragEnter += new System.Windows.Forms.DragEventHandler(this.richTextBox1_DragEnter);
        this.richTextBox1.DragDrop += new System.Windows.Forms.DragEventHandler(this.richTextBox1_DragDrop);
    }

    private void richTextBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) {
        if (e.Data.GetDataPresent(DataFormats.Rtf))
            e.Effect = DragDropEffects.Move;
        else
            e.Effect = DragDropEffects.None;
    }
    private void richTextBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) {
        int i;
        String s;

        i = richTextBox1.SelectionStart;
        s = richTextBox1.Text.Substring(i);
        richTextBox1.Text = richTextBox1.Text.Substring(0, i);

        richTextBox1.Text = richTextBox1.Text +
           e.Data.GetData(DataFormats.Text).ToString();
        richTextBox1.Text = richTextBox1.Text + s;
    }
}

你可能正在重新发明轮子。请查看FastColoredTextBox - Ňɏssa Pøngjǣrdenlarp
FastColoredTextBox并不是基于RichTextBox。 - M. Page
2个回答

5

好的,我找到了解决这个问题的方法:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        richTextBox1.EnableAutoDragDrop = true;
    }
}

仅此而已。

我的第一次尝试基于MSDN文档:http://msdn.microsoft.com/en-us/library/aa984395(v=vs.71).aspx,但似乎有问题。


是的,但这允许用户在其中放置我不想要的文件和其他垃圾。更糟糕的是,在特别实现文件拖放之后,当我在程序中正确打开我的文件时,它会将文件作为对象拖放进来。 - Nyerguds

3

在RXBox(RichTextBox)中拖放文本:

在初始化期间运行HookOn_EventHandlers_etc()。拖动鼠标将触发DragEnter和DragDrop事件。在RXBox_DragDrop()中,将DragDropEffects设置回None。

    private void HookOnEventHandlers_etc()
    {
        RXBox.DragEnter += RXBox_DragEnter;
        RXBox.DragDrop += RXBox_DragDrop;

        RXBox.AllowDrop = true;
        RXBox.EnableAutoDragDrop = true;
    }

    private void RXBox_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.Text))
            e.Effect = DragDropEffects.Copy;
        else
            e.Effect = DragDropEffects.None;
    }

    private void RXBox_DragDrop(object sender, DragEventArgs e)
    {
        RXBox.SelectedText = e.Data.GetData(DataFormats.Text).ToString();
        e.Effect = DragDropEffects.None; // with this the paste won't be doubled
    }

不错的建议,但你可以通过在事件RXBox_DragDrop中将RXBox.SelectedText替换为((RichTextBox)sender).SelectedText来进行改进。 - 123iamking
在文本框内拖动似乎会复制片段,而不是移动它们。 - Nyerguds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接