RichTextBox与拖放

1.自动拖放只支持DragDropEffects.Move

近日需要程序在运行时将TreeView节点拖放到RichTextBox。发现RichTextBox没有DragOver等事件,但有EnableAutoDragDrop属性,于是设置为true。运行程序,可以从外部拖放一些文本、图片到RichTextBox,但是从TreeView拖放节点到RichTextBox时,老是显示类似禁止的那个小图标,无法拖放。难道RichTextBox对于内部拖放没有效果?

以下是TreeView点击开始拖放的代码

private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
    TreeNode mNode= this.treeView1.GetNodeAt(e.X, e.Y);
    treeView1.SelectedNode = mNode;
    if (mNode != null)
        treeView1.DoDragDrop(mNode.Text, DragDropEffects.Copy);
}

增加一个TextBox来接受拖放。证明上面的代码是可以的。无聊之时,将

treeView1.DoDragDrop(mNode.Text, DragDropEffects.Copy);

修改为

treeView1.DoDragDrop(mNode.Text, DragDropEffects.Move);

奇迹发生了,可以拖放进去了。RichTextBox什么代码都不用写,只用设置EnableAutoDragDrop=true。看来RichTextBox的自动拖放只支持DragDropEffects.Move。

2.非自动的拖放(EnableAutoDragDrop=false)

其实RichTextBox设计器里没有DragOver等事件,但我们可以手工添加代码。需要注意的是,非自动也只支持DragDropEffects.Move.

this.richTextBox1.AllowDrop = true;
this.richTextBox1.DragEnter += new DragEventHandler(richTextBox1_DragEnter);
this.richTextBox1.DragDrop += new DragEventHandler(richTextBox1_DragDrop);

这样我们就可以自己来决定RichTextBox允许拖放的内容。设置EnableAutoDragDrop=false,以下方法限定RichTextBox只接受Text的拖放

void richTextBox1_DragDrop(object sender, DragEventArgs e)
{
    string txt = e.Data.GetData("Text") as string;
    if (!string.IsNullOrEmpty(txt))
        this.richTextBox1.SelectedText = txt;
}

void richTextBox1_DragEnter(object sender, DragEventArgs e)
{            
    if (e.Data.GetDataPresent("Text"))
        e.Effect = DragDropEffects.Move;//注意,也只支持Move
    else
        e.Effect = DragDropEffects.None;
}
posted @ 2012-05-07 12:11  生命体验之kevin-Y  阅读(2227)  评论(1编辑  收藏  举报