0

我有一个简单的页面。一个富文本框绑定到我的数据库中的测试表。

我已将 EnableAutoDragDrop 设置为 true。

一切都很好,盒子里的东西都被保存了,可以在需要时拉回来。

我的问题是将图像放入 RTB。如果我直接从文件管理器(任何类型的图像文件)中拖动它们,那么我会得到一个带有显示文件名的图标,而不是实际图像。

如果我打开 Word 并将图像拖放到 Word 中,然后将其拖到 RTB 中,则图像显示得很好。

我想我不了解文件管理器和 word 和我的 RTB 之间的过程机制。谁能解惑我?

4

2 回答 2

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

}

编辑以获取更多信息

这就是您在“属性”选项卡中看不到它的原因。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; 
        }
    }
于 2012-06-27T23:07:30.990 回答
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并获取它的图标。

于 2012-06-27T22:09:53.373 回答