public void Export(Control owner, BindingListSource bindingListSource)
 {
     try
     {
         var    dataFormats = new[] { DataFormats.CSV, DataFormats.TSV };
         string fileFilter  = string.Join("|", dataFormats.Select(format => format.FileFilter).ToArray()); // Not L10N
         using (var saveFileDialog = new SaveFileDialog
         {
             Filter = fileFilter,
             InitialDirectory = GetExportDirectory(),
             FileName = GetDefaultExportFilename(bindingListSource.ViewInfo),
         })
         {
             if (saveFileDialog.ShowDialog(FormUtil.FindTopLevelOwner(owner)) == DialogResult.Cancel)
             {
                 return;
             }
             var dataFormat = dataFormats[saveFileDialog.FilterIndex - 1];
             SafeWriteToFile(owner, saveFileDialog.FileName, stream =>
             {
                 var writer             = new StreamWriter(stream, new UTF8Encoding(false));
                 var cloneableRowSource = bindingListSource.RowSource as ICloneableList;
                 bool finished          = false;
                 if (null == cloneableRowSource)
                 {
                     var progressMonitor = new UncancellableProgressMonitor();
                     WriteData(progressMonitor, writer, bindingListSource, dataFormat.GetDsvWriter());
                     finished = true;
                 }
                 else
                 {
                     var clonedList = cloneableRowSource.DeepClone();
                     RunLongJob(owner, progressMonitor =>
                     {
                         using (var clonedBindingList = new BindingListSource())
                         {
                             SetViewFrom(bindingListSource, clonedList, clonedBindingList);
                             WriteData(progressMonitor, writer, clonedBindingList, dataFormat.GetDsvWriter());
                             finished = !progressMonitor.IsCanceled;
                         }
                     });
                 }
                 if (finished)
                 {
                     writer.Flush();
                 }
                 return(finished);
             });
             SetExportDirectory(Path.GetDirectoryName(saveFileDialog.FileName));
         }
     }
     catch (Exception exception)
     {
         ShowMessageBox(owner, Resources.AbstractViewContext_Export_There_was_an_error_writing_to_the_file__ + exception.Message,
                        MessageBoxButtons.OK);
     }
 }
 public void CopyAll(Control owner, BindingListSource bindingListSource)
 {
     try
     {
         StringWriter tsvWriter          = new StringWriter();
         var          cloneableRowSource = bindingListSource.RowSource as ICloneableList;
         if (null == cloneableRowSource)
         {
             var progressMonitor = new UncancellableProgressMonitor();
             WriteData(progressMonitor, tsvWriter, bindingListSource, DataFormats.TSV.GetDsvWriter());
         }
         else
         {
             var clonedList = cloneableRowSource.DeepClone();
             if (!RunLongJob(owner, progressMonitor =>
             {
                 using (var clonedBindingList = new BindingListSource())
                 {
                     SetViewFrom(bindingListSource, clonedList, clonedBindingList);
                     WriteData(progressMonitor, tsvWriter, clonedBindingList, DataFormats.TSV.GetDsvWriter());
                     progressMonitor.UpdateProgress(new ProgressStatus(string.Empty).Complete());
                 }
             }))
             {
                 return;
             }
         }
         DataObject dataObject = new DataObject();
         dataObject.SetText(tsvWriter.ToString());
         Clipboard.SetDataObject(dataObject);
     }
     catch (Exception exception)
     {
         ShowMessageBox(owner,
                        Resources.AbstractViewContext_CopyAll_There_was_an_error_copying_the_data_to_the_clipboard__ + exception.Message,
                        MessageBoxButtons.OK);
     }
 }