.NET - 一种将我自己的剪贴板格式添加到现有格式的方法

时间:2010-02-03 08:05:52

标签: .net excel clipboard

我有一个Excel插件,在工作表上显示一些结构。用户可以复制结构并将其粘贴到另一个工作表或由剪贴板格式处理的其他应用程序中。当用户复制结构时,我将结构转换为特定格式,并使用DataObject :: SetData()将其放在剪贴板上。请注意,在Excel中启动副本时,它会在剪贴板上放置多种格式(参见图像)。

问题在于第三方应用程序依赖于剪贴板上的数据(从Excel复制并粘贴到第三方应用程序中),但有趣的是我不确定它依赖于哪种格式。我需要保留Excel提供的现有格式,并为其添加自己的格式。

目前,当我在.NET中使用Clipboard类(使用DataObject并在其中调用SetData)时,所有其他格式都被新的格式替换。 然后我尝试创建一个新的DataObject,将现有的格式数据复制到此数据对象,然后在剪贴板中设置此数据对象。 这样可以正常工作,但复制数据需要时间。

 // Copying existing data in clipboard to our new DataObject
 IDataObject existingDataObject = Clipboard.GetDataObject();
 DataObject dataObject = new DataObject();

 string[] existingFormats = existingDataObject.GetFormats();
 foreach (string existingFormat in existingFormats)
        dataObject.SetData(existingFormat, existingDataObject.GetData(existingFormat));

我正在寻找一种解决方案,只需访问现有的DataObject,然后安静地添加我自己的数据,而不会影响其他格式。

Excel剪贴板格式 - (忽略原生格式)

Clipboard Formats http://www.freeimagehosting.net/uploads/258a7fcdd8.jpg

1 个答案:

答案 0 :(得分:3)

您可以为从Windows剪贴板获取的IDataObject创建一个包装类,以添加数据。我们的想法是,包装器会知道您的自定义格式,并委托给所有其他格式的原始包装IDataObject。

这是一个显示构造函数和IDataObject方法实现之一的部分实现:

public class MyDataObject : IDataObject
{
    public MyDataObject(IDataObject inner, string format, Type type, object data)
    {
        m_inner = inner;
        m_format = format;
        m_type = type;
        m_data = data;
    }
    private IDataObject m_inner;
    private string m_format;
    private Type m_type;
    private object m_data;

    object IDataObject.GetData(string format)
    {
        // if my format, return the wrapper data
        if (format == m_format)
            return object;

        // otherwise, delegate to the wrapped data object which holds
        //  the other formats
        return m_inner.GetData(format);
    }

    // implement the rest of IDataObject similarly
    ...
}

一个警告:在检索系统剪贴板IDataObject时,您必须检查它是否是您的包装器对象之一。在这种情况下,您不希望继续包装您的包装器。相反,您需要修改现有包装器的数据/格式字段,或者为原始剪贴板数据对象创建新的包装器。