2010-01-19 171 views
1

This is a 2 parter。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)不为空。

但是,当我然后使用相同的格式键从不同的方法粘贴数据时,我每次都会得到空值。

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”) - 至少要确认您可以从剪贴板中读取数据。这很可能是记事本正在阅读的内容。此外,您是否使用“格式”进行复制,但粘贴了“mydatatype”?

+0

我测试拔测出来时,我得到的数据对象数据类型的数组和它拉出数据的文本版本。 “mydatatype”格式被传递到Copy方法的“格式”局部变量,但是我会尝试对字符串进行硬编码,看看是否有任何区别。 目前我只创建了自己的类来实现“mydatatype”的切割和应对,因为它只会在应用程序中执行,这意味着没有其他应用程序会使用该数据。 – Patrick 2010-01-20 14:22:55

+0

好硬编码的格式没有改变,我也加入了数据,而不是“对象”类型,也没有任何区别。噢,谢谢你的想法。 我会暂时坚持我的自定义班级解决方案。 – Patrick 2010-01-20 14:58:40

0

难道是文本参数总是有一个值并被设置。然后可能第二个,如果设置对象的那个没有被执行。或者,如果它是从第一个if语句中设置数据开始的,则第二个集合将无法正确设置它。

我的建议是在复制操作过程中将代码放在调试器中。

+0

嗨,我也是这样想的,试着先拉出文字,但没有改变。我还测试了在将数据设置到剪贴板之后将数据恢复出来,而不是先设置文本,然后再使用它。不知道为什么,但由于对象数据永远不会离开应用程序,我只是创建了一个简单的类,该应用程序使用它并完成了我所需的操作。 感谢您的建议,但是, Patrick – Patrick 2010-01-30 03:53:50

0

粘贴前使用GetDataObject()。GetFormats()来枚举格式化代码列表。 也许你用错了一个..只是一个想法

0

尝试使用反射像这样:

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); 
    } 

我怀疑在剪贴板数据的COM对象有困难的时候本身转换到你的格式指定。我也使用输入格式字符串进行安全操作,以便将其注册为适当的剪贴板格式。

HTH

+0

谢谢您的建议。我还没有做过很多反思,所以我将不得不深入一点。 – Patrick 2010-08-24 12:42:22

相关问题