2010-02-03 2 views
4

워크 시트의 일부 구조를 표시하는 Excel 추가 기능이 있습니다. 사용자는 구조를 복사하여 다른 워크 시트 또는 클립 보드 형식으로 처리되는 다른 응용 프로그램에 붙여 넣을 수 있습니다. 사용자가 구조체를 복사 할 때 구조체를 특정 형식으로 변환하고 DataObject :: SetData()를 사용하여 클립 보드에 저장합니다. 복사가 Excel에서 시작되면 클립 보드에 여러 형식이 저장됩니다 (이미지 참조)..NET - 기존 형식에 내 클립 보드 형식을 추가하는 방법

문제는 클립 보드의 데이터 (Excel에서 복사하여 제 3 자 응용 프로그램에 붙여 넣기)에 의존하는 타사 응용 프로그램이 있다는 것입니다. 그러나 재미있는 점은 그것이 어떤 형식인지에 대한 확신이 없다는 것입니다. 나는 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)); 

난 그냥 기존 데이터 객체에 액세스하고 조용히 다른 형식에 영향을주지 않고 내 자신의 데이터를 추가 할 수있는 솔루션을 찾고 있어요.

엑셀 클립 보드 형식 - (기본 형식을 무시) 당신은 당신이 당신의 데이터를 추가하려면 Windows 클립 보드에서 얻을 IDataObject에 대한 래퍼 클래스를 만들 수

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

답변

2

. 아이디어는 래퍼가 사용자 지정 형식을 알고 다른 모든 형식의 원래 래핑 된 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 메소드 구현 중 하나를 보여주는 부분적인 구현의 시스템 클립 보드 IDataObject를 검색 할 때, 당신이 당신의 래퍼 개체 중 하나인지 확인해야합니다. 이 경우 랩퍼를 계속 랩핑하지 않으려 고합니다. 대신 기존 래퍼의 데이터/형식 필드를 수정하거나 원본 클립 보드 데이터 객체에 대한 새로운 래퍼를 만들 수 있습니다.

+0

이 사용자 지정 래퍼를 클립 보드에 넣으면 Excel 형식에 종속 된 타사 응용 프로그램에서 해당 사용자 지정 래퍼를 이해할 수 없습니다. – A9S6

+0

제 3 자 앱이 데이터를 찾을 수없는 이유를 모르겠습니다. IDataObject 인터페이스를 통과하지 않습니까? – bbudge

+0

+1 : 지금 당신의 요지를 얻었습니다. 나는 이것을 시도해 그것이 제 3 자와 일하는지를보아야한다. 감사 !! – A9S6