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