private void DoCopy(bool ToClipboard) { if (Xls == null) { MessageBox.Show("Please push the New File button before copying"); return; } //VERY IMPORTANT!!!!! //**************************************************************************** //The MemoryStreams CAN NOT BE DISPOSED UNTIL WE CALL Clipboard.SetObjectData. //Even when we assigned the Stream with the DataObject Data, it is still in use and can't be freed. //**************************************************************************** try { DataObject data = new DataObject(); List <MemoryStream> dataStreams = new List <MemoryStream>(); //we will use this list to dispose the memorystreams after they have been used. try { foreach (FlexCelClipboardFormat cf in Enum.GetValues(typeof(FlexCelClipboardFormat))) { MemoryStream dataStream = new MemoryStream(); dataStreams.Add(dataStream); Xls.CopyToClipboard(cf, dataStream); dataStream.Position = 0; data.SetData(FlexCelDataFormats.GetString(cf), dataStream); } if (ToClipboard) { Clipboard.SetDataObject(data, true); } else { DoDragDrop(data, DragDropEffects.Copy); } } finally { foreach (MemoryStream ms in dataStreams) { ms.Dispose(); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
private object GetConfigSheet(ref MemoryStream xlsStream) { xlsStream = null; try { XlsFile Xls = new XlsFile(); Assembly a = Assembly.GetExecutingAssembly(); /*This will not work on Delphi, since it does not embed the xls files as resources * using (Stream MemStream = a.GetManifestResourceStream("FlexCelDesigner.Config.xls")) * { * Xls.Open(MemStream); * } */ System.Resources.ResourceManager rm = new System.Resources.ResourceManager("TVCDesigner.Config", a); byte[] WbData = (byte[])rm.GetObject("Config_xls"); using (Stream MemStream = new MemoryStream(WbData)) { Xls.Open(MemStream); } StringBuilder textString = new StringBuilder(); xlsStream = new MemoryStream(); //Do NOT DISPOSE THE STREAM. We could, if we called BegingDrag or CopyToClipHere. We can't dispose it till we call those methods. { Xls.CopyToClipboard(textString, xlsStream); xlsStream.Position = 0; DataObject data = new DataObject(); data.SetData(FlexCelDataFormats.Excel97, xlsStream); data.SetData(DataFormats.Text, textString.ToString()); return(data); } } catch (Exception ex) { MessageBox.Show(ex.Message); } return(null); }