private void bgwMain_DoWork(object sender, DoWorkEventArgs e)
        {
            object[] parameters        = e.Argument as object[];
            BackgroundWorkerTasks task = (BackgroundWorkerTasks)parameters[0];

            if (task == BackgroundWorkerTasks.AddServicesFromFile)
            {
                string path = parameters[1] as string;
                e.Result = AddServicesFromDataTable(path, e);
            }
            else if (task == BackgroundWorkerTasks.CheckForExisingServices)
            {
                List <DataServiceInfo> rows = parameters[1] as List <DataServiceInfo>;
                e.Result = CheckForServicesInCache(rows, e);
            }
            else if (task == BackgroundWorkerTasks.UpdateDatabase)
            {
                List <DataServiceInfo> services = parameters[1] as List <DataServiceInfo>;
                e.Result = AddServicesToDatabase(services, e);
            }
            else
            {
                // Build parameters to pass to the background worker
                object[] outParameters = new object[2];
                outParameters[0] = BackgroundWorkerTasks.Unknown;
                outParameters[1] = "Unknown task provided to background worker";

                e.Result = outParameters;
            }
        }
        private void bgwMain_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.Cursor = Cursors.Default;

            BackgroundWorkerTasks task = BackgroundWorkerTasks.Unknown;

            // Report the result
            if (e.Error != null)
            {
                MessageBox.Show(e.Error.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else if (e.Cancelled)
            {
                if (this.Visible == true && _formIsClosing == false)
                {
                    MessageBox.Show("Operation cancelled", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                string message = "";

                object[] parameters = e.Result as object[];

                if ((parameters != null) && (parameters.Length > 1))
                {
                    message = parameters[1] as string;

                    task = (BackgroundWorkerTasks)parameters[0];
                    if (task == BackgroundWorkerTasks.AddServicesFromHydroPortal ||
                        task == BackgroundWorkerTasks.AddServicesFromFile ||
                        task == BackgroundWorkerTasks.AddServicesFromHydroServer)
                    {
                        dgvAddServices.Enabled = true;

                        List <string[]> rowsToAdd = parameters[2] as List <string[]>;
                        foreach (string[] row in rowsToAdd)
                        {
                            int rowIndex = dgvAddServices.Rows.Add(row);
                            SelectDataGridViewRow(dgvAddServices, rowIndex);
                            //dgvAddServices.Rows[dgvAddServices.Rows.Add ( row )].Cells["Selected"].Value = true;
                        }

                        this.ActiveControl = btnUpdate;
                    }
                    else if (task == BackgroundWorkerTasks.CheckForExisingServices)
                    {
                        List <int> rowsToSelect = parameters[2] as List <int>;
                        foreach (int row in rowsToSelect)
                        {
                            dgvAddServices.Rows[row].Cells["Selected"].Value = true;
                        }

                        this.ActiveControl = btnCheckExisting;
                    }
                    else if (task == BackgroundWorkerTasks.UpdateDatabase)
                    {
                        this.ActiveControl = btnUpdate;
                    }
                }

                MessageBox.Show(message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            // Enable controls that were disabled until the asynchronous operation was finished
            RestoreFormFromWork();

            if (_formIsClosing == true)
            {
                _formIsClosing = false;
                Hide();
            }
            else if (task == BackgroundWorkerTasks.UpdateDatabase)
            {
                this.DialogResult = System.Windows.Forms.DialogResult.OK;
            }
        }