如何在剪贴板中存储对象集合?

时间:2010-07-21 18:54:45

标签: c# generics serialization clipboard

我有一个类Slide,其中我想在剪贴板中放置几个​​实例。它对单个实例完全正常 但是,当我尝试将List<Slide>放入剪贴板时,SetDataObject调用将无声地失败。
在内部,将抛出一个COMException并被吞下。这是因为List未实现ISerializeable 所以,List<T>似乎不是一个选择。将Slide个实例集合放在剪贴板中的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

ArrayList是可序列化的。虽然你失去了强大的打字,但你总是可以摆脱出局。

答案 1 :(得分:1)

原来我的假设是不正确的。我只是忘记了ToList()来电,只是将IEnumerable传递给SetData。添加之后,它就可以很好地放入剪贴板了。

这是我最后使用的代码:

public void CopySelectedSlidesToClipboard() {
  // Construct data format for Slide collection
  DataFormats.Format dataFormat = DataFormats.GetFormat( typeof( List<Slide> ).FullName );

  // Construct data object from selected slides
  IDataObject dataObject = new DataObject();

  List<Slide> dataToCopy = SelectedSlides.ToList();
  dataObject.SetData( dataFormat.Name, false, dataToCopy );

  // Put data into clipboard
  Clipboard.SetDataObject( dataObject, false );
}

public void PasteSlidesFromClipboard() {
  // Get data object from the clipboard
  IDataObject dataObject = Clipboard.GetDataObject();
  if( dataObject != null ) {
    // Check if a collection of Slides is in the clipboard
    string dataFormat = typeof( List<Slide> ).FullName;
    if( dataObject.GetDataPresent( dataFormat ) ) {
      // Retrieve slides from the clipboard
      List<Slide> slides = dataObject.GetData( dataFormat ) as List<Slide>;
      if( slides != null ) {
        Slides = Slides.Concat( slides ).ToList();
      }
    }
  }
}