代码之家  ›  专栏  ›  技术社区  ›  A9S6

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

  •  5
  • A9S6  · 技术社区  · 16 年前

    我有一个excel加载项,它在工作表上显示一些结构。用户可以复制结构并将其粘贴到另一个工作表或由剪贴板格式处理的另一个应用程序中。当用户复制结构时,我将结构转换为特定格式,并使用dataobject::setdata()将其放在剪贴板上。请注意,在excel中启动副本时,它会将许多格式放在剪贴板上(参见图片)。

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

    目前,当我在.net中使用剪贴板类(获取dataobject并在其中调用setdata)时,所有其他格式都被新格式替换。 然后,我尝试创建一个新的数据对象,将现有的格式数据复制到此数据对象,然后在剪贴板中设置此数据对象。 这很好,但复制数据需要时间。

     // 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));
    

    我正在寻找一个解决方案,只需访问现有的数据对象,并悄悄地将自己的数据添加到其中,而不影响其他格式。

    Excel剪贴板格式 -(忽略本机格式)

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

    1 回复  |  直到 16 年前
        1
  •  3
  •   bbudge    16 年前

    您可以为IDataObject创建一个包装类,从Windows剪贴板中获取该类以添加数据。其思想是包装器将知道您的自定义格式,并委托给所有其他格式的原始包装的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时,必须检查它是否是包装器对象之一。在这种情况下,你不想继续包装你的包装纸。相反,您需要修改现有包装器的数据/格式字段,或者为原始剪贴板数据对象创建一个新包装器。