2010-02-03 2 views
4

У меня есть дополнительный элемент Excel, который отображает некоторые структуры на листе. Пользователи могут копировать структуры и вставлять их в другой рабочий лист или другое приложение, которое обрабатывается форматами буфера обмена. Когда пользователь копирует структуру, я преобразовываю структуру в определенный формат и помещаю ее в буфер обмена с помощью DataObject :: SetData(). Обратите внимание, что когда копия инициируется в Excel, она помещает несколько форматов в буфер обмена (см. Изображение)..NET - Способ добавления моего собственного формата буфера обмена в существующие форматы

Проблема заключается в том, что существует стороннее приложение, которое зависит от данных в буфере обмена (копирование из Excel и вставка в это стороннее приложение), но самое смешное в том, что я не уверен, в каком формате это зависит. Мне нужно сохранить существующие форматы, которые Excel разместил там, а также добавить в него свой собственный формат.

В настоящее время, когда я использую класс Clipboard в .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 Clipboard Форматы - (Игнорировать Native Format)

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

ответ

2

Вы можете создать класс-оболочку для 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, вы должны проверить, если это один из ваших объектов оберток. В этом случае вы не хотите обертывать свои обертки. Вместо этого вы хотите либо изменить поля данных/формата существующей оболочки, либо создать новую оболочку для исходного объекта данных буфера обмена.

+0

Если я помещаю эту специальную оболочку в буфер обмена, стороннее приложение, зависящее от форматов Excel, не сможет его понять. – A9S6

+0

Я не понимаю, почему стороннее приложение не сможет найти свои данные. Не проходит ли он через интерфейс IDataObject? – bbudge

+0

+1: Я сейчас понял. Я попробую это и посмотрю, работает ли он с сторонним (он должен). Благодаря !! – A9S6