// FIND AND SELECT IN LIST PROVIDED DEFAULT ID
 //------------------------------------------------------------------------------------------------------------
 private void FindSelectDefautID(int?DefaultID)
 {
     if (DefaultID != null)
     {
         foreach (BetterListViewItem item in lstItens)
         {
             if (Convert.ToInt32(item.Text) == DefaultID)
             {
                 item.Selected = true;
                 propEscolha   = GetSelectedItem();
             }
             else
             {
                 item.Selected = false;
             }
         }
     }
     else
     {
         if (lstItens.Items.Count > 0)
         {
             lstItens.Items[0].Selected = true;
         }
     }
 }
        // EDITAR CONTA ESCOLHIDA
        //------------------------------------------------------------------------------------------------------------
        private void btnEditar_Click(object sender, EventArgs e)
        {
            //--- check selected item
            if (dgvListagem.SelectedRows.Count == 0)
            {
                AbrirDialog("Favor selecionar um registro para Editar...",
                            "Selecionar Registro", DialogType.OK, DialogIcon.Information);
                return;
            }

            //--- get Selected item
            objReuniao item = (objReuniao)dgvListagem.SelectedRows[0].DataBoundItem;

            //--- open edit form
            if (_formOrigem == null)
            {
                frmCongregacaoReuniao frm = new frmCongregacaoReuniao(item);
                frm.MdiParent = Application.OpenForms.OfType <frmPrincipal>().FirstOrDefault();
                DesativaMenuPrincipal();
                Close();
                frm.Show();
            }
            else
            {
                propEscolha  = item;
                DialogResult = DialogResult.Yes;
            }
        }
        private int _RecorrenciaTipo;         // property TIPO of recorrencia, change textboxes and labels

        #region SUB NEW | PROPERTIES

        // SUB NEW
        //------------------------------------------------------------------------------------------------------------
        public frmCongregacaoReuniao(objReuniao obj)
        {
            InitializeComponent();

            _reuniao        = obj;
            bind.DataSource = _reuniao;
            BindingCreator();

            _reuniao.PropertyChanged += RegistroAlterado;

            if (_reuniao.IDReuniao == null)
            {
                Sit = EnumFlagEstado.NovoRegistro;
            }
            else
            {
                Sit = EnumFlagEstado.RegistroSalvo;
            }

            propRecorrenciaTipo = _reuniao.RecorrenciaTipo;

            AtivoButtonImage();

            // HANDLERS
            HandlerKeyDownControl(this);
            txtReuniao.Validating += (a, b) => PrimeiraLetraMaiuscula(txtReuniao);
        }
        // INSERT
        //------------------------------------------------------------------------------------------------------------
        public int InsertReuniao(objReuniao reuniao, object dbTran = null)
        {
            AcessoDados db = (AcessoDados)dbTran;

            try
            {
                if (db == null)
                {
                    db = new AcessoDados();
                }

                //--- clear Params
                db.LimparParametros();

                //--- define Params
                db.AdicionarParametros("@Reuniao", reuniao.Reuniao);
                db.AdicionarParametros("@IDCongregacao", reuniao.IDCongregacao);
                db.AdicionarParametros("@RecorrenciaTipo", reuniao.RecorrenciaTipo);
                db.AdicionarParametros("@RecorrenciaRepeticao", reuniao.RecorrenciaRepeticao);
                db.AdicionarParametros("@RecorrenciaDia", reuniao.RecorrenciaDia);
                db.AdicionarParametros("@RecorrenciaSemana", reuniao.RecorrenciaSemana);
                db.AdicionarParametros("@RecorrenciaMes", reuniao.RecorrenciaMes);
                db.AdicionarParametros("@IniciarData", reuniao.IniciarData);
                db.AdicionarParametros("@Ativa", reuniao.Ativa);

                //--- convert null parameters
                db.ConvertNullParams();

                //--- create query
                string query = db.CreateInsertSQL("tblReunioes");

                //--- insert
                return((int)db.ExecutarInsertAndGetID(query));
            }
            catch (SqlException ex)
            {
                if (ex.Number == 2627)
                {
                    if (db.isTran)                     // reuniao duplicada mas esta inserindo em grupo de congregacoes
                    {
                        return(0);
                    }
                    else                     // reuniao duplicada
                    {
                        throw new AppException("Já existe um Reunião com o mesmo nome...");
                    }
                }
                else
                {
                    throw ex;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        // DELETE REUNIAO IF IS POSSIBLE
        //------------------------------------------------------------------------------------------------------------
        public void DeleteReuniao(objReuniao reuniao)
        {
            try
            {
                AcessoDados db = new AcessoDados();

                // 1. check unused reuniao
                //-------------------------------------------------------------------------

                //--- clear Params
                db.LimparParametros();

                //--- define Params
                db.AdicionarParametros("@IDReuniao", reuniao.IDReuniao);

                //--- create query
                string query = "SELECT COUNT(IDContribuicao) AS Total " +
                               "FROM tblContribuicao " +
                               "WHERE IDReuniao = @IDReuniao";

                //--- QUERY
                DataTable dt = db.ExecutarConsulta(CommandType.Text, query);

                if (dt.Rows.Count == 0)
                {
                    throw new AppException("Não houve retorno do número de registro associados à reunião...");
                }
                else if ((int)dt.Rows[0][0] > 0)
                {
                    throw new AppException($"Essa reunião não pode ser excluída porque existem {(int)dt.Rows[0][0]} contribuições ligadas a ela...");
                }

                // 2. DELETE
                //-------------------------------------------------------------------------

                //--- clear Params
                db.LimparParametros();

                //--- define Params
                db.AdicionarParametros("@IDReuniao", reuniao.IDReuniao);

                //--- create query
                query = "DELETE tblReunioes WHERE IDReuniao = @IDReuniao";

                //--- update
                db.ExecutarManipulacao(CommandType.Text, query);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        // INSERT REUNIAO FOR ALL CONGREGACOES ATIVAS
        //------------------------------------------------------------------------------------------------------------
        public int InsertReuniaoAllCongregacoes(objReuniao reuniao)
        {
            AcessoDados dbTran = null;

            try
            {
                // create transaction
                dbTran = new AcessoDados();
                dbTran.BeginTransaction();

                // get list of congregacoes ATIVAS
                List <objCongregacao> listCong = new CongregacaoBLL().GetListCongregacao(true);

                // check count congregacoes
                if (listCong.Count == 0)
                {
                    throw new Exception("Não existe nenhuma congregação cadastrada ainda...");
                }

                // last Inserted ID
                int ID = 0;

                foreach (var cong in listCong)
                {
                    try
                    {
                        int lastID;
                        reuniao.IDCongregacao = cong.IDCongregacao;
                        reuniao.Congregacao   = cong.Congregacao;
                        lastID = InsertReuniao(reuniao, dbTran);
                        ID     = lastID;
                    }
                    catch (AppException)
                    {
                        continue;
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }

                dbTran.CommitTransaction();
                return(ID);
            }
            catch (Exception)
            {
                dbTran.RollBackTransaction();
                throw;
            }
        }
        // INSERIR NOVO REGISTRO
        //------------------------------------------------------------------------------------------------------------
        private void btnNovo_Click(object sender, EventArgs e)
        {
            if (Sit != EnumFlagEstado.RegistroSalvo)
            {
                return;
            }

            _reuniao = new objReuniao(null);
            Sit      = EnumFlagEstado.NovoRegistro;
            AtivoButtonImage();
            bind.DataSource = _reuniao;
            txtReuniao.Focus();
            chkTodasCongregacoes.Checked = false;
        }
 // CONTROL IMAGES OF LIST DATAGRID
 //------------------------------------------------------------------------------------------------------------
 private void dgvListagem_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
 {
     if (e.ColumnIndex == 3)
     {
         objReuniao item = (objReuniao)dgvListagem.Rows[e.RowIndex].DataBoundItem;
         if (item.Ativa)
         {
             e.Value = ImgAtivo;
         }
         else
         {
             e.Value = ImgInativo;
         }
     }
 }
 // ADICIONAR CONTA
 //------------------------------------------------------------------------------------------------------------
 private void btnAdicionar_Click(object sender, EventArgs e)
 {
     if (_formOrigem == null)
     {
         frmCongregacaoReuniao frm = new frmCongregacaoReuniao(new objReuniao(null));
         frm.MdiParent = Application.OpenForms.OfType <frmPrincipal>().FirstOrDefault();
         DesativaMenuPrincipal();
         Close();
         frm.Show();
     }
     else
     {
         propEscolha  = new objReuniao(null);
         DialogResult = DialogResult.Yes;
     }
 }
        private void btnEscolher_Click(object sender, EventArgs e)
        {
            objReuniao item = GetSelectedItem();

            //--- check selected item
            if (item == null)
            {
                AbrirDialog("Favor selecionar um registro para Selecionar...",
                            "Selecionar Registro", DialogType.OK, DialogIcon.Information);
                return;
            }

            //--- open edit form
            propEscolha  = item;
            DialogResult = DialogResult.OK;
        }
 // CONTROL IMAGES OF LIST DATAGRID
 //------------------------------------------------------------------------------------------------------------
 private void dgvReuniao_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
 {
     if (e.ColumnIndex == clnImage.Index)
     {
         objReuniao item = (objReuniao)dgvReuniao.Rows[e.RowIndex].DataBoundItem;
         if (item.Ativa)
         {
             e.Value = ImgAtivo;
         }
         else
         {
             e.Value = ImgInativo;
         }
         e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
     }
 }
        // DELETE REUNIAO
        //------------------------------------------------------------------------------------------------------------
        private void mnuExcluir_Click(object sender, EventArgs e)
        {
            //--- verifica se existe alguma cell
            if (dgvListagem.SelectedRows.Count == 0)
            {
                return;
            }

            //--- Verifica o item
            objReuniao reuniao = (objReuniao)dgvListagem.SelectedRows[0].DataBoundItem;

            //---pergunta ao usuário
            var reponse = AbrirDialog($"Deseja realmente REMOVER definitavamente essa Reuniao?" +
                                      $"\n{reuniao.Reuniao.ToUpper()} " +
                                      $"\n{reuniao.Congregacao.ToUpper()}",
                                      "Excluir Reunião",
                                      DialogType.SIM_NAO, DialogIcon.Question);

            if (reponse == DialogResult.No)
            {
                return;
            }

            //--- Salvar o Registro
            try
            {
                // --- Ampulheta ON
                Cursor.Current = Cursors.WaitCursor;

                rBLL.DeleteReuniao(reuniao);

                //--- altera a imagem
                ObterDados();
                FiltrarListagem();
            }
            catch (Exception ex)
            {
                AbrirDialog("Uma exceção ocorreu ao Alterar Reuniao..." + "\n" +
                            ex.Message, "Exceção", DialogType.OK, DialogIcon.Exclamation);
            }
            finally
            {
                // --- Ampulheta OFF
                Cursor.Current = Cursors.Default;
            }
        }
        private void AtivarDesativar_Reuniao_Click(object sender, EventArgs e)
        {
            //--- verifica se existe alguma cell
            if (dgvListagem.SelectedRows.Count == 0)
            {
                return;
            }

            //--- Verifica o item
            objReuniao setor = (objReuniao)dgvListagem.SelectedRows[0].DataBoundItem;

            //---pergunta ao usuário
            var reponse = AbrirDialog($"Deseja realmente {(setor.Ativa ? "DESATIVAR " : "ATIVAR")} essa Reuniao?\n" +
                                      setor.Reuniao.ToUpper(), (setor.Ativa ? "DESATIVAR " : "ATIVAR"),
                                      DialogType.SIM_NAO, DialogIcon.Question);

            if (reponse == DialogResult.No)
            {
                return;
            }

            //--- altera o valor
            setor.Ativa = !setor.Ativa;

            //--- Salvar o Registro
            try
            {
                // --- Ampulheta ON
                Cursor.Current = Cursors.WaitCursor;

                rBLL.UpdateReuniao(setor);

                //--- altera a imagem
                FiltrarListagem();
            }
            catch (Exception ex)
            {
                AbrirDialog("Uma exceção ocorreu ao Alterar Reuniao..." + "\n" +
                            ex.Message, "Exceção", DialogType.OK, DialogIcon.Exclamation);
            }
            finally
            {
                // --- Ampulheta OFF
                Cursor.Current = Cursors.Default;
            }
        }
        // CONVERT ROW IN CLASS
        //------------------------------------------------------------------------------------------------------------
        public objReuniao ConvertRowInClass(DataRow row)
        {
            objReuniao reuniao = new objReuniao((int)row["IDReuniao"])
            {
            };

            reuniao.Reuniao                  = (string)row["Reuniao"];
            reuniao.IDCongregacao            = row["IDCongregacao"] == DBNull.Value ? null : (int?)row["IDCongregacao"];
            reuniao.Congregacao              = row["Congregacao"] == DBNull.Value ? "" : (string)row["Congregacao"];
            reuniao.RecorrenciaTipo          = row["RecorrenciaTipo"] == DBNull.Value ? (byte)0 : (byte)row["RecorrenciaTipo"];
            reuniao.RecorrenciaTipoDescricao = row["RecorrenciaTipoDescricao"] == DBNull.Value ? "" : (string)row["RecorrenciaTipoDescricao"];
            reuniao.RecorrenciaRepeticao     = row["RecorrenciaRepeticao"] == DBNull.Value ? (short)0 : (short)row["RecorrenciaRepeticao"];
            reuniao.RecorrenciaDia           = row["RecorrenciaDia"] == DBNull.Value ? (byte)0 : (byte)row["RecorrenciaDia"];
            reuniao.RecorrenciaSemana        = row["RecorrenciaSemana"] == DBNull.Value ? (byte)0 : (byte)row["RecorrenciaSemana"];
            reuniao.RecorrenciaMes           = row["RecorrenciaMes"] == DBNull.Value ? (byte)0 : (byte)row["RecorrenciaMes"];
            if (row["IniciarData"] != DBNull.Value)
            {
                reuniao.IniciarData = (DateTime)row["IniciarData"];
            }
            reuniao.Ativa = (bool)row["Ativa"];

            return(reuniao);
        }
        private void dgvListagem_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                Control c = (Control)sender;
                DataGridView.HitTestInfo hit = dgvListagem.HitTest(e.X, e.Y);
                dgvListagem.ClearSelection();

                //---VERIFICAÇÕES NECESSARIAS
                if (hit.Type != DataGridViewHitTestType.Cell)
                {
                    return;
                }

                // seleciona o ROW
                dgvListagem.Rows[hit.RowIndex].Cells[0].Selected = true;
                dgvListagem.Rows[hit.RowIndex].Selected          = true;

                // mostra o MENU ativar e desativar
                objReuniao Reuniao = (objReuniao)dgvListagem.Rows[hit.RowIndex].DataBoundItem;

                if (Reuniao.Ativa == true)
                {
                    AtivarToolStripMenuItem.Enabled    = false;
                    DesativarToolStripMenuItem.Enabled = true;
                }
                else
                {
                    AtivarToolStripMenuItem.Enabled    = true;
                    DesativarToolStripMenuItem.Enabled = false;
                }

                // revela menu
                MenuListagem.Show(c.PointToScreen(e.Location));
            }
        }
        // UPDATE
        //------------------------------------------------------------------------------------------------------------
        public bool UpdateReuniao(objReuniao reuniao)
        {
            try
            {
                AcessoDados db = new AcessoDados();

                //--- clear Params
                db.LimparParametros();

                //--- define Params
                db.AdicionarParametros("@IDReuniao", reuniao.IDReuniao);
                db.AdicionarParametros("@Reuniao", reuniao.Reuniao);
                db.AdicionarParametros("@IDCongregacao", reuniao.IDCongregacao);
                db.AdicionarParametros("@RecorrenciaTipo", reuniao.RecorrenciaTipo);
                db.AdicionarParametros("@RecorrenciaRepeticao", reuniao.RecorrenciaRepeticao);
                db.AdicionarParametros("@RecorrenciaDia", reuniao.RecorrenciaDia);
                db.AdicionarParametros("@RecorrenciaSemana", reuniao.RecorrenciaSemana);
                db.AdicionarParametros("@RecorrenciaMes", reuniao.RecorrenciaMes);
                db.AdicionarParametros("@IniciarData", reuniao.IniciarData);
                db.AdicionarParametros("@Ativa", reuniao.Ativa);

                //--- convert null parameters
                db.ConvertNullParams();

                //--- create query
                string query = db.CreateUpdateSQL("tblReunioes", "IDReuniao");

                //--- update
                db.ExecutarManipulacao(CommandType.Text, query);
                return(true);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }