// populate the motivation detail and motivation group comboboxes
        private void SetupMotivationComboboxes()
        {
            TFinanceControls.InitialiseMotivationGroupList(ref cmbMotivationGroup, FLedgerNumber, false);
            DataRow BlankRow = cmbMotivationGroup.Table.NewRow();

            BlankRow["a_ledger_number_i"]                = FLedgerNumber;
            BlankRow["a_motivation_group_code_c"]        = "";
            BlankRow["a_motivation_group_description_c"] = Catalog.GetString("All groups");
            cmbMotivationGroup.Table.Rows.InsertAt(BlankRow, 0);
            cmbMotivationGroup.cmbCombobox.SelectedIndex   = 0;
            cmbMotivationGroup.ColumnWidthCol2             = 300;
            cmbMotivationGroup.cmbCombobox.SelectionLength = 0;

            TFinanceControls.InitialiseMotivationDetailList(ref cmbMotivationDetail, FLedgerNumber, false);
            BlankRow = cmbMotivationDetail.Table.NewRow();
            BlankRow["a_ledger_number_i"]          = FLedgerNumber;
            BlankRow["a_motivation_group_code_c"]  = "";
            BlankRow["a_motivation_detail_code_c"] = "";
            BlankRow["a_motivation_detail_desc_c"] = Catalog.GetString("All details");
            cmbMotivationDetail.Table.Rows.InsertAt(BlankRow, 0);
            cmbMotivationDetail.cmbCombobox.SelectedIndex   = 0;
            cmbMotivationDetail.ColumnWidthCol2             = 300;
            cmbMotivationDetail.cmbCombobox.SelectionLength = 0;
        }
        /// <summary>
        /// load the gifts into the grid
        /// </summary>
        /// <param name="ALedgerNumber"></param>
        /// <param name="ABatchNumber"></param>
        /// <param name="ABatchStatus"></param>
        /// <param name="AForceLoadFromServer">Set to true to get data from the server even though it is apparently the current batch number and status</param>
        /// <returns>True if gift transactions were loaded from server, false if transactions had been loaded already.</returns>
        public bool LoadGifts(Int32 ALedgerNumber, Int32 ABatchNumber, string ABatchStatus, bool AForceLoadFromServer = false)
        {
            //Set key flags
            bool FirstGiftTransLoad = (FLedgerNumber == -1);
            bool SameCurrentBatch   = ((FLedgerNumber == ALedgerNumber) &&
                                       (FBatchNumber == ABatchNumber) &&
                                       (FBatchStatus == ABatchStatus) &&
                                       !AForceLoadFromServer);

            FBatchRow = GetBatchRow();

            if ((FBatchRow == null) && (GetAnyBatchRow(ABatchNumber) == null))
            {
                MessageBox.Show(String.Format("Cannot load transactions for Gift Batch {0} as the batch is not currently loaded!",
                                              ABatchNumber));
                return(false);
            }

            //Set key values from Batch
            FLedgerNumber         = ALedgerNumber;
            FBatchNumber          = ABatchNumber;
            FBatchCurrencyCode    = FBatchRow.CurrencyCode;
            FBatchMethodOfPayment = FBatchRow.MethodOfPaymentCode;
            FBatchStatus          = ABatchStatus;
            FBatchUnpostedFlag    = (FBatchStatus == MFinanceConstants.BATCH_UNPOSTED);

            if (FirstGiftTransLoad)
            {
                InitialiseControls();
            }

            UpdateCurrencySymbols(FBatchCurrencyCode);

            //Check if the same batch is selected, so no need to apply filter
            if (SameCurrentBatch)
            {
                //Same as previously selected and we have not been asked to force a full refresh
                if (FBatchUnpostedFlag && (GetSelectedRowIndex() > 0))
                {
                    if (FGLEffectivePeriodHasChangedFlag)
                    {
                        //Just in case for the currently selected row, the date field has not been updated
                        FGLEffectivePeriodHasChangedFlag   = false;
                        GetSelectedDetailRow().DateEntered = FBatchRow.GlEffectiveDate;
                        dtpDateEntered.Date = FBatchRow.GlEffectiveDate;
                    }

                    GetDetailsFromControls(GetSelectedDetailRow());
                }

                UpdateControlsProtection();

                if (FBatchUnpostedFlag &&
                    ((FBatchCurrencyCode != FBatchRow.CurrencyCode) ||
                     (FBatchExchangeRateToBase != FBatchRow.ExchangeRateToBase)))
                {
                    UpdateBaseAmount(false);
                }

                return(false);
            }

            //New Batch
            FCurrentGiftInBatch = 0;

            //New set of transactions to be loaded
            TFrmStatusDialog dlgStatus = new TFrmStatusDialog(FPetraUtilsObject.GetForm());

            if (FShowStatusDialogOnLoadFlag == true)
            {
                dlgStatus.Show();
                FShowStatusDialogOnLoadFlag = false;
                dlgStatus.Heading           = String.Format(Catalog.GetString("Batch {0}"), ABatchNumber);
                dlgStatus.CurrentStatus     = Catalog.GetString("Loading transactions ...");
            }

            FGiftTransactionsLoadedFlag = false;
            FSuppressListChangedFlag    = false;

            //Apply new filter
            FPreviouslySelectedDetailRow = null;
            grdDetails.DataSource        = null;

            // if this form is readonly, then we need all codes, because old (inactive) codes might have been used
            if (FirstGiftTransLoad || (FActiveOnlyFlag == (ViewMode || !FBatchUnpostedFlag)))
            {
                FActiveOnlyFlag         = !(ViewMode || !FBatchUnpostedFlag);
                dlgStatus.CurrentStatus = Catalog.GetString("Initialising controls ...");

                try
                {
                    //Without this, the Save button enables even for Posted batches!
                    FPetraUtilsObject.SuppressChangeDetection = true;

                    TFinanceControls.InitialiseMotivationGroupList(ref cmbDetailMotivationGroupCode, FLedgerNumber, FActiveOnlyFlag);
                    TFinanceControls.InitialiseMotivationDetailList(ref cmbMotivationDetailCode, FLedgerNumber, FActiveOnlyFlag);
                    TFinanceControls.InitialiseMethodOfGivingCodeList(ref cmbDetailMethodOfGivingCode, FActiveOnlyFlag);
                    TFinanceControls.InitialiseMethodOfPaymentCodeList(ref cmbDetailMethodOfPaymentCode, FActiveOnlyFlag);
                    TFinanceControls.InitialisePMailingList(ref cmbDetailMailingCode, FActiveOnlyFlag);
                }
                finally
                {
                    FPetraUtilsObject.SuppressChangeDetection = false;
                }
            }

            // This sets the incomplete filter but does check the panel enabled state
            ShowData();

            // This sets the main part of the filter but excluding the additional items set by the user GUI
            // It gets the right sort order
            SetGiftDetailDefaultView();

            // only load from server if there are no transactions loaded yet for this batch
            // otherwise we would overwrite transactions that have already been modified
            if (FMainDS.AGiftDetail.DefaultView.Count == 0)
            {
                dlgStatus.CurrentStatus = Catalog.GetString("Requesting transactions from server ...");
                //Load all partners in Batch
                FMainDS.DonorPartners.Merge(TRemote.MFinance.Gift.WebConnectors.LoadAllPartnerDataForBatch(ALedgerNumber, ABatchNumber)); //LoadAllPartnerDataForBatch();
                //Include Donor fields
                LoadGiftDataForBatch(ALedgerNumber, ABatchNumber);
            }

            //Check if need to update batch period in each gift
            if (FBatchUnpostedFlag)
            {
                dlgStatus.CurrentStatus = Catalog.GetString("Updating batch period ...");
                ((TFrmGiftBatch)ParentForm).GetBatchControl().UpdateBatchPeriod();
            }

            // Now we set the full filter
            FFilterAndFindObject.ApplyFilter();
            UpdateRecordNumberDisplay();
            FFilterAndFindObject.SetRecordNumberDisplayProperties();

            SelectRowInGrid(1);

            UpdateControlsProtection();

            dlgStatus.CurrentStatus = Catalog.GetString("Updating totals for the batch ...");
            UpdateTotals();

            if ((FPreviouslySelectedDetailRow != null) && (FBatchUnpostedFlag))
            {
                bool disableSave = (FBatchRow.RowState == DataRowState.Unchanged && !FPetraUtilsObject.HasChanges);

                if (disableSave && FPetraUtilsObject.HasChanges && !DataUtilities.DataRowColumnsHaveChanged(FBatchRow))
                {
                    FPetraUtilsObject.DisableSaveButton();
                }
            }

            FGiftTransactionsLoadedFlag = true;
            dlgStatus.Close();

            return(true);
        }
        private void SetupMotivationComboboxes()
        {
            /* cmbMotivationGroup */

            TFinanceControls.InitialiseMotivationGroupList(ref cmbMotivationGroup, FLedgerNumber, false);

            // remove motivation groups that are not used in the results
            List <int> RemoveIndexes = new List <int>();

            for (int i = 0; i < cmbMotivationGroup.Table.Rows.Count; i++)
            {
                bool NotFound = true;

                foreach (DataRow DetailRow in FMainDS.Tables[TEMP_TABLE_NAME].Rows)
                {
                    if (cmbMotivationGroup.Table.Rows[i]["a_motivation_group_code_c"].ToString() == DetailRow["MotivationGroupCode"].ToString())
                    {
                        NotFound = false;
                        break;
                    }
                }

                if (NotFound)
                {
                    RemoveIndexes.Add(i);
                }
            }

            for (int i = RemoveIndexes.Count - 1; i >= 0; i--)
            {
                cmbMotivationGroup.Table.Rows.RemoveAt(RemoveIndexes[i]);
            }

            DataRow BlankRow = cmbMotivationGroup.Table.NewRow();

            BlankRow["a_ledger_number_i"]                = FLedgerNumber;
            BlankRow["a_motivation_group_code_c"]        = ALL;
            BlankRow["a_motivation_group_description_c"] = Catalog.GetString("All groups");
            cmbMotivationGroup.Table.Rows.InsertAt(BlankRow, 0);
            cmbMotivationGroup.cmbCombobox.SelectedIndex = 0;
            cmbMotivationGroup.ColumnWidthCol2           = 300;
            cmbMotivationGroup.Enabled = true;
            cmbMotivationGroup.cmbCombobox.SelectionLength = 0;

            /* cmbMotivationDetail */

            TFinanceControls.InitialiseMotivationDetailList(ref cmbMotivationDetail, FLedgerNumber, false);

            // remove motivation details that are not used in the results
            RemoveIndexes.Clear();

            for (int i = 0; i < cmbMotivationDetail.Table.Rows.Count; i++)
            {
                bool NotFound = true;

                foreach (DataRow DetailRow in FMainDS.Tables[TEMP_TABLE_NAME].Rows)
                {
                    if (cmbMotivationDetail.Table.Rows[i]["a_motivation_detail_code_c"].ToString() == DetailRow["MotivationDetailCode"].ToString())
                    {
                        NotFound = false;
                        break;
                    }
                }

                if (NotFound)
                {
                    RemoveIndexes.Add(i);
                }
            }

            for (int i = RemoveIndexes.Count - 1; i >= 0; i--)
            {
                cmbMotivationDetail.Table.Rows.RemoveAt(RemoveIndexes[i]);
            }

            BlankRow = cmbMotivationDetail.Table.NewRow();
            BlankRow["a_ledger_number_i"]          = FLedgerNumber;
            BlankRow["a_motivation_group_code_c"]  = "";
            BlankRow["a_motivation_detail_code_c"] = ALL;
            BlankRow["a_motivation_detail_desc_c"] = Catalog.GetString("All details");
            cmbMotivationDetail.Table.Rows.InsertAt(BlankRow, 0);
            cmbMotivationDetail.cmbCombobox.SelectedIndex = 0;
            cmbMotivationDetail.ColumnWidthCol2           = 300;
            cmbMotivationDetail.Enabled = true;
            cmbMotivationDetail.cmbCombobox.SelectionLength = 0;
        }