2010-01-19 3 views
1

이것은 2 자입니다.C# 잘라 내기/복사 및 붙여 넣기 개체

처음에는 복사 및 붙여 넣기 작업의 붙여 넣기 부분이 작동하는 데 시간이 걸리고 있습니다.

정보를 클립 보드로 복사하는 방법이 있습니다. 완벽하게 작동합니다.

private void CopyData(string format, object data, string text) 
    { 
     bool addedData = false; 
     DataObject copyData = new DataObject(); 

     if (!string.IsNullOrEmpty(text)) 
     { 
      copyData.SetData(DataFormats.Text, text); 
      addedData = true; 
     } 

     if (!string.IsNullOrEmpty(format) && data != null) 
     { 
      copyData.SetData(format, false, data); 
      addedData = true; 

      //this is only for testing 
      object obj = null; 
      if (copyData.GetDataPresent(format)) 
       obj = (object)copyData.GetData(format); 
     } 

     if (addedData) 
      Clipboard.SetDataObject(copyData, true); 
    } 

데이터가 추가되었는지 확인하면 객체 (obj)가 null이 아닙니다.

그러나 동일한 형식 키를 사용하여 다른 방법으로 데이터를 붙여 넣을 때마다 매번 null이 발생합니다.

private void PasteFromClipboard() 
    { 
     object obj = null; 
     IDataObject paste = null; 
     if (Clipboard.GetDataObject().GetDataPresent("mydatatype")) 
      obj = (object)Clipboard.GetDataObject().GetData("mydatatype"); 
     else 
      return; 

     if (obj == null) 
      throw new NullReferenceException("Could not gather information from the 
    } 

나는 내가 생각할 수있는 모든 노력을하고 그냥 이해가되지 않습니다. DataObject가 보유한 모든 형식 키를 캡처하기 위해 문자열 배열을 작성했으며 "mydatatype"이 첫 번째 문자열이었습니다. 캐스팅하지 않고 캐스팅하지 않고 시도했습니다. (Clipboard.GetDataObject().GetData("mydatatype") as object)을 사용하고 있습니다. 저는 메모장으로 가서 복사 한 텍스트를 붙여 넣을 수 있기 때문에 거기에 데이터가 있다는 것을 알고 있습니다.

왜 한 가지 방법으로 데이터를 가져올 수 있지만 다른 데이터를 가져올 수 없습니까?

두 번째로 컷을 만드는 방법을 궁금합니다. & 두 창 사이에 작업 붙여 넣기. Excel과 같은 것을 생각하고 있는데, 텍스트 만 붙여 넣으면 데이터가 남아 있지만 개체를 ​​붙여 넣으면 소스가 삭제됩니다.

감사합니다. Patrick.

답변

1

"mydatatype"대신 Text로 데이터를 추출해보십시오. 적어도 클립 보드에서 읽을 수 있는지 확인하십시오. 이것은 메모장에서 읽고있는 내용 일 가능성이 큽니다. 또한 "형식"으로 복사하지만 "mydatatype"으로 붙여 넣는 것이 중요합니까?

+0

나는 데이터 객체의 데이터 유형의 배열을 받았을 때 내가 테스트를 당겨 테스트는 데이터의 텍스트 버전을 당겨 않습니다. "mydatatype"형식은 Copy 메서드의 "format"로컬 변수로 전달되지만 문자열을 하드 코딩하여 차이가 있는지 확인합니다. 현재 응용 프로그램 내에서만 수행되므로 "mydatatype"의 Cutting & Coping을 구현하기 위해 자체 클래스를 만들었으므로 다른 응용 프로그램에서는이 데이터를 사용하지 않습니다. – Patrick

+0

잘 하드 코딩 형식을 변경하지 못했습니다, 나는 또한 데이터를 추가하고 어떤 유형의 "개체", 어떤 차이를 만들지 않았다. 오, 잘 생각해 줘서 고마워. 당분간 나는 사용자 정의 클래스 솔루션을 고수 할 것입니다. – Patrick

0

텍스트 매개 변수에 항상 값이 설정되어있을 수 있습니까? 그러면 객체를 설정하는 객체가 실행되지 않으면 두 번째 객체가 생성됩니다. 또는 데이터가 첫 번째 if 문에서 설정 되었기 때문에 두 번째 집합이 올바르게 설정되지 않습니다.

복사 작업 중에 디버거에서 코드를 실행하는 것이 좋습니다.

+0

안녕하세요, 나는 그걸 생각하고 텍스트를 먼저 설정하려고 시도했지만 아무런 변화가 없었습니다. 또한 텍스트를 먼저 설정하고 설정하지 않고 클립 보드로 설정 한 후에 데이터를 바로 잡아 당겨 테스트했습니다. 왜 그런지는 모르겠지만, 객체 데이터가 애플리케이션을 떠나지 않았기 때문에 애플리케이션이 사용하는 간단한 클래스를 만들었고 필요한 것을 성취했습니다. 제안 해 주셔서 감사합니다. 패트릭 – Patrick

0

붙여 넣기 전에 GetDataObject(). GetFormats()를 사용하여 서식 지정 코드 목록을 열거하십시오. 아마도 당신의

0

같은 반사를 사용해보십시오 잘못된 .. 단지 아이디어를 사용 : 나는 클립 보드에서 데이터의 COM 개체의 형식은 당신 자신을 변환 어려운 시간을 보냈 의심

private static T TryGetClipboardData<T>(IDataObject clipboardData, string dataFormat) 
    { 
     System.Reflection.FieldInfo fieldInfo = clipboardData.GetType().GetField("innerData", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
     var outerData = fieldInfo.GetValue(clipboardData); 

     if (outerData == null) 
     { 
      return default(T); 
     } 

     fieldInfo = outerData.GetType().GetField("innerData", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
     var innerData = fieldInfo.GetValue(outerData); 

     if (innerData is System.Runtime.InteropServices.ComTypes.IDataObject) 
     { 
      // It is (probably) necessary to wrap COM IDataObject to Windows.Forms.IDataObject 
      System.Windows.Forms.DataObject wrappedDataObject = new System.Windows.Forms.DataObject(innerData); 

      var data = wrappedDataObject.GetData(dataFormat); 

      if (data is T) 
      { 
       return (T)data; 
      } 
     } 

     return default(T); 
    } 

을 지정된. 또한 올바른 형식의 클립 보드로 등록되도록 입력 형식 문자열을 안전하게 사용하고 있습니다.

HTH

+0

제안 해 주셔서 감사합니다. 나는 그 모든 것을 많이 반영하지 않았으므로 조금 더 깊이 살펴 봐야 할 것입니다. – Patrick