У меня есть дополнение Excel, которое отображает некоторые структуры на рабочем листе. Пользователи могут скопировать структуры и вставить их в другом рабочем листе или другом приложении, которое обрабатывается форматами Буфера обмена. Когда пользователь копирует структуру, я преобразовываю структуру в определенный формат и помещаю ее на буфер обмена с помощью DataObject:: SetData (). Обратите внимание на то, что, когда копия инициируется в Excel, она помещает много форматов на буфер обмена (см. изображение).
Проблема состоит в том, что существует приложение сторонних производителей, которое зависит от данных по буферу обмена (Копия с Excel и вставки в это приложение сторонних производителей), но забавная вещь состоит в том, что я не уверен, от какого формата это зависит. Я должен сохранить существующие форматы, которые Excel поднял там и также добавляет мой собственный формат к нему.
В настоящее время, когда я использую класс Буфера обмена в.NET (берущий 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 - (Игнорируют собственный формат),
Форматы буфера обмена http://www.freeimagehosting.net/uploads/258a7fcdd8.jpg
Вы можете создать класс-оболочку для 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 системного буфера обмена вам нужно будет проверить, является ли он одним из ваших объектов оболочки. В этом случае вам не захочется заворачивать свои обертки. Вместо этого вы захотите либо изменить поля данных / формата существующей оболочки, либо создать новую оболочку для исходного объекта данных буфера обмена.