A9S*_*9S6 5 .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));
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种解决方案,只需访问现有的DataObject,并悄悄地将自己的数据添加到它,而不会影响其他格式.
Excel剪贴板格式 - (忽略本机格式)
您可以为从 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
...
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是:检索系统剪贴板 IDataObject 时,您必须检查它是否是您的包装对象之一。在这种情况下,您不想继续包装包装纸。相反,您需要修改现有包装器的数据/格式字段,或者为原始剪贴板数据对象创建新的包装器。
| 归档时间: |
|
| 查看次数: |
1029 次 |
| 最近记录: |