using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Controles;
using Exferia_General;
using Exferia_Ventas._3_Vistas.Controladoras;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Linq;
using static Exferia_Aplicacion.General.Enumerados;
using System.Reflection;
using ClosedXML.Excel;
using Exferia_Ventas._0_Modelos;
using Exferia_Formularios;
using Exferia_Aplicacion.Modelos_Listado_Filtros;

namespace Exferia_Ventas._3_Vistas
{
    public partial class P_PresupuestosCabecera_Bolsa : Exferia_Formularios.P_Base_Mantenimientos
    {
        #region Variables General
        private P_PresupuestosCabecera_Bolsa_Controladora g_obj_Controladora;

        public INTERNO_OpcionesDetalle_Modelo g_mdl_INTERNO_OpcionesDetalle_Modelo = null;

        private bool g_bol_ConstructorPantalla_Terminado_Correctamente = true;
        internal List<INTERNO_Permisos_Modelo> g_lst_INTERNO_Permisos_Modelo = null;

        //Clientes a Seleccionar
        private INTERNO_ConfiguracionPantalla_Modelo g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA = null;
       // private System.Windows.Forms.Timer g_timer_ClientesASELECCIONAR_Filtrar = new System.Windows.Forms.Timer();
        #endregion

        #region Objetos en Pantalla
        //Exferia_BarraProgreso
        internal Exferia_BarraProgreso Exferia_BarraProgreso_Bolsa { get { return ex_pgb_P_PresupuestosCabecera_Bolsa_BarraProgreso; } }

        //Exferia_DataGridView
        internal Exferia_DataGridView Exferia_DataGridView_Listado { get { return ex_dgv_P_PresupuestosCabecera_Bolsa_Listado; } }


        #endregion


        #region Constructor
        public P_PresupuestosCabecera_Bolsa(INTERNO_ValoresGenerales_Modelo _mdl_INTERNO_ValoresGenerales_Modelo,DateTime _dtt_FechaTrabajo)
        {
            InitializeComponent();

            try
            {
                Repintar.Empezar(this);

                CheckForIllegalCrossThreadCalls = false;

                //Empresa seleccionada y fecha de trabajo ....................................................
                P_Base_ValoresGenerales = _mdl_INTERNO_ValoresGenerales_Modelo;
                P_Base_FechaTrabajo = _dtt_FechaTrabajo;

                //Datos de Opciones detalle
                g_mdl_INTERNO_OpcionesDetalle_Modelo = Datos_Generales.PRV_Opciones_Buscar_Detalles(Variables.G_STR_OPCION_VTA_PRESUPUESTOCABECERA_BOLSA);

                //Instanciar Controladora
                g_obj_Controladora = new P_PresupuestosCabecera_Bolsa_Controladora(this);

                //Buscar los Permisos
                g_lst_INTERNO_Permisos_Modelo = Datos_Generales.Permisos_Buscar(Variables.G_STR_OPCION_VTA_PRESUPUESTOCABECERA_BOLSA);

                //Titulo de la Pantalla .............................................................................
                P_Base_TituloPantalla = g_mdl_INTERNO_OpcionesDetalle_Modelo.descripcion_TituloMantenimiento;

                if (Variables.G_DCT_CONFIGURACIONPANTALLA != null && Variables.G_DCT_CONFIGURACIONPANTALLA.Count > 0)
                {
                    //Listado bolsa
                    if (Variables.G_DCT_CONFIGURACIONPANTALLA.ContainsKey(g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa.NOMBRELISTADO_ALMACENARCONFIGURACION()))
                    {
                        g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA = Variables.G_DCT_CONFIGURACIONPANTALLA[g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa.NOMBRELISTADO_ALMACENARCONFIGURACION()];
                    }
                }

                // Label con Empresa Seleccionada 
                if (P_Base_ValoresGenerales != null)
                {
                    try
                    {
                        P_Base_Mantenimientos_InformacionEmpresaSeleccionada = P_Base_ValoresGenerales.str_Empresa_Descripcion + " - " +
                                                                "(" + P_Base_FechaTrabajo.ToString("dd/MM/yyyy") + ")";
                    }
                    catch (Exception ex)
                    {
                        //No se muestra mensaje pero se guarda en el log
                        Control_Errores.Errores_Log("", ex, nameof(P_PresupuestosCabecera_Bolsa) + "/" + nameof(P_PresupuestosCabecera_Bolsa));
                    }
                }
                //....................................................................................................

                //Bloquear pantalla hasta que termine la carga por defecto .....
                Enabled = false;
                //.............................................................
            }
            catch (Control_Errores)
            {
                g_bol_ConstructorPantalla_Terminado_Correctamente = false;
            }
            catch (Exception ex)
            {
                g_bol_ConstructorPantalla_Terminado_Correctamente = false;

                //No se muestra mensaje pero se guarda en el log
                Control_Errores.Errores_Log("", ex, nameof(P_PresupuestosCabecera_Bolsa) + "/" + nameof(P_PresupuestosCabecera_Bolsa));
            }
            finally
            {
                //Bloquear pantalla hasta que termine la carga por defecto .....
                Enabled = true;
                //.............................................................
            }
        }
        #endregion

        #region Inicio de pantalla

        private void P_PresupuestosCabecera_Bolsa_Load(object sender, EventArgs e)
        {
            try
            {
                #region LISTADO BOLSA
                //Crear Columnas Listado
                CrearColumnas_Listado();

                //Poner el tipo de orden si lo hubiera por defecto ###################################################################################
                if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_ORDEN_DIRECCION_PORDEFECTO != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_ORDEN_DIRECCION_PORDEFECTO.Trim().Length > 0)
                {
                    //Descendente
                    if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_ORDEN_DIRECCION_PORDEFECTO.Equals("1"))
                    {
                        Funciones.Cambiar_Imagen_Boton_Orden(0, ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado);
                        ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado.Tag = "1";
                    }
                    //Ascendente
                    else
                    {
                        Funciones.Cambiar_Imagen_Boton_Orden(1, ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado);
                        ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado.Tag = "0";
                    }
                }
                else
                {
                    if (g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa.ORDENACION_TIPO_PORDEFECTO().Trim().Length > 0)
                    {
                        //Descendente
                        if (g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa.ORDENACION_TIPO_PORDEFECTO().Equals("1"))
                        {
                            Funciones.Cambiar_Imagen_Boton_Orden(0, ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado);
                            ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado.Tag = "1";
                        }
                        //Ascendente
                        else
                        {
                            Funciones.Cambiar_Imagen_Boton_Orden(1, ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado);
                            ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado.Tag = "0";

                        }
                    }
                }

                //Seleccionar Orden por Defecto en Combo ###########################################################################################################
                if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_ORDEN_COLUMNA_PORDEFECTO != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_ORDEN_COLUMNA_PORDEFECTO.Trim().Length > 0)
                {
                    ex_cbo_P_PresupuestosCabecera_Bolsa_OrdenListado.SelectedItem = ex_cbo_P_PresupuestosCabecera_Bolsa_OrdenListado.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Descripcion.Equals(g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_ORDEN_COLUMNA_PORDEFECTO)).FirstOrDefault();
                }
                else
                {
                    if (g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa.ORDENACION_NOMBRECOLUMNA_PORDEFECTO().Trim().Length > 0)
                    {
                        ex_cbo_P_PresupuestosCabecera_Bolsa_OrdenListado.SelectedItem = ex_cbo_P_PresupuestosCabecera_Bolsa_OrdenListado.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Identificador.Equals(g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa.ORDENACION_NOMBRECOLUMNA_PORDEFECTO())).FirstOrDefault();
                    }
                    else
                    {
                        ex_cbo_P_PresupuestosCabecera_Bolsa_OrdenListado.SelectedItem = ex_cbo_P_PresupuestosCabecera_Bolsa_OrdenListado.Items.Cast<INTERNO_ComboBox_Modelo>().FirstOrDefault();
                    }

                }
                #endregion
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PresupuestosCabecera_Bolsa) + "/" + nameof(P_PresupuestosCabecera_Bolsa_Load));

                g_bol_ConstructorPantalla_Terminado_Correctamente = false;
            }
        }

        private void P_PresupuestosCabecera_Bolsa_Shown(object sender, EventArgs e)
        {
            try
            {
                if (g_bol_ConstructorPantalla_Terminado_Correctamente)
                {
                    //Rellenar el Listado
                    g_obj_Controladora.Recargar_Listado(true);
                }
                else
                {
                    Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                    Salir_P_Base();
                }
            }
            catch (Control_Errores)
            {
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                Salir_P_Base();
            }
            catch (Exception ex)
            {
                //No se muestra mensaje pero se guarda en el log
                Control_Errores.Errores_Log("", ex, nameof(P_PresupuestosCabecera_Bolsa) + "/" + nameof(P_PresupuestosCabecera_Bolsa_Shown));

                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                Salir_P_Base();
            }
        }
        #endregion

        #region Listado
        private void CrearColumnas_Listado()
        {
            ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.AutoGenerateColumns = false;

            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa.LISTADO_COLUMNAS().Values.ToList())
            {
                DataGridViewTextBoxColumn dgv_Columna = new DataGridViewTextBoxColumn();
                dgv_Columna.DataPropertyName = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                dgv_Columna.Name = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                dgv_Columna.HeaderText = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_AMostrar;

                //Poner visible o no .........................................................................
                bool bol_Visible = true;
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.NoOcultable == false)
                {
                    if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Oculto)
                    {
                        bol_Visible = false;
                    }
                    else if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA != null &&
                             g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_COLUMNASAMOSTRAR != null &&
                             g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_COLUMNASAMOSTRAR.Count > 0)
                    {
                        if (!g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_COLUMNASAMOSTRAR.Contains(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna))
                        {
                            bol_Visible = false;
                        }
                    }
                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Mostrado_PorDefecto == false)
                    {
                        bol_Visible = false;
                    }
                }
                dgv_Columna.Visible = bol_Visible;


                if (bol_Visible)
                {
                    g_obj_Controladora.g_lst_ColumnasAMostrar_BOLSA.Add(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna);
                }
                //.....................................................................................................

                //Tipo de Formateo si fuera Fecha
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    dgv_Columna.DefaultCellStyle.Format = "d";
                }

                //Poner Ancho Columna ................................................................................
                if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_COLUMNAS_ANCHO != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_COLUMNAS_ANCHO.Count > 0 &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_COLUMNAS_ANCHO.ContainsKey(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna))
                {
                    dgv_Columna.Width = g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_COLUMNAS_ANCHO[mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna];
                }
                else
                {
                    if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Ancho > 0)
                    {
                        dgv_Columna.Width = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Ancho;
                    }
                }
                //................................................................................................................

                dgv_Columna.ReadOnly = true;

                //Poner alineado segun tipo de datos ......................................................................................
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL) ||
                    mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG) ||
                    mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT) ||
                    mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    dgv_Columna.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                }
                else
                {
                    dgv_Columna.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
                }
                //..............................................................................................................................

                ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Columns.Add(dgv_Columna);

                //RELLENAR EL ORDEN EN COMBO
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Oculto == false)
                {
                    ex_cbo_P_PresupuestosCabecera_Bolsa_OrdenListado.Items.Add(new INTERNO_ComboBox_Modelo(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna, mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_AMostrar, null));
                }
            }

            //Cambiar el orden de las columnas ........
            if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA != null && g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_COLUMNAS_ORDEN != null && g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_COLUMNAS_ORDEN.Count > 0)
            {
                foreach (KeyValuePair<string, int> kvp_Valores in g_mdl_INTERNO_ConfiguracionPantalla_Modelo_BOLSA.LISTADO_COLUMNAS_ORDEN)
                {
                    ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Columns[kvp_Valores.Key].DisplayIndex = kvp_Valores.Value;
                }
            }
            //.........................................
        }

        #region Orden
        private void ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado_Click(object sender, EventArgs e)
        {
            //Esta Descedente
            if (ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado.Tag.ToString().Equals("1"))
            {
                Funciones.Cambiar_Imagen_Boton_Orden(1, ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado);
            }
            //Esta Ascendente
            else
            {
                Funciones.Cambiar_Imagen_Boton_Orden(0, ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado);
            }

            //Ordena el Listado
            Ordenar_DataGridView();
        }

        private void ex_cbo_P_PresupuestosCabecera_Bolsa_OrdenListado_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Ordena el Listado
            Ordenar_DataGridView();
        }
        private void Ordenar_DataGridView()
        {
            try
            {
                if (ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Rows.Count > 0)
                {
                    //Saber el Tipo de Ordenacion .................................
                    ListSortDirection obj_ListSortDirection = ListSortDirection.Ascending;
                    if (ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado.Tag.ToString().Equals("1"))
                    {
                        obj_ListSortDirection = ListSortDirection.Descending;
                    }
                    //..............................................................

                    if (ex_cbo_P_PresupuestosCabecera_Bolsa_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)ex_cbo_P_PresupuestosCabecera_Bolsa_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                    {
                        ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Sort(ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Columns[((INTERNO_ComboBox_Modelo)ex_cbo_P_PresupuestosCabecera_Bolsa_OrdenListado.SelectedItem).Identificador], obj_ListSortDirection);


                        //Ordenar el Listado ##################

                        //Descendente
                        if (ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado.Tag.ToString().Equals("1"))
                        {
                            g_obj_Controladora.g_lst_Valores = g_obj_Controladora.g_lst_Valores.OrderByDescending(m => m.GetType().GetProperty(((INTERNO_ComboBox_Modelo)ex_cbo_P_PresupuestosCabecera_Bolsa_OrdenListado.SelectedItem).Identificador).GetValue(m, null)).ToList();
                        }
                        //Ascendente
                        else
                        {
                            g_obj_Controladora.g_lst_Valores = g_obj_Controladora.g_lst_Valores.OrderBy(m => m.GetType().GetProperty(((INTERNO_ComboBox_Modelo)ex_cbo_P_PresupuestosCabecera_Bolsa_OrdenListado.SelectedItem).Identificador).GetValue(m, null)).ToList();
                        }
                    }
                    else
                    {
                        ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Sort(ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Columns[g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa.ORDENACION_NOMBRECOLUMNA_PORDEFECTO()], obj_ListSortDirection);

                        //Descendente
                        if (ex_btn_P_PresupuestosCabecera_Bolsa_OrdenListado.Tag.ToString().Equals("1"))
                        {
                            g_obj_Controladora.g_lst_Valores = g_obj_Controladora.g_lst_Valores.OrderByDescending(m => m.GetType().GetProperty(g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa.ORDENACION_NOMBRECOLUMNA_PORDEFECTO()).GetValue(m, null)).ToList();
                        }
                        //Ascendente
                        else
                        {
                            g_obj_Controladora.g_lst_Valores = g_obj_Controladora.g_lst_Valores.OrderBy(m => m.GetType().GetProperty(g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa.ORDENACION_NOMBRECOLUMNA_PORDEFECTO()).GetValue(m, null)).ToList();
                        }
                    }

                    string str_NombreCampoClave = "id";
                    INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa.LISTADO_COLUMNAS().Values.Where(m => m.ColumnaClave).FirstOrDefault();
                    if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo != null)
                    {
                        str_NombreCampoClave = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                    }

                    ///m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null)
                    P_Base_Objetos_Filtrados = g_obj_Controladora.g_lst_Valores.Select(m => new INTERNO_Listado_CamposClave_Modelo { ID = m.GetType().GetProperty(str_NombreCampoClave).GetValue(m) }).ToList();
                    //...........................................................................................................

                    //Seleccionar la primera
                    ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.ClearSelection();
                    ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Rows[0].Selected = true;
                }
            }
            catch (Exception)
            { }
        }
        #endregion

       
        #endregion

        #region Eventos y Procedimientos Publicos
        public override void P_Base_ActualizarRegistros_Campo(List<INTERNO_ActualizarCampoListadoGeneral_Modelo> _lst_CamposActualizar, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            if (_lst_CamposActualizar != null && _lst_CamposActualizar.Count > 0)
            {
                //Actualizar el Listado Principal
                if (P_Base_PantallaOrigen != null)
                {
                    P_Base_PantallaOrigen.P_Base_ActualizarRegistros_Campo(_lst_CamposActualizar, _enum_TipoAccion);
                }

                //Cargar los Datos desde Base de datos
                g_obj_Controladora.Recargar_Listado(true);
            }
        }

        #endregion

        #region Botones
        //Exportar a Excel
        private void ex_btn_P_PresupuestosCabecera_Bolsa_ExportarExcel_Click(object sender, EventArgs e)
        {
            Exportar_Excel();
        }
        private void Exportar_Excel()
        {
            if (Datos_Generales.Permisos_Comprobar(g_mdl_INTERNO_OpcionesDetalle_Modelo.opcion, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.ExportarAExcel, true))
            {
                XLWorkbook obj_XLWorkbook = new XLWorkbook();

                try
                {
                    //Crea la hoja del Excell
                    var obj_worksheet = obj_XLWorkbook.Worksheets.Add("Hoja 1");

                    //Cabecera
                    int int_Contador = 1;

                    List<DataGridViewColumn> lst_ColumnasVisibles = ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Columns
                                                                  .Cast<DataGridViewColumn>()
                                                                  .Where(r => r.Visible)
                                                                  .OrderBy(r => r.DisplayIndex)
                                                                  .ToList();

                    foreach (DataGridViewColumn dgvc_Columna in lst_ColumnasVisibles)
                    {
                        obj_worksheet.Cell(1, int_Contador).Value = dgvc_Columna.HeaderText;

                        //Formato de color al texto y al fondo
                        obj_worksheet.Cell(1, int_Contador).Style.Fill.BackgroundColor = XLColor.FromHtml(Funciones.Convertir_Color_Hexadecimal(Colores.G_COLOR_PRINCIPAL_BASE));
                        obj_worksheet.Cell(1, int_Contador).Style.Font.FontColor = XLColor.FromHtml(Funciones.Convertir_Color_Hexadecimal(Colores.G_COLOR_LISTADO_CABECERA_LETRA));
                        int_Contador++;
                    }

                    //Lineas
                    int int_Contador_Fila = 0;
                    int int_Contador_Columna = 0;
                    if (g_obj_Controladora.g_lst_Valores != null)
                    {
                        //Recorrer las Filas
                        foreach (dynamic dnm_Registro in g_obj_Controladora.g_lst_Valores)
                        {
                            //Recorrer Columnas Visibles
                            foreach (DataGridViewColumn dgvc_Columna in lst_ColumnasVisibles)
                            {
                                string str_NombreColumna = dgvc_Columna.Name;

                                //Buscar el modelo para poder saber que tipo de columna es
                                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo =g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa.LISTADO_COLUMNAS()[str_NombreColumna];

                                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo != null)
                                {
                                    //Tipo fecha
                                    if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                                    {
                                        DateTime? dtt_Valor = dnm_Registro.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(dnm_Registro, null);

                                        if (dtt_Valor != null)
                                        {
                                            obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).SetValue(dtt_Valor.Value.ToString("dd/MM/yyyy")).Style.DateFormat.SetFormat("dd/mm/yyyy");
                                        }
                                        else
                                        {
                                            obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).Value = "";
                                        }
                                    }
                                    //Tipo booleano
                                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                                    {
                                        bool? bol_Valor = dnm_Registro.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(dnm_Registro, null);
                                        string str_Valor = bol_Valor != null && bol_Valor.Value ? "X" : "";

                                        obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).SetValue(str_Valor).SetDataType(XLCellValues.Text);
                                    }
                                    //Tipo decimal
                                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                                    {
                                        decimal? dcm_valor = dnm_Registro.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(dnm_Registro, null);
                                        string str_Valor = (dcm_valor != null ? dcm_valor.ToString() : "").Replace(",", ".");

                                        obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).SetValue(str_Valor).SetDataType(XLCellValues.Number);
                                        obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).Style.NumberFormat.Format = "0.0#?";

                                        //Alinear los numeros a la derecha
                                        obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;

                                    }
                                    //Tipo long
                                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                                    {
                                        long? lng_valor = dnm_Registro.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(dnm_Registro, null);
                                        string str_Valor = lng_valor != null ? lng_valor.ToString() : "";

                                        obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).SetValue(str_Valor).SetDataType(XLCellValues.Number);
                                        obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).Style.NumberFormat.Format = "0";

                                        //Alinear los numeros a la derecha
                                        obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                    }
                                    //Tipo int
                                    else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                                    {
                                        int? int_valor = dnm_Registro.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(dnm_Registro, null);
                                        string str_Valor = int_valor != null ? int_valor.ToString() : "";

                                        obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).SetValue(str_Valor).SetDataType(XLCellValues.Number);
                                        obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).Style.NumberFormat.Format = "0";

                                        //Alinear los numeros a la derecha
                                        obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                    }
                                    //Tipo texto
                                    else
                                    {
                                        string str_valor = dnm_Registro.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(dnm_Registro, null);

                                        obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).SetValue(str_valor).SetDataType(XLCellValues.Text);

                                        //Alinear los texto a la derecha
                                        obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Left;
                                    }
                                }
                                else
                                {
                                    obj_worksheet.Cell(int_Contador_Fila + 2, int_Contador_Columna + 1).Value = "";
                                }

                                //Sumo 1 a la columna
                                int_Contador_Columna += 1;
                            }

                            //Sumo 1 a la fila
                            int_Contador_Fila += 1;

                            //las Columnas se reinician a 0
                            int_Contador_Columna = 0;
                        }
                    }

                    //Ajusto el Excell al contenido
                    obj_worksheet.Columns().AdjustToContents();

                    //Abro un dialog para Guardar
                    SaveFileDialog save = new SaveFileDialog();
                    save.Filter = "Excel (*.xlsx)|*.xlsx";
                    save.Title = "Excel";

                    if (save.ShowDialog() == DialogResult.OK)
                    {
                        //Guardo el Excell
                        obj_XLWorkbook.SaveAs(save.FileName);

                        Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_EXPORTAREXCEL_CORRECTO());
                    }
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_PresupuestosCabecera_Bolsa) + "/" + nameof(Exportar_Excel));
                    Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_EXPORTAREXCEL());
                }
                finally
                {
                    obj_XLWorkbook.Dispose();
                }
            }
        }

        //Borrar Lineas
        private void ex_btn_P_PresupuestosCabecera_Bolsa_Borrar_Click(object sender, EventArgs e)
        {
            Borrar();
        }
        private void Borrar()
        {
            try
            {
                if (Datos_Generales.Permisos_Comprobar(g_mdl_INTERNO_OpcionesDetalle_Modelo.opcion, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Borrar, true))
                {
                    //Registro Seleccionados ........................................
                    List<dynamic> lst_ids = new List<dynamic>();

                    if (ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Rows.Count > 0)
                    {
                        //Buscar el Campo Clave
                        string str_NombreCampoClave = "id";
                        INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo =g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa.LISTADO_COLUMNAS().Values.Where(m => m.ColumnaClave).FirstOrDefault();
                        if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo != null)
                        {
                            str_NombreCampoClave = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                        }

                        if (ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.SelectedRows != null && ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.SelectedRows.Count > 0)
                        {
                            foreach (DataGridViewRow dgvr in ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.SelectedRows)
                            {
                                lst_ids.Add(long.Parse(dgvr.Cells[str_NombreCampoClave].Value.ToString()));
                            }
                        }
                    }
                    //................................................................

                    //Cargamos el ensamblado
                    Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_VENTAS + ".dll");
                    //Obtenemos el tipo de la clase
                    Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_VENTAS + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                    //creamos la instancia
                    var obj_Clase = Activator.CreateInstance(m_type);
                    //Cargamos el metodo solicitado
                    MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_BORRAR_BOLSA, BindingFlags.Instance | BindingFlags.NonPublic);

                    object[] arr_Parametros =   {   g_mdl_INTERNO_OpcionesDetalle_Modelo.opcion,
                                                    this,
                                                    Variables.G_MDL_INTERNO_VALORESGENERALES_MODELO,
                                                    this.P_Base_FechaTrabajo,
                                                    lst_ids
                                                };

                    //Pasamos los parametros al metodo y lo ejecutamos
                    obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
                }
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PresupuestosCabecera_Bolsa) + "/" + nameof(Borrar));
            }
        }

        //Añadir segun filtros
        private void ex_btn_P_PresupuestosCabecera_Bolsa_FiltroAdd_Click(object sender, EventArgs e)
        {
            FiltroAdd();
        }
        private void FiltroAdd()
        {
            try
            {
                if (Datos_Generales.Permisos_Comprobar(Variables.G_STR_OPCION_VTA_PRESUPUESTOCABECERA_BOLSA, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Anadir, true))
                {
                    Dictionary<string, object> dct_ListadoFiltros_Agregados = new Dictionary<string, object>();

                    PE_Listados_Filtros frm_PE_Listados_Filtros = new PE_Listados_Filtros(g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa, ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Columns, dct_ListadoFiltros_Agregados);
                    frm_PE_Listados_Filtros.ShowDialog();

                    if (frm_PE_Listados_Filtros.g_bol_BotonAceptar)
                    {
                        //Mostrar/Ocultar las Columnas que no esten en el Listado ############################################
                        g_obj_Controladora.g_lst_ColumnasAMostrar_BOLSA = frm_PE_Listados_Filtros.g_lst_ColumnasAMostrar;

                        bool bol_Cambio_MostraroOcultar_Columnas = false;

                        foreach (DataGridViewColumn dgvc_ColumnasActuales in ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Columns)
                        {
                            //Mostrar
                            if (g_obj_Controladora.g_lst_ColumnasAMostrar_BOLSA.Contains(dgvc_ColumnasActuales.Name))
                            {
                                if (!dgvc_ColumnasActuales.Visible)
                                {
                                    bol_Cambio_MostraroOcultar_Columnas = true;
                                }

                                dgvc_ColumnasActuales.Visible = true;
                            }
                            //Ocultar
                            else
                            {
                                if (dgvc_ColumnasActuales.Visible)
                                {
                                    bol_Cambio_MostraroOcultar_Columnas = true;
                                }

                                dgvc_ColumnasActuales.Visible = false;
                            }
                        }
                        //######################################################################################################

                        //Rellenar los bolsa con los filtros hechos #############################################################################################################################
                        dct_ListadoFiltros_Agregados = frm_PE_Listados_Filtros.g_dct_ListadoFiltros.ToDictionary(entry => entry.Key, entry => entry.Value);

                        //Si no cambio ninguna columna (mostrar/Ocultar) y no hay filtros, se cargar los filtros avanzados
                        //Si no cambio ninguna columna (mostrar/Ocultar) y hay filtros, se cargar los filtros avanzados
                        //Si cambio alguna columna (mostrar/Ocultar) y no hay filtros, no se cargar los filtros avanzados
                        //Si cambio alguna columna (mostrar/Ocultar) y hay filtros, se cargar los filtros avanzados

                        if (bol_Cambio_MostraroOcultar_Columnas && (dct_ListadoFiltros_Agregados == null || dct_ListadoFiltros_Agregados.Count == 0))
                        {
                            if (frm_PE_Listados_Filtros.g_bol_RecargarListado)
                            {
                                //Cargar los Datos desde Base de datos
                                g_obj_Controladora.Recargar_Listado(true);
                            }
                        }
                        else if (dct_ListadoFiltros_Agregados != null && dct_ListadoFiltros_Agregados.Count > 0)
                        {
                            //Cargamos el ensamblado
                            Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_VENTAS + ".dll");
                            //Obtenemos el tipo de la clase
                            Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_VENTAS + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                            //creamos la instancia
                            var obj_Clase = Activator.CreateInstance(m_type);
                            //Cargamos el metodo solicitado
                            MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_FILTRAR_REGISTROS_PARA_BOLSA, BindingFlags.Instance | BindingFlags.NonPublic);

                            object[] arr_Parametros =   {   g_mdl_INTERNO_OpcionesDetalle_Modelo.opcion,
                                                            Variables.G_STR_OPCION_VTA_PRESUPUESTOCABECERA,
                                                            P_Base_ValoresGenerales.lng_idEmpresa,
                                                            P_Base_ValoresGenerales.EjercicioActivo.id,
                                                             g_obj_Controladora.g_lst_ColumnasAMostrar_BOLSA,
                                                            dct_ListadoFiltros_Agregados
                                        };

                            //Pasamos los parametros al metodo y lo ejecutamos
                            List<long> lst_id_Agregar = (List<long>)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
                            //########################################################################################################################################################################

                            if (lst_id_Agregar != null && lst_id_Agregar.Count > 0)
                            {
                                List<dynamic> lst_id_AgregarFInal = lst_id_Agregar.Cast<dynamic>().ToList();


                                //creamos la instancia
                                var obj_Clase2 = Activator.CreateInstance(m_type);
                                //Cargamos el metodo solicitado
                                MethodInfo obj_MethodInfo2 = obj_Clase2.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_AGREGAR_BOLSA, BindingFlags.Instance | BindingFlags.NonPublic);

                                object[] arr_Parametros2 =   {  g_mdl_INTERNO_OpcionesDetalle_Modelo.opcion,
                                                                this,
                                                                Variables.G_MDL_INTERNO_VALORESGENERALES_MODELO,
                                                                this.P_Base_FechaTrabajo,
                                                                lst_id_AgregarFInal
                                                            };

                                //Pasamos los parametros al metodo y lo ejecutamos
                                obj_MethodInfo2.Invoke(obj_Clase2, arr_Parametros2);
                            }
                            else if (frm_PE_Listados_Filtros.g_bol_RecargarListado)
                            {
                                //Cargar los Datos desde Base de datos
                                g_obj_Controladora.Recargar_Listado(true);
                            }
                        }
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PresupuestosCabecera_Bolsa) + "/" + nameof(FiltroAdd));
            }
        }


        //Quitar segun Filtros
        private void ex_btn_P_PresupuestosCabecera_Bolsa_FiltroBorrar_Click(object sender, EventArgs e)
        {
            FiltroBorrar();
        }
        private void FiltroBorrar()
        {
            try
            {
                if (Datos_Generales.Permisos_Comprobar(Variables.G_STR_OPCION_VTA_PRESUPUESTOCABECERA_BOLSA, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Borrar, true))
                {
                    Dictionary<string, object> dct_ListadoFiltros_Agregados = new Dictionary<string, object>();

                    PE_Listados_Filtros frm_PE_Listados_Filtros = new PE_Listados_Filtros(g_obj_Controladora.g_obj_ABS_Listado_VTA_PresupuestosCabecera_Bolsa, ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Columns, dct_ListadoFiltros_Agregados);
                    frm_PE_Listados_Filtros.ShowDialog();

                    if (frm_PE_Listados_Filtros.g_bol_BotonAceptar)
                    {
                        //Mostrar/Ocultar las Columnas que no esten en el Listado ############################################
                        g_obj_Controladora.g_lst_ColumnasAMostrar_BOLSA = frm_PE_Listados_Filtros.g_lst_ColumnasAMostrar;

                        bool bol_Cambio_MostraroOcultar_Columnas = false;

                        foreach (DataGridViewColumn dgvc_ColumnasActuales in ex_dgv_P_PresupuestosCabecera_Bolsa_Listado.Columns)
                        {
                            //Mostrar
                            if (g_obj_Controladora.g_lst_ColumnasAMostrar_BOLSA.Contains(dgvc_ColumnasActuales.Name))
                            {
                                if (!dgvc_ColumnasActuales.Visible)
                                {
                                    bol_Cambio_MostraroOcultar_Columnas = true;
                                }

                                dgvc_ColumnasActuales.Visible = true;
                            }
                            //Ocultar
                            else
                            {
                                if (dgvc_ColumnasActuales.Visible)
                                {
                                    bol_Cambio_MostraroOcultar_Columnas = true;
                                }

                                dgvc_ColumnasActuales.Visible = false;
                            }
                        }
                        //######################################################################################################

                        //Rellenar los bolsa con los filtros hechos #############################################################################################################################
                        dct_ListadoFiltros_Agregados = frm_PE_Listados_Filtros.g_dct_ListadoFiltros.ToDictionary(entry => entry.Key, entry => entry.Value);

                        //Si no cambio ninguna columna (mostrar/Ocultar) y no hay filtros, se cargar los filtros avanzados
                        //Si no cambio ninguna columna (mostrar/Ocultar) y hay filtros, se cargar los filtros avanzados
                        //Si cambio alguna columna (mostrar/Ocultar) y no hay filtros, no se cargar los filtros avanzados
                        //Si cambio alguna columna (mostrar/Ocultar) y hay filtros, se cargar los filtros avanzados

                        if (bol_Cambio_MostraroOcultar_Columnas && (dct_ListadoFiltros_Agregados == null || dct_ListadoFiltros_Agregados.Count == 0))
                        {
                            if (frm_PE_Listados_Filtros.g_bol_RecargarListado)
                            {
                                //Cargar los Datos desde Base de datos
                                g_obj_Controladora.Recargar_Listado(true);
                            }
                        }
                        else if (dct_ListadoFiltros_Agregados != null && dct_ListadoFiltros_Agregados.Count > 0)
                        {
                            //Cargamos el ensamblado
                            Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_VENTAS + ".dll");
                            //Obtenemos el tipo de la clase
                            Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_VENTAS + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                            //creamos la instancia
                            var obj_Clase = Activator.CreateInstance(m_type);
                            //Cargamos el metodo solicitado
                            MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_FILTRAR_REGISTROS_PARA_BOLSA, BindingFlags.Instance | BindingFlags.NonPublic);

                            object[] arr_Parametros =   {   g_mdl_INTERNO_OpcionesDetalle_Modelo.opcion,
                                                                Variables.G_STR_OPCION_VTA_PRESUPUESTOCABECERA,
                                                                P_Base_ValoresGenerales.lng_idEmpresa,
                                                                P_Base_ValoresGenerales.EjercicioActivo.id,
                                                                 g_obj_Controladora.g_lst_ColumnasAMostrar_BOLSA,
                                                                dct_ListadoFiltros_Agregados
                                                    };

                            //Pasamos los parametros al metodo y lo ejecutamos
                            List<long> lst_id_Agregar = (List<long>)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
                            //########################################################################################################################################################################


                            if (lst_id_Agregar != null && lst_id_Agregar.Count > 0)
                            {
                                List<dynamic> lst_id_AgregarFInal = lst_id_Agregar.Cast<dynamic>().ToList();

                                //creamos la instancia
                                var obj_Clase2 = Activator.CreateInstance(m_type);
                                //Cargamos el metodo solicitado
                                MethodInfo obj_MethodInfo2 = obj_Clase2.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_BORRAR_BOLSA, BindingFlags.Instance | BindingFlags.NonPublic);

                                object[] arr_Parametros2 =   {  g_mdl_INTERNO_OpcionesDetalle_Modelo.opcion,
                                                    this,
                                                    Variables.G_MDL_INTERNO_VALORESGENERALES_MODELO,
                                                    this.P_Base_FechaTrabajo,
                                                    lst_id_AgregarFInal
                                                };

                                //Pasamos los parametros al metodo y lo ejecutamos
                                obj_MethodInfo2.Invoke(obj_Clase2, arr_Parametros2);
                            }
                            else if (frm_PE_Listados_Filtros.g_bol_RecargarListado)
                            {
                                //Cargar los Datos desde Base de datos
                                g_obj_Controladora.Recargar_Listado(true);
                            }
                        }
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PresupuestosCabecera_Bolsa) + "/" + nameof(FiltroBorrar));
            }
        }

        #endregion

        private void ex_btn_P_PresupuestosCabecera_Bolsa_Actualizar_Click(object sender, EventArgs e)
        {
            if (g_obj_Controladora!=null)
            {
                g_obj_Controladora.Recargar_Listado(true);
            }
        }
    }
}
