/// <summary> /// BackgroundWorker method used to create a datatable including data queried from Databasein in all the fields selected. /// </summary> /// <param name="parameters"> BackgroundWorker parameters passed from Export Button Click Event</param> /// <param name="exportdlgWorker"> BackgroundWorker (may be null), in order to show progress</param> /// <param name="e">Arguments from a BackgroundWorker (may be null), in order to support canceling</param> /// <returns>Return the BackgroundWorker result.</returns> private string Exportdlg(BwParameters parameters, BackgroundWorker exportdlgWorker, DoWorkEventArgs e) { if (ExportThemes) { return(ExportDataSeriesTable(parameters, exportdlgWorker, e)); } return(ExportAnyDataTable(parameters, exportdlgWorker, e)); }
/// <summary> /// Export data using BackgroundWorker. Build series table and pass parameters from here to BackgroundWorker. /// </summary> private void btnExport_Click(object sender, EventArgs e) { // Make sure we aren't still working on a previous task if (bgwMain.IsBusy) { MessageBox.Show("The background worker is busy now. Please try later.", "Export To Text File", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } //Check the themes for export. There should be at least one item selected. if (ExportThemes && clbThemes.CheckedItems.Count == 0) { MessageBox.Show("Please choose at least one theme to export", "Export To Text File", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } //Check the desired fields for export. There should be at least one item selected. if (clbExportItems.CheckedItems.Count == 0) { MessageBox.Show("Please choose at least one field to export", "Export To Text File", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } //Check whether a delimiter is checked var delimiter = delimiterSelector1.CurrentDelimiter; if (String.IsNullOrEmpty(delimiter)) { MessageBox.Show("Please input delimiter.", "Export To Text File"); return; } //Check the output file path string outputFilename = tbOutPutFileName.Text.Trim(); if (outputFilename == String.Empty) { MessageBox.Show("Please specify output filename", "Export To Text File"); return; } if (Directory.Exists(Path.GetDirectoryName(outputFilename)) == false) { MessageBox.Show("The directory for the output filename does not exist", "Export To Text File"); return; } // Construct DataTable of all the series in the selected theme DataTable dtSeries; if (ExportThemes) { var themeIds = (from ThemeDescription themeDescr in clbThemes.CheckedItems select themeDescr.ThemeId).ToList(); var repository = RepositoryFactory.Instance.Get <IDataSeriesRepository>(); dtSeries = repository.GetSeriesIDsWithNoDataValueTable(themeIds); } else { dtSeries = _dataToExport; } var checkedItems = new List <string>(); foreach (var item in clbExportItems.CheckedItems.Cast <string>().Where(item => !checkedItems.Contains(item))) { checkedItems.Add(item); } DatesRange datesRange = null; if (chbUseDateRange.Checked && cmbDateTimeColumns.SelectedIndex >= 0) { datesRange = new DatesRange { ColumnName = cmbDateTimeColumns.SelectedItem.ToString(), StartDate = dtpStartDateRange.Value, EndDate = dtpEndDateRange.Value, }; } //Disable all the buttons after "Export" button is clicked. UpdateControlsState(true); // Show hourglass Cursor = Cursors.WaitCursor; //pass parameters to BackgroundWorker var parameters = new BwParameters { CheckNoData = chkNodata.Checked, Columns = checkedItems, DatesRange = datesRange, Delimiter = delimiter, OutputFileName = outputFilename, Series = dtSeries, }; // Check for overwrite if (File.Exists(outputFilename)) { var message = "File " + outputFilename + " already exists.\nWould you like to replace it?"; var replace = MessageBox.Show(message, "Export To Text File", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (replace == DialogResult.No) { Cursor = Cursors.Default; // Restore controls to their regular state UpdateControlsState(false); return; } File.Delete(outputFilename); bgwMain.RunWorkerAsync(parameters); } else { bgwMain.RunWorkerAsync(parameters); } }
private string ExportAnyDataTable(BwParameters parameters, BackgroundWorker backgroundWorker, DoWorkEventArgs e) { var filename = parameters.OutputFileName; var checkedItems = parameters.Columns; var delimiter = parameters.Delimiter; var originalDataTable = parameters.Series; //Report status backgroundWorker.ReportProgress(0, "Preparing output..."); DataTable exportDataTable; if (checkedItems.Count == originalDataTable.Rows.Count) { exportDataTable = originalDataTable; } else { //Build a new datatable to accept selected columns in the original datatable and used to export. exportDataTable = originalDataTable.Copy(); // copy //Check for cancel if (backgroundWorker.CancellationPending) { e.Cancel = true; return("Data Export Cancelled."); } //Report status backgroundWorker.ReportProgress(0, "Checking columns..."); //Remove unwanted columns foreach (DataColumn column in originalDataTable.Columns) { //Check for cancel if (backgroundWorker.CancellationPending) { e.Cancel = true; return("Data Export Cancelled."); } var columnName = column.ColumnName; if (!checkedItems.Contains(columnName)) { exportDataTable.Columns.Remove(columnName); } exportDataTable.AcceptChanges(); } } // Check for cancel if (backgroundWorker.CancellationPending) { e.Cancel = true; return("Data Export Cancelled."); } ImportExport.DelimitedTextWriter.DataTableToDelimitedFile(exportDataTable, filename, delimiter, true, false, backgroundWorker, e, ImportExport.BackgroundWorkerReportingOptions.UserStateAndProgress); if (backgroundWorker.CancellationPending) { e.Cancel = true; return("Data Export Cancelled."); } return("Export complete. Rows exported: " + exportDataTable.Rows.Count.ToString(CultureInfo.InvariantCulture)); }
private string ExportDataSeriesTable(BwParameters parameters, BackgroundWorker backgroundWorker, DoWorkEventArgs e) { //get parameters var fileName = parameters.OutputFileName; var dtSeries = parameters.Series; var checkNodata = parameters.CheckNoData; var delimiter = parameters.Delimiter; var checkedItems = parameters.Columns; var datesRange = parameters.DatesRange; var repo = RepositoryFactory.Instance.Get <IDataValuesRepository>(); //export data row by row for (int r = 0; r < dtSeries.Rows.Count; r++) { var row = dtSeries.Rows[r]; //Check for cancel if (backgroundWorker.CancellationPending) { e.Cancel = true; return("Data Export Cancelled."); } var noDataValue = !checkNodata?Convert.ToDouble(row["NoDataValue"]) : (double?)null; // Date range filter string dateColumn = null; DateTime?firstDate = null; DateTime?lastDate = null; if (datesRange != null) { dateColumn = datesRange.ColumnName; firstDate = datesRange.StartDate; lastDate = datesRange.EndDate; } var tbl = repo.GetTableForExport(Convert.ToInt64(row["SeriesID"]), noDataValue, dateColumn, firstDate, lastDate); //Check for cancel if (backgroundWorker.CancellationPending) { e.Cancel = true; return("Data Export Cancelled."); } //Construct columns that were selected for (int i = 0; i < tbl.Columns.Count; i++) { var column = tbl.Columns[i]; if (!checkedItems.Contains(column.ColumnName)) { tbl.Columns.Remove(column); i--; } //Check for cancel if (backgroundWorker.CancellationPending) { e.Cancel = true; return("Data Export Cancelled."); } } //Check for cancel if (backgroundWorker.CancellationPending) { e.Cancel = true; return("Data Export Cancelled."); } var includeHeaders = r == 0; ImportExport.DelimitedTextWriter.DataTableToDelimitedFile(tbl, fileName, delimiter, includeHeaders, true, backgroundWorker, e, ImportExport.BackgroundWorkerReportingOptions.UserStateAndProgress); //progress report var percent = (int)(((float)r / dtSeries.Rows.Count) * 100); var userState = "Writing series " + r + " of " + dtSeries.Rows.Count + "..."; backgroundWorker.ReportProgress(percent, userState); } //Check for cancel if (backgroundWorker.CancellationPending) { e.Cancel = true; return("Data Export Cancelled."); } return(dtSeries.Rows.Count.ToString(CultureInfo.InvariantCulture) + " data series downloaded to: " + fileName); }