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