我有一个简单的页面。一个富文本框绑定到我的数据库中的测试表。
我已将EnableAutoDragDrop变为true。
一切都很好,盒子的内容都会被保存,并且在被要求时能够恢复。
我的问题是将图像丢入RTB。如果我直接从文件管理器(任何类型的图像文件)拖动它们,那么我会得到一个显示文件名的图标,而不是实际图像。
如果我打开Word并将图像放入Word,然后将其拖入RTB,那么图像显示就好了。
我想我不理解文件管理器和word以及RTB之间进程的机制。有谁能让我高兴吗?
答案 0 :(得分:4)
@climbage提供的答案有很好的解释。这里是如何在RichTextBox中实现拖放
代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace rich_RichtextboxDragDrop
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
AllowDrop = true;
this.richTextBox1.DragEnter += new DragEventHandler(richTextBox1_DragEnter);
this.richTextBox1.DragDrop += new DragEventHandler(richTextBox1_DragDrop);
}
void richTextBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
if ((e.Data.GetDataPresent(DataFormats.FileDrop)))
{
e.Effect = DragDropEffects.Copy;
}
}
void richTextBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
Image img = default(Image);
img = Image.FromFile(((Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString());
Clipboard.SetImage(img);
this.richTextBox1.SelectionStart = 0;
this.richTextBox1.Paste();
}
}
}
修改了更多信息
这就是你在PropertiesTab中没有看到它的原因。 Attribute [Browsable(false)]
告诉PropertyGrid
不要显示该属性。这是来自MSDN的代码。
/// <include file='doc\RichTextBox.uex' path='docs/doc[@for="RichTextBox.DragEnter"]/*' />
/// <devdoc>
/// RichTextBox controls have built-in drag and drop support, but AllowDrop, DragEnter, DragDrop
/// may still be used: this should be hidden in the property grid, but not in code
/// </devdoc>
[Browsable(false)]
public new event DragEventHandler DragEnter {
add {
base.DragEnter += value;
}
remove {
base.DragEnter -= value;
}
}
答案 1 :(得分:1)
拖动事件可以包含由拖动事件源确定的多种格式类型。当我将图像(.png)从文件系统拖到C#控件时,我会得到这组可用格式(请注意,您可以从DragEventArgs.Data.GetFormats()
获取这些格式)
Shell IDList Array
Shell Object Offsets
DragImageBits
DragContext
InShellDragLoop
FileDrop
FileNameW
FileName
现在当我将相同的图像拖到word上,然后再拖到我的C#控件上时,我得到了这个格式列表:
Woozle
Object Descriptor
Rich Text Format
HTML Format
System.String
UnicodeText
Text
EnhancedMetafile
MetaFilePict
Embed Source
完全由目标控件决定如何处理拖动数据以及使用哪种格式。 MS Word可以采用格式FileNameW
,这只是删除文件的路径,并读取图像。虽然RichTextBox
可能需要FileNameW
并获取其图标。