Как сохранить коллекцию объектов в буфере обмена? - PullRequest
2 голосов
/ 21 июля 2010

У меня есть класс Slide, из которого я хочу поместить несколько экземпляров в буфер обмена.Он прекрасно работает для одного экземпляра.
Но когда я пытаюсь, например, поместить List<Slide> в буфер обмена, вызов SetDataObject будет молча завершаться неудачей.
Внутри будет выдано COMExceptionпроглоченЭто потому, что List не реализует ISerializeable.
Таким образом, List<T>, кажется, не вариант.Как правильно разместить коллекцию Slide экземпляров в буфере обмена?

Ответы [ 2 ]

1 голос
/ 21 июля 2010

Оказывается, мои предположения были неверны.Я просто забыл вызов 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();
      }
    }
  }
}
1 голос
/ 21 июля 2010

ArrayList является сериализуемым.Пока вы теряете сильную типизацию, вы всегда можете разыграть при выходе.

...