using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_MantenimientoAgrupacionesCabecera;
using Exferia_Aplicacion.Sincronizacion;
using Exferia_General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_Formularios.Controladoras
{
    public class P_MantenimientoAgrupacionesLineas_Controladora
    {
        #region Variables Generales
        private P_MantenimientoAgrupacionesLineas g_frm_P_MantenimientoAgrupacionesLineas = null;//Variable que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc

        private INTERNO_MantenimientoAgrupacionesLinea_Modelo g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo = null;
        private INTERNO_MantenimientoAgrupacionesCabecera_Modelo g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo = null;

        public bool g_bol_Termino_CargaDatos_Inicial = false;//Se utiliza para saber cuando se termina la carga de datos estaticos inciales

        //Array de imagen
        public byte[] g_arr_Imagen;
        public Image g_img_Imagen;

        #region Tareas Asincronas
        //Tareea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;

        //Tareea Asincrona de grabar de datos
        private BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;
        public bool g_bol_GrabarDatos_TerminoCorrectamente = true;
        public bool g_bol_GrabarDatos_VaciarDatos = false;

        //Tareea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos;
        private bool g_bol_BorrarDatos_VolverListado = true;
        #endregion

        public bool g_bol_CampoCodigo_Numerico = false;

        #region Agrupaciones
        private List<long> g_lst_RegistrosSeleccionados_Listado = new List<long>();
        public List<dynamic> g_lst_ListadoRegistros = null;

        #region Listado Incluir Registros

        //Obtencion de los valores de los registros desde base de datos ############################
        private BackgroundWorker g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos;

        //Tareea Asincrona de Marcar/Desmarcar Todo
        private BackgroundWorker g_obj_TareaAsincrona_MarcarDesmarcar;
        public bool g_bol_CancelarTareaAsincrona_MarcarDesmarcar = false;

        public bool g_bol_Obtencion_ListadoCompleto_BaseDatos_Termino = false;
        public bool g_bol_Obtencion_ListadoCompleto_BaseDatos_RellenarDataGridView = false;

        private List<dynamic> g_lst_ListadoRegistros_Filtrados_IncluirRegistros = null;

        //Tarea Asincrona para la Rellenar DataGridView de Incluir Registros
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros;
        public bool g_bol_CancelarTareaAsincrona_IncluirRegistros = false;

        //Listado de Columnas
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_ListadoIncluirRegistros_Columnas;
        
        //Filtrado del Listado de Incluir Registros
        public List<string> g_lst_ColumnasAMostrar_ListadoIncluirRegistros = new List<string>();
        public Dictionary<string, object> g_dct_ListadoFiltros_ListadoIncluirRegistros = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_ListadoIncluirRegistros = 0;
        public List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_Filtros_ListadoIncluirRegistros = new List<INTERNO_ComboBox_Modelo>();
        #endregion
        #region Listado Registros Seleccionados

        //Tarea Asincrona para la Rellenar DataGridView de Registros Seleccionados
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados;
        public bool g_bol_CancelarTareaAsincrona_RegistrosSeleccionados = false;

        //Tarea Asincrona de Vaciar Registros Seleccionados
        private BackgroundWorker g_obj_TareaAsincrona_VaciarRegistrosSeleccionados;
        public bool g_bol_CancelarTareaAsincrona_VaciarRegistrosSeleccionados = false;
        private List<long> g_lst_RegistrosSeleccionados_AVaciar = null;
        //Listado de Columnas
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_ListadoRegistrosSeleccionados_Columnas;

        //Filtrado del Listado de Registros Seleccionados
        public List<string> g_lst_ColumnasAMostrar_ListadoRegistrosSeleccionados = new List<string>();
        public Dictionary<string, object> g_dct_ListadoFiltros_ListadoRegistrosSeleccionados = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_ListadoRegistrosSeleccionados = 0;
        public List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_Filtros_ListadoRegistrosSeleccionados = new List<INTERNO_ComboBox_Modelo>();
        #endregion
        #endregion

        #region Impresoras
        public List<long> g_lst_Impresoras_RegistrosSeleccionados_Listado = new List<long>();
        public List<dynamic> g_lst_Impresoras_ListadoRegistros = null;

        #region Impresoras Registros Seleccionados
        //Tarea Asincrona para la Rellenar DataGridView de Impresoras Registros Seleccionados
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados;
        public bool g_bol_CancelarTareaAsincrona_Impresoras_RegistrosSeleccionados = false;

        //Tarea Asincrona de Vaciar Registros Seleccionados
        private BackgroundWorker g_obj_TareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados;
        public bool g_bol_CancelarTareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados = false;
        private List<long> g_lst_Impresoras_RegistrosSeleccionados_AVaciar = null;
        //Listado de Columnas
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Impresoras_RegistrosSeleccionados_Columnas;

        //Filtrado del Listado de Registros seleccionados
        public List<string> g_lst_ColumnasAMostrar_Impresoras_RegistrosSeleccionados = new List<string>();
        public Dictionary<string, object> g_dct_ListadoFiltros_Impresoras_RegistrosSeleccionados = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_Impresoras_RegistrosSeleccionados = 0;
        public List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_Filtros_Impresoras_RegistrosSeleccionados = new List<INTERNO_ComboBox_Modelo>();
        #endregion

        #region Impresoras Incluir Registros Lineas
        //Tareea Asincrona de Marcar/Desmarcar 
        private BackgroundWorker g_obj_TareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros;
        public bool g_bol_CancelarTareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros = false;

        private List<dynamic> g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros = null;

        //Tarea Asincrona para la Rellenar DataGridView de Incluir Registros
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros;
        public bool g_bol_CancelarTareaAsincrona_Impresoras_IncluirRegistros = false;

        //Listado de Columnas
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Impresoras_IncluirRegistros_Columnas;

        //Filtrado del Listado de Incluir Registros
        public List<string> g_lst_ColumnasAMostrar_Impresoras_IncluirRegistros = new List<string>();
        public Dictionary<string, object> g_dct_ListadoFiltros_Impresoras_IncluirRegistros = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_Impresoras_IncluirRegistros = 0;
        public List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_Filtros_Impresoras_IncluirRegistros = new List<INTERNO_ComboBox_Modelo>();
        #endregion
        #endregion

        #endregion

        #region Constructor
        public P_MantenimientoAgrupacionesLineas_Controladora(P_MantenimientoAgrupacionesLineas _frm_P_MantenimientoAgrupacionesLineas, INTERNO_MantenimientoAgrupacionesCabecera_Modelo _mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo)
        {
            g_frm_P_MantenimientoAgrupacionesLineas = _frm_P_MantenimientoAgrupacionesLineas;
            g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo = _mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo;

            //Rellenar los datos de la Cabecera .............
            g_frm_P_MantenimientoAgrupacionesLineas.Exferia_Label_SinColor_DatosCabecera_Codigo.Text = g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.codigo;
            g_frm_P_MantenimientoAgrupacionesLineas.Exferia_Label_SinColor_DatosCabecera_Descripcion.Text = g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.descripcion;
            //...............................................

            if (g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera!=null &&
                g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.FILTROS()!=null &&
                g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.FILTROS().Count>0)
            {
                g_dct_ListadoFiltros_ListadoIncluirRegistros = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.FILTROS();
            }

            //(Tarea Asincrona) Obtener Listado de BaseDatos ####################################################################
            g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos = new BackgroundWorker();
            g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_Obtener_ListadoCompleto_BaseDatos_DoWork);
            g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Obtener_ListadoCompleto_BaseDatos_Completed);
            g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos.WorkerReportsProgress = false;
            g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Rellenar Listado Incluir Registros ####################################################################
            g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros = new BackgroundWorker();
            g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros_DoWork);
            g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros_ProgressChanged);
            g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros_Completed);
            g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros.WorkerReportsProgress = true;
            g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Rellenar Listado Registros Seleccionados ####################################################################
            g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados = new BackgroundWorker();
            g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados_DoWork);
            g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados_ProgressChanged);
            g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados_Completed);
            g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados.WorkerReportsProgress = true;
            g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Seleccionar/Desseleccionar Todo ####################################################################
            g_obj_TareaAsincrona_MarcarDesmarcar = new BackgroundWorker();
            g_obj_TareaAsincrona_MarcarDesmarcar.DoWork += new DoWorkEventHandler(TareaAsincrona_MarcarDesmarcar_DoWork);
            g_obj_TareaAsincrona_MarcarDesmarcar.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_MarcarDesmarcar_Completed);
            g_obj_TareaAsincrona_MarcarDesmarcar.WorkerReportsProgress = false;
            g_obj_TareaAsincrona_MarcarDesmarcar.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Vaciar Registros Seleccionados ####################################################################
            g_obj_TareaAsincrona_VaciarRegistrosSeleccionados = new BackgroundWorker();
            g_obj_TareaAsincrona_VaciarRegistrosSeleccionados.DoWork += new DoWorkEventHandler(TareaAsincrona_VaciarRegistrosSeleccionados_DoWork);
            g_obj_TareaAsincrona_VaciarRegistrosSeleccionados.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_VaciarRegistrosSeleccionados_Completed);
            g_obj_TareaAsincrona_VaciarRegistrosSeleccionados.WorkerReportsProgress = false;
            g_obj_TareaAsincrona_VaciarRegistrosSeleccionados.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Rellenar Listado Impresoras Incluir Registros ####################################################################
            g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros = new BackgroundWorker();
            g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros_DoWork);
            g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros_ProgressChanged);
            g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros_Completed);
            g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros.WorkerReportsProgress = true;
            g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Rellenar Listado Impresoras Registros Seleccionados ####################################################################
            g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados = new BackgroundWorker();
            g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados_DoWork);
            g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados_ProgressChanged);
            g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados_Completed);
            g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados.WorkerReportsProgress = true;
            g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Marcar/Desmarcar Impresoras ####################################################################
            g_obj_TareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros = new BackgroundWorker();
            g_obj_TareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros.DoWork += new DoWorkEventHandler(TareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros_DoWork);
            g_obj_TareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros_Completed);
            g_obj_TareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros.WorkerReportsProgress = false;
            g_obj_TareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Vaciar Impresoras Registros Seleccionados ####################################################################
            g_obj_TareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados = new BackgroundWorker();
            g_obj_TareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados.DoWork += new DoWorkEventHandler(TareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados_DoWork);
            g_obj_TareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados_Completed);
            g_obj_TareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados.WorkerReportsProgress = false;
            g_obj_TareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados.WorkerSupportsCancellation = true;
            //#####################################################################################################

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Vaciar datos
        public void VaciarDatos()
        {
            //codigo
            g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Codigo.Text = "";
            //descripcion
            g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Descripcion.Text = "";

            //orden
            if (g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.MOSTRAR_CAMPO_ORDEN())
            {
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Orden.Text = "";
            }

                //Vaciar los Checkeados en el Listado de Incluir Registros y de Registros Seleccionados
                if (g_lst_RegistrosSeleccionados_Listado != null && g_lst_RegistrosSeleccionados_Listado.Count>0)
            {
                Actualizar_ListadoBaseDatos_Seleccionados_Colectivo(g_lst_RegistrosSeleccionados_Listado, false);

                Rellenar_DataGridView_RegistrosSeleccionados(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_RegistrosSeleccionados_Busqueda.Text);
                Rellenar_DataGridView_IncluirRegistros(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_IncluirRegistros_Busqueda.Text);
            }

            g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo = null;

            //Vaciar los Checkeados en el Listado de Incluir Registros y de Registros Seleccionados Impresoras
            if (g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.MOSTRAR_LINEA_IMPRESORA())
            {
                if (g_lst_Impresoras_RegistrosSeleccionados_Listado != null &&
                    g_lst_Impresoras_RegistrosSeleccionados_Listado.Count > 0)
                {
                    Actualizar_Impresoras_BaseDatos_Seleccionados_Colectivo(g_lst_Impresoras_RegistrosSeleccionados_Listado, false);

                    Rellenar_DataGridView_Impresoras_RegistrosSeleccionados(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Impresoras_RegistrosSeleccionados_Busqueda.Text);
                    Rellenar_DataGridView_Impresoras_IncluirRegistros(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Impresoras_IncluirRegistros_Busqueda.Text);
                }
            }

            if (g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.MOSTRAR_SELECCION_COLORES() ||
                g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.MOSTRAR_SELECCION_IMAGEN())
            {
                //Colores por defecto
                CambiarColores(Color.White, Color.Black);

                //Imagen
                g_arr_Imagen = null;
                g_img_Imagen = null;
                g_frm_P_MantenimientoAgrupacionesLineas.PictureBox_Imagen.Image = null;
                g_frm_P_MantenimientoAgrupacionesLineas.PictureBox_Imagen.Tag = "";
            }

            string[] str_Separador = new string[] { " [" };
            //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
            if (g_frm_P_MantenimientoAgrupacionesLineas.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
            {
                g_frm_P_MantenimientoAgrupacionesLineas.P_Base_TituloPantalla = (g_frm_P_MantenimientoAgrupacionesLineas.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
            }

            //Actualizar el Boton de Seleccion de pantalla ####################################################
            Variables.G_EMS_CONTROL_MENUSUPERIOR.Update_Texto_NombrePantalla(g_frm_P_MantenimientoAgrupacionesLineas.Tag.ToString());
            //#################################################################################################
        }
        #endregion

        public INTERNO_ValorDevuelto_Modelo Buscar_CodigoSiguiente()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                string str_CodigoSiguiente = Datos_Generales.Buscar_CodigoSiguiente(
                                                                                        g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_TABLA_LINEA(),
                                                                                        g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CAMPO_CODIGO_LINEA(),
                                                                                        g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CAMPO_IDEMPRESA_LINEA(),
                                                                                        g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo != null ? g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.idEmpresa : Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.lng_idEmpresa, g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_TABLA_LINEA()),
                                                                                        g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.TIENE_FECHABORRADO_LINEA(),
                                                                                        g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Codigo.Exferia_TextBox_MaxLength);

                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Codigo.Text = str_CodigoSiguiente;
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CODIGOSIGUIENTE_LIMITEALCANZADO(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_Label_Codigo.Text);
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(BorrarDatos_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        #region Comprobacion de cambios, para  grabar o no antes de salir o cambiar de registro
        public bool ComprobarCambios()
        {
            if (g_frm_P_MantenimientoAgrupacionesLineas.P_Base_SeModificoDatosPantalla)
            {
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_GUARDARCAMBIOS()))
                {
                    GrabarDatos(false);

                    //Te quedas espernado a que termine la tarea asincrona de grabar
                    while (g_obj_TareaAsincrona_GrabarDatos.IsBusy)
                        Application.DoEvents();

                    return g_bol_GrabarDatos_TerminoCorrectamente;
                }
            }
            return true;
        }
        #endregion

        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_MantenimientoAgrupacionesLineas.Enabled = false;

                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();
                
                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_CargarDatos != null)
                {
                    while (g_obj_TareaAsincrona_CargarDatos.IsBusy)
                        Application.DoEvents();

                    //Vaciar
                    VaciarDatos();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_DoWork);
                    g_obj_TareaAsincrona_CargarDatos.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargarDatos_ProgressChanged);
                    g_obj_TareaAsincrona_CargarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                    g_obj_TareaAsincrona_CargarDatos.WorkerReportsProgress = true;
                }

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_CargarDatos.RunWorkerAsync();
                //#################################################################################################

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_MantenimientoAgrupacionesLineas.Enabled = true;

                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(RecargarDatos), true);
            }
        }
        private void TareaAsincrona_CargarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                // Cargar Valores
                if (CargarDatos(g_frm_P_MantenimientoAgrupacionesLineas.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargarDatos_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                
            }
            catch (Exception)
            {}
        }
        private void TareaAsincrona_CargarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }

            //Desbloquear el Formulario
            g_frm_P_MantenimientoAgrupacionesLineas.Enabled = true;

            try
            {
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    g_frm_P_MantenimientoAgrupacionesLineas.Salir_P_Base();
                }
                else
                {
                    //PictureBox
                    if (g_img_Imagen != null)
                    {
                        g_frm_P_MantenimientoAgrupacionesLineas.PictureBox_Imagen.Image = g_img_Imagen;
                        Funciones.PictureBox_RedimencionarImagen(g_frm_P_MantenimientoAgrupacionesLineas.PictureBox_Imagen, g_frm_P_MantenimientoAgrupacionesLineas.PictureBox_Imagen.Image);
                    }

                    //Agrupaciones
                    Rellenar_DataGridView_RegistrosSeleccionados(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_RegistrosSeleccionados_Busqueda.Text);
                    Rellenar_DataGridView_IncluirRegistros(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_IncluirRegistros_Busqueda.Text);

                    //Impresoras
                    if (g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.MOSTRAR_LINEA_IMPRESORA())
                    {
                        Rellenar_DataGridView_Impresoras_IncluirRegistros(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Impresoras_IncluirRegistros_Busqueda.Text);
                        Rellenar_DataGridView_Impresoras_RegistrosSeleccionados(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Impresoras_RegistrosSeleccionados_Busqueda.Text);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_MantenimientoAgrupacionesLineas.Salir_P_Base();
            }
            finally
            {
                //Hacemos foco al primer control.
                Funciones.Poner_Foco_Objeto(g_frm_P_MantenimientoAgrupacionesLineas, g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Codigo);
            }
        }

        public bool CargarDatos(long _lng_id)
        {
            bool bol_ValorDevuelto = true;

            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType("" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + 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_OBTENER_REGISTRO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = {
                    g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_LINEA(),
                    _lng_id,
                    g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.lng_idEmpresa,
                    ((g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales!=null && g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.EjercicioActivo!=null ) ? g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.EjercicioActivo.id : -1)
                };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo = (INTERNO_MantenimientoAgrupacionesLinea_Modelo)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

                //Si no es Nulo Cargo lo Datos
                if (g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo != null)
                {
                    //Paginador ................................................................................
                    if (g_frm_P_MantenimientoAgrupacionesLineas.P_Base_PantallaOrigen != null &&
                        g_frm_P_MantenimientoAgrupacionesLineas.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados != null &&
                        g_frm_P_MantenimientoAgrupacionesLineas.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count > 0)
                    {
                        long lng_id_ParaPaginacion = g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.id;
                        int int_PaginaDelObjeto = g_frm_P_MantenimientoAgrupacionesLineas.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.IndexOf(g_frm_P_MantenimientoAgrupacionesLineas.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Where(n => n.ID.Equals(lng_id_ParaPaginacion)).FirstOrDefault());

                        g_frm_P_MantenimientoAgrupacionesLineas.g_obj_Funciones_Paginador.SetPaginaActual(int_PaginaDelObjeto);
                        // Asignando al paginador la pagina actual.
                        g_frm_P_MantenimientoAgrupacionesLineas.Exferia_Paginador_MantenimientoAgrupacionesLineas.PaginaActual = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_Funciones_Paginador.GetPaginaActual();
                    }
                    //...........................................................................................

                    // codigo
                    g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Codigo.Text = g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.codigo;

                    //descripcion
                    g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Descripcion.Text = g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.descripcion;

                    //orden
                    if (g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.MOSTRAR_CAMPO_ORDEN())
                    {
                        g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Orden.Text = g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.orden != null ? g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.orden.Value.ToString() : "";
                    }
                    
                    //Listado de Agrupados
                    if (g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Listado_Agrupados != null)
                    {
                        g_lst_RegistrosSeleccionados_Listado = g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Listado_Agrupados.ToList();

                        Actualizar_ListadoBaseDatos_Seleccionados_Colectivo(g_lst_RegistrosSeleccionados_Listado, true);
                    }

                    //Colores
                    if (g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.MOSTRAR_SELECCION_COLORES())
                    {
                        CambiarColores(((g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.colorFondo != null && g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.colorFondo.Trim().Length > 0) ? ColorTranslator.FromHtml(g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.colorFondo) : Color.White),
                                        ((g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.colorLetra != null && g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.colorLetra.Trim().Length > 0) ? ColorTranslator.FromHtml(g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.colorLetra) : Color.Black)
                                       );
                    }

                    //Imagen
                    if (g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.MOSTRAR_SELECCION_IMAGEN())
                    {
                        if (g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Imagen_Modelo!=null &&
                            g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Imagen_Modelo.imagen != null)
                        {
                            g_arr_Imagen = g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Imagen_Modelo.imagen;
                            g_img_Imagen = Funciones.Convertir_Arraybytes_Image(g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Imagen_Modelo.imagen);
                        }
                    }

                    //Listado de Impresoras relacionadas
                    if (g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.MOSTRAR_LINEA_IMPRESORA())
                    {
                        if (g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Listado_Impresoras != null)
                        {
                            g_lst_Impresoras_RegistrosSeleccionados_Listado = g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Listado_Impresoras.ToList();

                            Actualizar_Impresoras_BaseDatos_Seleccionados_Colectivo(g_lst_Impresoras_RegistrosSeleccionados_Listado, true);
                        }
                    }

                    // Mostrar Campo en el Titulo de mantenimiento
                    string str_MenuSuperior_Codigo = "";
                    if (g_frm_P_MantenimientoAgrupacionesLineas.g_mdl_PRV_OpcionesDetalle != null &&
                        g_frm_P_MantenimientoAgrupacionesLineas.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento != null &&
                        g_frm_P_MantenimientoAgrupacionesLineas.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Trim().Length > 0)
                    {
                        //Obtener el Array de Campos
                        string[] arr_Campos = g_frm_P_MantenimientoAgrupacionesLineas.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Split(new Char[] { ',' });
                        string str_ValorAMostrarFinal = "";

                        string[] str_Separador = new string[] { " [" };
                        //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
                        if (g_frm_P_MantenimientoAgrupacionesLineas.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
                        {
                            g_frm_P_MantenimientoAgrupacionesLineas.P_Base_TituloPantalla = (g_frm_P_MantenimientoAgrupacionesLineas.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
                        }

                        dynamic dnm_Objeto = g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo;
                        foreach (string str_campo in arr_Campos)
                        {
                            var Valor = dnm_Objeto.GetType().GetProperty(str_campo).GetValue(dnm_Objeto, null);
                            if (Valor != null)
                            {
                                str_ValorAMostrarFinal += " " + Valor;
                            }

                            // codigo
                            if (str_campo.Equals(nameof(g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.codigo)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.codigo;
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_MantenimientoAgrupacionesLineas.P_Base_TituloPantalla += " [" + str_ValorAMostrarFinal + "] -Modificar";
                        }
                    }

                    //Actualizar el Boton de Seleccion de pantalla ####################################################
                    Variables.G_EMS_CONTROL_MENUSUPERIOR.Add_Texto_NombrePantalla_Descripciones(g_frm_P_MantenimientoAgrupacionesLineas.Tag.ToString(), str_MenuSuperior_Codigo);
                    //#################################################################################################

                    g_frm_P_MantenimientoAgrupacionesLineas.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(CargarDatos));
                bol_ValorDevuelto = false;
            }

            return bol_ValorDevuelto;
        }

        #endregion

        #region Grabar Datos

        public void GrabarDatos(bool _bol_GrabarDatos_VaciarDatos)
        {
            try
            {
                g_bol_GrabarDatos_TerminoCorrectamente = true;
                g_bol_GrabarDatos_VaciarDatos = _bol_GrabarDatos_VaciarDatos;

                g_frm_P_MantenimientoAgrupacionesLineas.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());
                
                g_obj_TareaAsincrona_GrabarDatos = new BackgroundWorker();
                g_obj_TareaAsincrona_GrabarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_GrabarDatos_DoWork);
                g_obj_TareaAsincrona_GrabarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_GrabarDatos_Completed);
                g_obj_TareaAsincrona_GrabarDatos.RunWorkerAsync();

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_bol_GrabarDatos_TerminoCorrectamente = false;
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
                g_frm_P_MantenimientoAgrupacionesLineas.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(GrabarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_GrabarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                // Validar Primero
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_VALIDACION = ValidarDatos();
                if (mdl_ValorDevuelto_Modelo_VALIDACION.TodoCorrecto)
                {
                    mdl_ValorDevuelto_Modelo = GrabarDatos_Final();
                }
                else
                {
                    mdl_ValorDevuelto_Modelo = mdl_ValorDevuelto_Modelo_VALIDACION;
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_GrabarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }
            g_frm_P_MantenimientoAgrupacionesLineas.Enabled = true;

            try
            {
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);

                        //Poner el Foco en el objeto que tuvoel problema en validar
                        if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                        {
                            Funciones.Poner_Foco_Objeto(g_frm_P_MantenimientoAgrupacionesLineas, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    #region SINCRONIZACION
                    INTERNO_Sincronizacion_ActualizarRegistro_Modelo mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo = new INTERNO_Sincronizacion_ActualizarRegistro_Modelo();
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.tabla = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_TABLA_LINEA();
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.idClavePrimaria = mdl_ValorDevuelto_Modelo_Resultado.Id;

                    Sincronizacion_ActualizarRegistro.Sincronizacion_ActualizarRegistro_RESTOTABLAS(mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo);
                    #endregion

                    // Devolver al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_MantenimientoAgrupacionesLineas.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);

                    g_frm_P_MantenimientoAgrupacionesLineas.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    //Vaciar los datos para que se pueda meter otro linea
                    if (g_bol_GrabarDatos_VaciarDatos)
                    {
                        VaciarDatos();
                    }
                    
                    //Poner el Foco Inicial
                    Funciones.Poner_Foco_Objeto(g_frm_P_MantenimientoAgrupacionesLineas, g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Codigo);
                    //Se pone para que no pregunte si se modifico algo
                    g_frm_P_MantenimientoAgrupacionesLineas.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_Completed));
            }
        }

        public INTERNO_ValorDevuelto_Modelo ValidarDatos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Si el codigo esta vacio y se intenta buscar el ultimo numerico y llego al limite de base de datos
                if (g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Codigo.Text.Trim().Length == 0)
                {
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = Buscar_CodigoSiguiente();

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo.Mensaje;
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Codigo;
                    }
                }

                // El codigo no puede estar Repetido
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    string str_Codigo = g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Codigo.Text.Trim();
                    if (g_bol_CampoCodigo_Numerico)
                    {
                        int int_Codigo = int.Parse(str_Codigo);
                        str_Codigo = int_Codigo.ToString();
                    }

                    if (Datos_Generales.Buscar_CodigoRepetido(g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_TABLA_LINEA(), g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CAMPO_CODIGO_LINEA(), str_Codigo, g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CAMPO_ID_LINEA(), (g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo != null ? g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.id : -1), g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CAMPO_IDEMPRESA_LINEA(), g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.lng_idEmpresa, g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.TIENE_FECHABORRADO_LINEA()))
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_REPETIDO(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_Label_Codigo.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Codigo;
                    }
                }

                // La Descripcion no puede estar vacía
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Descripcion.Text.Trim().Length == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_Label_Descripcion.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Descripcion;
                }

                //Si la Cabecera tiene marcado sin repeticiones, validar que el registro no esta en otra linea
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    if (g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.sinRepeticiones != null && g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.sinRepeticiones.Value)
                    {
                        if (g_lst_RegistrosSeleccionados_Listado != null && g_lst_RegistrosSeleccionados_Listado.Count > 0)
                        {
                            //Cargamos el ensamblado
                            Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
                            //Obtenemos el tipo de la clase
                            Type m_type = m_assembly.GetType("" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CLASE_DATOSAGRUPACIONESLINEAS());
                            //creamos la instancia
                            var obj_Clase = Activator.CreateInstance(m_type);
                            //Cargamos el metodo solicitado
                            MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_PROCEDIMIENTO_EXISTENREPETIDOS(), BindingFlags.Instance | BindingFlags.NonPublic);

                            //Obtener valores
                            object[] arr_Parametros = {g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_LINEA(),
                                                        (g_frm_P_MantenimientoAgrupacionesLineas.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados!=null  ? g_frm_P_MantenimientoAgrupacionesLineas.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Select(m => m.ID).ToList() :  null),
                                                        (g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo != null ? g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.id : -1),
                                                         g_lst_RegistrosSeleccionados_Listado };

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

                            if (lst_Registros_Existen_Ya == null || lst_Registros_Existen_Ya.Count > 0)
                            {
                                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;

                                string str_Mensaje = "";
                                if (lst_Registros_Existen_Ya.Count>10)
                                {
                                    str_Mensaje = Mensajes.G_STR_AGRUPACIONESLINEA_HAYMUCHOSREGISTROSREPETIDOS;
                                }
                                else
                                {
                                    foreach (INTERNO_IDCodigoDescripcion_Modelo mdl_INTERNO_IDCodigoDescripcion_Modelo in lst_Registros_Existen_Ya)
                                    {
                                        str_Mensaje += ("(" + mdl_INTERNO_IDCodigoDescripcion_Modelo.Codigo + ") " + mdl_INTERNO_IDCodigoDescripcion_Modelo.Descripcion + ", ");
                                    }

                                    str_Mensaje=  Mensajes.G_STR_AGRUPACIONESLINEA_HAYREGISTROSREPETIDOSENOTRASLINEAS(str_Mensaje.Substring(0, str_Mensaje.Length-2));
                                }
                                mdl_ValorDevuelto_Modelo.Mensaje = str_Mensaje;
                            }
                        }
                    }
                }
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(ValidarDatos));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }

        private INTERNO_ValorDevuelto_Modelo GrabarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            long lng_id = -1;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    INTERNO_MantenimientoAgrupacionesLinea_Modelo mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo = new INTERNO_MantenimientoAgrupacionesLinea_Modelo();
                    mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.id = g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo != null ? g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.id : -1;

                    //Asignar el idEmpresa...........................................................................................
                    if ((g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo != null ? g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.idEmpresa : -1) != -1)
                    {
                        mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.idEmpresa = g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.idEmpresa;
                    }
                    else
                    {
                        //Buscar el idEmpresa que Corresponda
                        mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.idEmpresa = Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.lng_idEmpresa, g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_TABLA_LINEA());
                    }

                    //codigo
                    mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.codigo = g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Codigo.Text.Trim();

                    //descripcion
                    mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.descripcion = g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Descripcion.Text.Trim();

                    //orden
                    if (g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.MOSTRAR_CAMPO_ORDEN())
                    {
                        if (g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Orden.Text.Trim().Length > 0)
                        {
                            mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.orden = int.Parse(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Orden.Text.Trim());
                        }
                    }

                    //idAgrupacionCabecera
                    mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.idAgrupacionCabecera = g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.id;

                    //Listado de Agrupados
                    mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Listado_Agrupados = g_lst_RegistrosSeleccionados_Listado;
                    if (mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Listado_Agrupados==null)
                    {
                        mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Listado_Agrupados = new List<long>();
                    }


                    //Colores
                    if (g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.MOSTRAR_SELECCION_COLORES())
                    {
                        //colorFondo
                        mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.colorFondo = Funciones.Convertir_Color_Hexadecimal(g_frm_P_MantenimientoAgrupacionesLineas.Label_Ejemplo.BackColor);

                        //colorLetra
                        mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.colorLetra = Funciones.Convertir_Color_Hexadecimal(g_frm_P_MantenimientoAgrupacionesLineas.Label_Ejemplo.ForeColor);

                    }
                    else
                    {
                        mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.colorFondo = null;
                        mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.colorLetra = null;
                    }


                    // Se graba el modelo ya relleno -----------------------------------------------------------------------------------
                    //Cargamos el ensamblado
                    Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
                    //Obtenemos el tipo de la clase
                    Type m_type = m_assembly.GetType("" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + 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_GRABAR_REGISTRO, BindingFlags.Instance | BindingFlags.NonPublic);

                    //Obtener valores
                    object[] arr_Parametros = { g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_LINEA(), mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo };
                    
                    //Pasamos los parametros al metodo y lo ejecutamos
                    mdl_INTERNO_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

                    // Grabamos las Agrupaciones del cliente
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Id Almacenado de la Linea
                        lng_id=  mdl_INTERNO_ValorDevuelto_Modelo.Id;

                        #region Imagen
                        //Imagen
                        if (g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.MOSTRAR_SELECCION_IMAGEN())
                        {
                            //Grabar la imagen solo en caso de que haya imagen
                            if (g_img_Imagen != null)
                            {
                                INTERNO_MantenimientoAgrupacionesLineaFoto_Modelo mdl_INTERNO_MantenimientoAgrupacionesLineaFoto_Modelo = new INTERNO_MantenimientoAgrupacionesLineaFoto_Modelo();
                                mdl_INTERNO_MantenimientoAgrupacionesLineaFoto_Modelo.id = (g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo != null && g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Imagen_Modelo!=null) ? g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Imagen_Modelo.id : -1;
                                mdl_INTERNO_MantenimientoAgrupacionesLineaFoto_Modelo.idPadre = lng_id;
                                mdl_INTERNO_MantenimientoAgrupacionesLineaFoto_Modelo.imagen = Funciones.Convertir_Image_Arraybytes(g_img_Imagen);

                                // Se graba el modelo ya relleno -----------------------------------------------------------------------------------
                                //Cargamos el ensamblado
                                Assembly m_assembly_Foto = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
                                //Obtenemos el tipo de la clase
                                Type m_type_Foto = m_assembly_Foto.GetType("" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                                //creamos la instancia
                                var obj_Clase_Foto = Activator.CreateInstance(m_type_Foto);
                                //Cargamos el metodo solicitado
                                MethodInfo obj_MethodInfo_Foto = obj_Clase_Foto.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_GRABAR_REGISTRO, BindingFlags.Instance | BindingFlags.NonPublic);

                                //Obtener valores
                                object[] arr_Parametros_Foto = { g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_LINEAFOTO(), mdl_INTERNO_MantenimientoAgrupacionesLineaFoto_Modelo };

                                //Pasamos los parametros al metodo y lo ejecutamos
                                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Fotos = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo_Foto.Invoke(obj_Clase_Foto, arr_Parametros_Foto);
                                if (mdl_ValorDevuelto_Modelo_Fotos.TodoCorrecto == false)
                                {
                                    transaccion_SQL.Dispose();
                                    return mdl_ValorDevuelto_Modelo_Fotos;
                                }

                            }
                            //Sino hubiera imagen seleccionada, y anteriormente tuviera imagen, hay que borrar el registro
                            else if (g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo != null &&
                                     g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Imagen_Modelo!=null)
                            {
                                //Cargamos el ensamblado
                                Assembly m_assembly_Foto = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
                                //Obtenemos el tipo de la clase
                                Type m_type_Foto = m_assembly_Foto.GetType("" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                                //creamos la instancia
                                var obj_Clase_Foto = Activator.CreateInstance(m_type_Foto);
                                //Cargamos el metodo solicitado
                                MethodInfo obj_MethodInfo_Foto = obj_Clase_Foto.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_BORRAR_REGISTRO, BindingFlags.Instance | BindingFlags.NonPublic);

                                //Obtener valores
                                object[] arr_Parametros_Foto = { g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_LINEAFOTO(), g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Imagen_Modelo.id };

                                //Pasamos los parametros al metodo y lo ejecutamos
                                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Fotos = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo_Foto.Invoke(obj_Clase_Foto, arr_Parametros_Foto);
                                if (mdl_ValorDevuelto_Modelo_Fotos.TodoCorrecto == false)
                                {
                                    transaccion_SQL.Dispose();
                                    return mdl_ValorDevuelto_Modelo_Fotos;
                                }
                            }
                        }
                        #endregion

                        #region Impresoras
                        if (g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.MOSTRAR_LINEA_IMPRESORA())
                        {
                            //Cargamos el ensamblado
                            Assembly m_assembly_Impresora = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
                            //Obtenemos el tipo de la clase
                            Type m_type_Impresora = m_assembly_Impresora.GetType("" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CLASE_DATOSAGRUPACIONESLINEAS());
                            //creamos la instancia
                            var obj_Clase_Impresora = Activator.CreateInstance(m_type_Impresora);
                            //Cargamos el metodo solicitado
                            MethodInfo obj_MethodInfo_Impresora = obj_Clase_Impresora.GetType().GetMethod(g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_PROCEDIMIENTO_LINEAS_IMPRESORA_GRABAR(), BindingFlags.Instance | BindingFlags.NonPublic);

                            //Obtener valores
                            object[] arr_Parametros_Impresora = { lng_id, g_lst_Impresoras_RegistrosSeleccionados_Listado };

                            //Pasamos los parametros al metodo y lo ejecutamos
                            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Impresoras = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo_Impresora.Invoke(obj_Clase_Impresora, arr_Parametros_Impresora);
                           
                            if (mdl_ValorDevuelto_Modelo_Impresoras.TodoCorrecto == false)
                            {
                                transaccion_SQL.Dispose();
                                return mdl_ValorDevuelto_Modelo_Impresoras;
                            }
                        }
                        #endregion

                        //Termino Transaccion
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Obtener el modelo que se acaba de grabar
                        mdl_INTERNO_ValorDevuelto_Modelo.Id = lng_id;


                        //Cargamos el ensamblado
                        Assembly m_assembly_2 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
                        //Obtenemos el tipo de la clase
                        Type m_type_2 = m_assembly_2.GetType("" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                        //creamos la instancia
                        var obj_Clase_2 = Activator.CreateInstance(m_type_2);
                        //Cargamos el metodo solicitado
                        MethodInfo obj_MethodInfo_2 = obj_Clase_2.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_OBTENER_REGISTRO, BindingFlags.Instance | BindingFlags.NonPublic);

                        //Obtener valores
                        object[] arr_Parametros_2 = {
                                                        g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_LINEA(),
                                                        lng_id,
                                                        g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.lng_idEmpresa,
                                                        ((g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales!=null && g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.EjercicioActivo!=null ) ? g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.EjercicioActivo.id : -1)
                                                    };
                        //Pasamos los parametros al metodo y lo ejecutamos
                        g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo = (INTERNO_MantenimientoAgrupacionesLinea_Modelo)obj_MethodInfo_2.Invoke(obj_Clase, arr_Parametros_2);


                        if (g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo!=null &&
                            g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Imagen_Modelo != null &&
                            g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Imagen_Modelo.imagen != null)
                        {
                            g_arr_Imagen = g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Imagen_Modelo.imagen;
                            g_img_Imagen = Funciones.Convertir_Arraybytes_Image(g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.Imagen_Modelo.imagen);
                        }

                        g_frm_P_MantenimientoAgrupacionesLineas.P_Base_id = g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.id;

                        //Si tienes Permisos para Borrar
                        g_frm_P_MantenimientoAgrupacionesLineas.Exferia_Button_Borrar.Enabled = true;
                    }
                }
                catch (Control_Errores)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(GrabarDatos_Final));
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        #endregion

        #region Borrar Datos
        public void BorrarDatos(bool _bol_VolverAlListado)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_bol_BorrarDatos_VolverListado = _bol_VolverAlListado;
                    g_frm_P_MantenimientoAgrupacionesLineas.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    g_obj_TareaAsincrona_BorrarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_Completed);
                    g_obj_TareaAsincrona_BorrarDatos.RunWorkerAsync();

                    g_frm_PE_Esperando.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }

                g_frm_P_MantenimientoAgrupacionesLineas.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(BorrarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }

        private void TareaAsincrona_BorrarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                // Borrar 
                mdl_ValorDevuelto_Modelo = BorrarDatos_Final();
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_BorrarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }
            g_frm_P_MantenimientoAgrupacionesLineas.Enabled = true;

            try
            {
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }
                }
                else
                {
                    #region SINCRONIZACION
                    INTERNO_Sincronizacion_ActualizarRegistro_Modelo mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo = new INTERNO_Sincronizacion_ActualizarRegistro_Modelo();
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.tabla = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_TABLA_LINEA();
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.idClavePrimaria = mdl_ValorDevuelto_Modelo_Resultado.Id;

                    Sincronizacion_ActualizarRegistro.Sincronizacion_ActualizarRegistro_RESTOTABLAS(mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo);
                    #endregion

                    // Devolver al Listado el Row Borrar
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_MantenimientoAgrupacionesLineas.g_mdl_PRV_OpcionesDetalle.opcion);

                    List<long> lst_id = new List<long>();
                    lst_id.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                    lst_obj.Add(lst_id);

                    g_frm_P_MantenimientoAgrupacionesLineas.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_MantenimientoAgrupacionesLineas.P_Base_SeModificoDatosPantalla = false;
                    g_frm_P_MantenimientoAgrupacionesLineas.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType("" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + 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_REGISTRO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_LINEA(), (g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo != null ? g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.id : -1) };

                //Pasamos los parametros al metodo y lo ejecutamos
                mdl_INTERNO_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);              
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(BorrarDatos_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Obtener Listado Completo de base de datos
        public void Obtener_ListadoCompleto_BaseDatos(bool _bol_ObtencionListadoBaseDatos_RellenarDataGridView)
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando();
                g_frm_PE_Esperando.TopMost = true;
                g_frm_PE_Esperando.Show();

                //Si se estaba ejecutando lo paro
                while (g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos.IsBusy)
                    Application.DoEvents();

                //Se guarda para saber si tengo que rellenar otra vez el datagridview o no
                g_bol_Obtencion_ListadoCompleto_BaseDatos_RellenarDataGridView = _bol_ObtencionListadoBaseDatos_RellenarDataGridView;

                g_bol_Obtencion_ListadoCompleto_BaseDatos_Termino = false;

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_Obtener_ListadoCompleto_BaseDatos.RunWorkerAsync();
            }
            catch (Exception)
            {
                g_bol_Obtencion_ListadoCompleto_BaseDatos_Termino = true;

                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }

        }
        protected void TareaAsincrona_Obtener_ListadoCompleto_BaseDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            List<dynamic> lst_ValorDevuelto = null;

            try
            {
                Obtener_Agrupaciones_BaseDatos();

                Obtener_Impresoras_BaseDatos();

            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
            finally
            {
                e.Result = lst_ValorDevuelto;
            }
        }
        protected void TareaAsincrona_Obtener_ListadoCompleto_BaseDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }

                g_bol_Obtencion_ListadoCompleto_BaseDatos_Termino = true;

                if (e.Cancelled == false)
                {

                    if (g_bol_Obtencion_ListadoCompleto_BaseDatos_RellenarDataGridView)
                    {
                        Rellenar_DataGridView_IncluirRegistros(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_IncluirRegistros_Busqueda.Text);
                        Rellenar_DataGridView_RegistrosSeleccionados(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_RegistrosSeleccionados_Busqueda.Text);
                    }

                }
            }
            catch (Exception)
            { }
        }

        private void Obtener_Agrupaciones_BaseDatos()
        {
            //Cargamos el ensamblado
            Assembly obj_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
            //Obtenemos el tipo de la clase
            Type obj_type = obj_assembly.GetType(g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + Variables.G_STR_LIBRERIA_OPCIONES);
            //creamos la instancia
            var obj_clase = Activator.CreateInstance(obj_type);
            //Cargamos el metodo solicitado
            MethodInfo m = obj_clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_OBTENER_LISTADO, BindingFlags.Instance | BindingFlags.NonPublic);

            object[] arr_parametros = {
                    g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS().DATOS_OPCION().opcion,
                    g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.lng_idEmpresa,
                    ((g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales !=null && g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.EjercicioActivo!=null )? g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.EjercicioActivo.id : -1),
                    g_lst_ColumnasAMostrar_ListadoIncluirRegistros ,
                    null,
                    null };

            //Pasamos los parametros al metodo y lo ejecutamos
            g_lst_ListadoRegistros = (List<dynamic>)m.Invoke(obj_clase, arr_parametros);
        }

        private void Obtener_Impresoras_BaseDatos()
        {
            //Cargamos el ensamblado 
            Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.IMPRESORA_NOMBRE_LIBRERIA() + ".dll");
            //Obtenemos el tipo de la clase
            Type m_type_1 = m_assembly_1.GetType("" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.IMPRESORA_NOMBRE_LIBRERIA() + "." + Variables.G_STR_LIBRERIA_OPCIONES);
            //creamos la instancia
            var obj_Clase_1 = Activator.CreateInstance(m_type_1);
            //Cargamos el metodo solicitado
            MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_OBTENER_LISTADO, BindingFlags.Instance | BindingFlags.NonPublic);

            //Obtener valores
            object[] arr_parametros = {
                                        g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.IMPRESORA_NOMBRE_OPCION(),
                                        g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.lng_idEmpresa,
                                        ((g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales !=null && g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.EjercicioActivo!=null )? g_frm_P_MantenimientoAgrupacionesLineas.P_Base_ValoresGenerales.EjercicioActivo.id : -1),
                                        g_lst_ColumnasAMostrar_Impresoras_IncluirRegistros ,
                                        null,
                                        null };

            //Pasamos los parametros al metodo y lo ejecutamos
            g_lst_Impresoras_ListadoRegistros = (List<dynamic>)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_parametros);
        }
        #endregion

        #region Agrupaciones

        #region Listado Incluir Registros

        #region Rellenar DataGridView Incluir Registros

        public void Rellenar_DataGridView_IncluirRegistros(string _str_filtro)
        {
            try
            {
                g_bol_CancelarTareaAsincrona_IncluirRegistros = true;

                while (g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros.IsBusy)
                    Application.DoEvents();

                g_bol_CancelarTareaAsincrona_IncluirRegistros = false;

                //Vaciar el Listado
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_DataGridView_IncluirRegistros_Listado.Rows.Clear();
                g_int_TotalRegistrosInsertados_ListadoIncluirRegistros = 0;
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Total = 0;
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Actualizar = 0;

                //parametros para Filtrar
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_str_filtro);
                lst_Argumentos.Add((INTERNO_ComboBox_Modelo)g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_IncluirRegistros_Filtros.SelectedItem);
                lst_Argumentos.Add(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_CheckBox_IncluirRegistros_MayusculasMinusculas.Checked);
                lst_Argumentos.Add(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_CheckBox_IncluirRegistros_PalabraCompleta.Checked);

                //Orden Actual
                if (g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_IncluirRegistros_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_IncluirRegistros_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                {
                    lst_Argumentos.Add(((INTERNO_ComboBox_Modelo)g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_IncluirRegistros_OrdenListado.SelectedItem).Identificador);
                }
                else
                {
                    lst_Argumentos.Add(g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS().ORDENACION_NOMBRECOLUMNA_PORDEFECTO());
                }

                //Lllamra a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros.RunWorkerAsync(lst_Argumentos);
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(Rellenar_DataGridView_IncluirRegistros));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(Rellenar_DataGridView_IncluirRegistros));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Datos Recibidos ..................................................
                List<object> lst_Argumentos = (List<object>)e.Argument;
                string str_Busqueda = (string)lst_Argumentos[0];
                INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado = (INTERNO_ComboBox_Modelo)lst_Argumentos[1];
                bool bol_SensibilidadMayusMin = (bool)lst_Argumentos[2];
                bool bol_PalabraCompleta = (bool)lst_Argumentos[3];

                //Orden Actual
                string str_Ordenacion_PorDefecto = (string)lst_Argumentos[4];

                //Listado de la tabla
                g_lst_ListadoRegistros_Filtrados_IncluirRegistros = null;

                //Filtrar #############################################
                if (str_Busqueda.Trim().Length > 0 || g_dct_ListadoFiltros_ListadoIncluirRegistros.Count > 0)
                {
                    g_lst_ListadoRegistros_Filtrados_IncluirRegistros = g_lst_ListadoRegistros;

                    //Hay algo Escrito en busqueda -------------------------------------------------------------------------------------------------------------------
                    if (mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado != null && str_Busqueda.Trim().Length > 0)
                    {
                        //Todos
                        if (mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador.Equals("-1"))
                        {
                            List<dynamic> lst_TodosFiltrado = new List<dynamic>();
                            foreach (INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_Filtros in g_lst_INTERNO_ComboBox_Modelo_Filtros_ListadoIncluirRegistros)
                            {
                                //Palabra Completa
                                if (bol_PalabraCompleta)
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null)) == str_Busqueda).ToList());
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null)).ToUpper() == str_Busqueda.ToUpper()).ToList());
                                    }
                                }
                                //Por Contenido
                                else
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null)).Contains(str_Busqueda)).ToList());
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null)).ToUpper().Contains(str_Busqueda.ToUpper())).ToList());
                                    }
                                }
                            }
                            //Añadir al Listado Final
                            g_lst_ListadoRegistros_Filtrados_IncluirRegistros = lst_TodosFiltrado.Distinct().ToList();
                        }
                        //Campo seleccionado
                        else
                        {
                            //Palabra Completa
                            if (bol_PalabraCompleta)
                            {
                                //Sencible a mayusculas y minusculas
                                if (bol_SensibilidadMayusMin)
                                {
                                    g_lst_ListadoRegistros_Filtrados_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null)) == str_Busqueda).ToList();
                                }
                                //No tiene en cuenta las mayusculas y las minusculas
                                else
                                {
                                    g_lst_ListadoRegistros_Filtrados_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null)).ToUpper() == str_Busqueda.ToUpper()).ToList();
                                }
                            }
                            //Por Contenido
                            else
                            {
                                //Sencible a mayusculas y minusculas
                                if (bol_SensibilidadMayusMin)
                                {
                                    g_lst_ListadoRegistros_Filtrados_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null)).Contains(str_Busqueda)).ToList();
                                }
                                //No tiene en cuenta las mayusculas y las minusculas
                                else
                                {
                                    g_lst_ListadoRegistros_Filtrados_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null)).ToUpper().Contains(str_Busqueda.ToUpper())).ToList();
                                }
                            }
                        }
                    }

                    //Filtros Avanzados
                    if (g_dct_ListadoFiltros_ListadoIncluirRegistros != null && g_dct_ListadoFiltros_ListadoIncluirRegistros.Count > 0)
                    {
                        g_lst_ListadoRegistros_Filtrados_IncluirRegistros = Funciones_Listado.Filtrar_Listado(g_lst_ListadoRegistros_Filtrados_IncluirRegistros, g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS(), g_dct_ListadoFiltros_ListadoIncluirRegistros);
                    }
                }
                else
                {
                    g_lst_ListadoRegistros_Filtrados_IncluirRegistros = g_lst_ListadoRegistros;
                }
                //#####################################################

                if (g_lst_ListadoRegistros_Filtrados_IncluirRegistros != null)
                {
                    //Ordenar el Listado ##################
                    if (str_Ordenacion_PorDefecto.Trim().Length > 0)
                    {
                        //Descendente
                        if (g_frm_P_MantenimientoAgrupacionesLineas.Exferia_Button_IncluirRegistros_OrdenListado.Tag.ToString().Equals("1"))
                        {
                            g_lst_ListadoRegistros_Filtrados_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_IncluirRegistros.OrderByDescending(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                        }
                        //Ascendente
                        else
                        {
                            g_lst_ListadoRegistros_Filtrados_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_IncluirRegistros.OrderBy(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                        }
                    }
                    //#####################################


                    //Quitar los registros que ya esten en otras lineas, si tuviera marcado Sin Repeticiones
                    if (g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.sinRepeticiones!=null && 
                        g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.sinRepeticiones.Value)
                    {
                        //El listado de Filttrados tiene que tener datos
                        if (g_frm_P_MantenimientoAgrupacionesLineas.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados!=null &&
                            g_frm_P_MantenimientoAgrupacionesLineas.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count>0)
                        {
                            //Cargamos el ensamblado
                            Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
                            //Obtenemos el tipo de la clase
                            Type m_type = m_assembly.GetType("" + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CLASE_DATOSAGRUPACIONESLINEAS());
                            //creamos la instancia
                            var obj_Clase = Activator.CreateInstance(m_type);
                            //Cargamos el metodo solicitado
                            MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_PROCEDIMIENTO_REGISTROSREPETIDOS(), BindingFlags.Instance | BindingFlags.NonPublic);

                            //Obtener valores
                            object[] arr_Parametros = {g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_LINEA(),
                                                       (g_frm_P_MantenimientoAgrupacionesLineas.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados!=null  ? g_frm_P_MantenimientoAgrupacionesLineas.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Select(m => m.ID).ToList() :  null),
                                                       (g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo != null ? g_mdl_INTERNO_MantenimientoAgrupacionesLinea_Modelo.id : -1)
                                                        };

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

                            if (lst_Registros_Existen_Ya == null || lst_Registros_Existen_Ya.Count > 0)
                            {
                                //Buscar el Campo Clave
                                string str_NombreCampoClave = "id";
                                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS().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;
                                }

                                g_lst_ListadoRegistros_Filtrados_IncluirRegistros=g_lst_ListadoRegistros_Filtrados_IncluirRegistros.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && !lst_Registros_Existen_Ya.Contains(m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null))).ToList();
                            }
                        }
                    }

                    //Ordenar Listado
                    g_frm_P_MantenimientoAgrupacionesLineas.Listado_IncluirRegistros_Ordenar_DataGridView();

                    //Barra de Progreso
                    g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Total = g_lst_ListadoRegistros_Filtrados_IncluirRegistros.Count;

                    object[] row;
                    foreach (dynamic obj_Dinamico in g_lst_ListadoRegistros_Filtrados_IncluirRegistros)
                    {
                        //Se Cancelo la tarea asincrona ---------------------------
                        if (g_bol_CancelarTareaAsincrona_IncluirRegistros)
                        {
                            return;
                        }

                        //Añadir Fila con Columnas .............................
                        row = Funciones_Listado.Transformar_Dynamic_A_Row(obj_Dinamico, g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS());

                        //Llamar al Progress
                        g_int_TotalRegistrosInsertados_ListadoIncluirRegistros += 1;

                        ((BackgroundWorker)sender).ReportProgress(1, row);

                        //Application.DoEvents();
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                g_bol_CancelarTareaAsincrona_IncluirRegistros = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_CancelarTareaAsincrona_IncluirRegistros = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_CancelarTareaAsincrona_IncluirRegistros = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_DataGridView_IncluirRegistros_Listado.Rows.Add((object[])e.UserState);

                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ListadoIncluirRegistros;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ListadoIncluirRegistros_Completed(object sender, RunWorkerCompletedEventArgs e)
        {}

        #endregion

        #region Marcar/Desmarcar
        public void MarcarDesmarcar(bool _bol_Marcar,List<long> _lst_Seleccionados)
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(_bol_Marcar ? Mensajes.G_STR_ESPERANDO_SELECCIONANDO_REGISTROS() : Mensajes.G_STR_ESPERANDO_DESSELECCIONANDO_REGISTROS());
                g_frm_PE_Esperando.TopMost = true;
                g_frm_PE_Esperando.Show();

                //Cancelar Tarea Asincrona
                g_bol_CancelarTareaAsincrona_MarcarDesmarcar = true;

                //Si se estaba ejecutando lo paro
                while (g_obj_TareaAsincrona_MarcarDesmarcar.IsBusy)
                    Application.DoEvents();

                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_bol_Marcar);
                lst_Argumentos.Add(_lst_Seleccionados);

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_MarcarDesmarcar.RunWorkerAsync(lst_Argumentos);
            }
            catch (Exception)
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }

        }
        protected void TareaAsincrona_MarcarDesmarcar_DoWork(object sender, DoWorkEventArgs e)
        {
            bool bol_TerminoCorrectamente = true;

            try
            {
                List<object> lst_Argumentos = (List<object>)e.Argument;
                bool bol_Seleccionar = (bool)lst_Argumentos[0];
                List<long> lst_Seleccionados = (List<long>)lst_Argumentos[1];

                //Buscar el Campo Clave
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo =g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS().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;
                }

                //Listado a Marcar/Desmarcar
                List<long> lst_Listado_Auxiliar = new List<long>();

                //Marcar/Desmarcar Seleccionados
                if (lst_Seleccionados!=null && lst_Seleccionados.Count>0)
                {
                    lst_Listado_Auxiliar = g_lst_ListadoRegistros_Filtrados_IncluirRegistros.Where(m=> m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && lst_Seleccionados.Contains(m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null))).Select(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m)).Cast<long>().ToList();
                }
                //Marcar/Desmarcar Todos
                else
                {
                    lst_Listado_Auxiliar= g_lst_ListadoRegistros_Filtrados_IncluirRegistros.Select(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m)).Cast<long>().ToList();
                }
                
                Actualizar_ListadoBaseDatos_Seleccionados_Colectivo(lst_Listado_Auxiliar, bol_Seleccionar);
            }
            catch (ThreadAbortException)
            {
                bol_TerminoCorrectamente = false;
            }
            catch (Exception)
            {
                bol_TerminoCorrectamente = false;
            }
            finally
            {
                e.Result= bol_TerminoCorrectamente;
            }
        }
        protected void TareaAsincrona_MarcarDesmarcar_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }

            g_bol_CancelarTareaAsincrona_MarcarDesmarcar = false;

            if ((bool)e.Result)
            {
                Rellenar_DataGridView_IncluirRegistros(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_IncluirRegistros_Busqueda.Text);
                Rellenar_DataGridView_RegistrosSeleccionados(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_RegistrosSeleccionados_Busqueda.Text);
            }

        }
        #endregion

        #endregion
        #region Listado Registros Seleccionados

        #region Rellenar DataGridView Registros Seleccionados

        public void Rellenar_DataGridView_RegistrosSeleccionados(string _str_filtro)
        {
            try
            {
                g_bol_CancelarTareaAsincrona_RegistrosSeleccionados = true;

                while (g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados.IsBusy)
                    Application.DoEvents();

                g_bol_CancelarTareaAsincrona_RegistrosSeleccionados = false;

                //Vaciar el Listado
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_DataGridView_RegistrosSeleccionados_Listado.Rows.Clear();
                g_int_TotalRegistrosInsertados_ListadoRegistrosSeleccionados = 0;
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_RegistrosSeleccionados_BarraProgresoo.Exferia_BarraProgreso_Total = 0;
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_RegistrosSeleccionados_BarraProgresoo.Exferia_BarraProgreso_Actualizar = 0;

                //parametros para Filtrar
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_str_filtro);
                lst_Argumentos.Add((INTERNO_ComboBox_Modelo)g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_RegistrosSeleccionados_Filtros.SelectedItem);
                lst_Argumentos.Add(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_CheckBox_RegistrosSeleccionados_MayusculasMinusculas.Checked);
                lst_Argumentos.Add(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_CheckBox_RegistrosSeleccionados_PalabraCompleta.Checked);

                //Orden Actual
                if (g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_RegistrosSeleccionados_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_RegistrosSeleccionados_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                {
                    lst_Argumentos.Add(((INTERNO_ComboBox_Modelo)g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_RegistrosSeleccionados_OrdenListado.SelectedItem).Identificador);
                }
                else
                {
                    lst_Argumentos.Add(g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_REGISTROSSELECCIONADOS().ORDENACION_NOMBRECOLUMNA_PORDEFECTO());
                }

                //Lllamra a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados.RunWorkerAsync(lst_Argumentos);
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(Rellenar_DataGridView_RegistrosSeleccionados));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(Rellenar_DataGridView_RegistrosSeleccionados));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_REGISTROSSELECCIONADOS().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;
                }

                //Datos Recibidos ..................................................
                List<object> lst_Argumentos = (List<object>)e.Argument;
                string str_Busqueda = (string)lst_Argumentos[0];
                INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado = (INTERNO_ComboBox_Modelo)lst_Argumentos[1];
                bool bol_SensibilidadMayusMin = (bool)lst_Argumentos[2];
                bool bol_PalabraCompleta = (bool)lst_Argumentos[3];

                //Orden Actual
                string str_Ordenacion_PorDefecto = (string)lst_Argumentos[4];

                //Listado de la tabla
                List<dynamic> lst_ListadoRegistros_RegistrosSeleccionados = null;
                if (g_lst_ListadoRegistros!=null && g_lst_RegistrosSeleccionados_Listado!=null && g_lst_RegistrosSeleccionados_Listado.Count>0)
                {
                    //Busco registro listado en memoria
                    lst_ListadoRegistros_RegistrosSeleccionados = g_lst_ListadoRegistros.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && g_lst_RegistrosSeleccionados_Listado.Contains(m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null))).ToList();
                }

                List<dynamic> lst_ListadoRegistros_Filtrados = null;

                //Filtrar #############################################
                if (lst_ListadoRegistros_RegistrosSeleccionados != null)
                {
                    if (str_Busqueda.Trim().Length > 0 || g_dct_ListadoFiltros_ListadoRegistrosSeleccionados.Count > 0)
                    {
                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_RegistrosSeleccionados;

                        //Hay algo Escrito en busqueda -------------------------------------------------------------------------------------------------------------------
                        if (mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado != null && str_Busqueda.Trim().Length > 0)
                        {
                            //Todos
                            if (mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador.Equals("-1"))
                            {
                                List<dynamic> lst_TodosFiltrado = new List<dynamic>();
                                foreach (INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_Filtros in g_lst_INTERNO_ComboBox_Modelo_Filtros_ListadoRegistrosSeleccionados)
                                {
                                    //Palabra Completa
                                    if (bol_PalabraCompleta)
                                    {
                                        //Sencible a mayusculas y minusculas
                                        if (bol_SensibilidadMayusMin)
                                        {
                                            lst_TodosFiltrado.AddRange(lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) == str_Busqueda).ToList());
                                        }
                                        //No tiene en cuenta las mayusculas y las minusculas
                                        else
                                        {
                                            lst_TodosFiltrado.AddRange(lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToUpper() == str_Busqueda.ToUpper()).ToList());
                                        }
                                    }
                                    //Por Contenido
                                    else
                                    {
                                        //Sencible a mayusculas y minusculas
                                        if (bol_SensibilidadMayusMin)
                                        {
                                            lst_TodosFiltrado.AddRange(lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).Contains(str_Busqueda)).ToList());
                                        }
                                        //No tiene en cuenta las mayusculas y las minusculas
                                        else
                                        {
                                            lst_TodosFiltrado.AddRange(lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToUpper().Contains(str_Busqueda.ToUpper())).ToList());
                                        }
                                    }
                                }
                                //Añadir al Listado Final
                                lst_ListadoRegistros_Filtrados = lst_TodosFiltrado.Distinct().ToList();
                            }
                            //Campo seleccionado
                            else
                            {
                                //Palabra Completa
                                if (bol_PalabraCompleta)
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) == str_Busqueda).ToList();
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToUpper() == str_Busqueda.ToUpper()).ToList();
                                    }
                                }
                                //Por Contenido
                                else
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).Contains(str_Busqueda)).ToList();
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToUpper().Contains(str_Busqueda.ToUpper())).ToList();
                                    }
                                }
                            }
                        }

                        //Filtros Avanzados
                        if (g_dct_ListadoFiltros_ListadoRegistrosSeleccionados != null && g_dct_ListadoFiltros_ListadoRegistrosSeleccionados.Count > 0)
                        {
                            lst_ListadoRegistros_Filtrados = Funciones_Listado.Filtrar_Listado(lst_ListadoRegistros_Filtrados, g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_REGISTROSSELECCIONADOS(), g_dct_ListadoFiltros_ListadoRegistrosSeleccionados);
                        }
                    }
                    else
                    {
                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_RegistrosSeleccionados;
                    }
                    //#####################################################

                    if (lst_ListadoRegistros_Filtrados != null)
                    {
                        //Ordenar el Listado ##################
                        if (str_Ordenacion_PorDefecto.Trim().Length > 0)
                        {
                            //Descendente
                            if (g_frm_P_MantenimientoAgrupacionesLineas.Exferia_Button_RegistrosSeleccionados_OrdenListado.Tag.ToString().Equals("1"))
                            {
                                lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.OrderByDescending(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                            }
                            //Ascendente
                            else
                            {
                                lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.OrderBy(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                            }
                        }
                        //#####################################

                        g_frm_P_MantenimientoAgrupacionesLineas.Listado_RegistrosSeleccionados_Ordenar_DataGridView();

                        //Guadar el listado .......................................................................................
                        g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_RegistrosSeleccionados_BarraProgresoo.Exferia_BarraProgreso_Total = lst_ListadoRegistros_Filtrados.Count;

                        object[] row;
                        foreach (dynamic obj_Dinamico in lst_ListadoRegistros_Filtrados)
                        {
                            //Se Cancelo la tarea asincrona ---------------------------
                            if (g_bol_CancelarTareaAsincrona_RegistrosSeleccionados)
                            {
                                return;
                            }

                            //Añadir Fila con Columnas .............................
                            row = Funciones_Listado.Transformar_Dynamic_A_Row(obj_Dinamico, g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_REGISTROSSELECCIONADOS());

                            //Llamar al Progress
                            g_int_TotalRegistrosInsertados_ListadoRegistrosSeleccionados += 1;

                            ((BackgroundWorker)sender).ReportProgress(1, row);

                            //Application.DoEvents();
                            Thread.Sleep(1);
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                g_bol_CancelarTareaAsincrona_RegistrosSeleccionados = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_CancelarTareaAsincrona_RegistrosSeleccionados = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_CancelarTareaAsincrona_RegistrosSeleccionados = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_DataGridView_RegistrosSeleccionados_Listado.Rows.Add((object[])e.UserState);

                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_RegistrosSeleccionados_BarraProgresoo.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_ListadoRegistrosSeleccionados;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_ListadoRegistrosSeleccionados_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }

        #endregion

        #region Vaciar Registros Seleccionados
        public void Vaciar_RegistrosSeleccionados(List<long> _lst_ids_ABorrar)
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_DESSELECCIONANDO_REGISTROS());
                g_frm_PE_Esperando.TopMost = true;
                g_frm_PE_Esperando.Show();

                //Cancelar Tarea Asincrona
                g_bol_CancelarTareaAsincrona_VaciarRegistrosSeleccionados = true;

                //Si se estaba ejecutando lo paro
                while (g_obj_TareaAsincrona_VaciarRegistrosSeleccionados.IsBusy)
                    Application.DoEvents();


                g_lst_RegistrosSeleccionados_AVaciar = _lst_ids_ABorrar;

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_VaciarRegistrosSeleccionados.RunWorkerAsync();
            }
            catch (Exception)
            {
                g_bol_CancelarTareaAsincrona_VaciarRegistrosSeleccionados = false;

                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }

        }
        protected void TareaAsincrona_VaciarRegistrosSeleccionados_DoWork(object sender, DoWorkEventArgs e)
        {
            bool bol_TerminoCorrectamente = true;

            try
            {
                Actualizar_ListadoBaseDatos_Seleccionados_Colectivo(g_lst_RegistrosSeleccionados_AVaciar, false);
            }
            catch (ThreadAbortException)
            {
                bol_TerminoCorrectamente = false;
            }
            catch (Exception)
            {
                bol_TerminoCorrectamente = false;
            }
            finally
            {
                e.Result = bol_TerminoCorrectamente;
            }
        }
        protected void TareaAsincrona_VaciarRegistrosSeleccionados_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            g_bol_CancelarTareaAsincrona_VaciarRegistrosSeleccionados = false;

            try
            {
                if ((bool)e.Result)
                {
                    string str_NombreCampoClave = "id";
                    INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_REGISTROSSELECCIONADOS().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;
                    }

                    //Borrar los datos del DataGridView
                     g_frm_P_MantenimientoAgrupacionesLineas.Exferia_DataGridView_RegistrosSeleccionados_Listado.Rows
                             .Cast<DataGridViewRow>()
                             .ToList()
                             .Where(r => g_lst_RegistrosSeleccionados_AVaciar.Contains(long.Parse(r.Cells[str_NombreCampoClave].Value.ToString()))).ToList().ForEach(m => g_frm_P_MantenimientoAgrupacionesLineas.Exferia_DataGridView_RegistrosSeleccionados_Listado.Rows.Remove(m));

                    //Rellenar de Nuevo el Listado de Registros a Incluir
                    Rellenar_DataGridView_IncluirRegistros(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_IncluirRegistros_Busqueda.Text);
                }
            }
            catch (Exception)
            { }
            finally
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }
        }
        #endregion

        #endregion

        public void Actualizar_ListadoBaseDatos_Seleccionados_Individual(long _lng_id, bool _bol_Valor)
        {
            try
            {
                //Buscar el Campo Clave
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS().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;
                }

                //Busco registro listado en memoria
                dynamic dnm_Registro = g_lst_ListadoRegistros[g_lst_ListadoRegistros.IndexOf(g_lst_ListadoRegistros.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) == _lng_id).FirstOrDefault())];

                if (dnm_Registro != null)
                {
                    //Actualizar registro dinamico
                    dnm_Registro.GetType().GetProperty(g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CAMPO_SELECCIONAR_LINEA()).SetValue(dnm_Registro, _bol_Valor, null);


                    //Modificar listado en memoria
                    g_lst_ListadoRegistros[g_lst_ListadoRegistros.IndexOf(g_lst_ListadoRegistros.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) == _lng_id).FirstOrDefault())] = dnm_Registro;
                }


                if (_bol_Valor)
                {
                    if (!g_lst_RegistrosSeleccionados_Listado.Contains(_lng_id))
                    {
                        g_lst_RegistrosSeleccionados_Listado.Add(_lng_id);
                    }
                }
                else
                {
                    if (g_lst_RegistrosSeleccionados_Listado.Contains(_lng_id))
                    {
                        g_lst_RegistrosSeleccionados_Listado.Remove(_lng_id);
                    }
                }

                Rellenar_DataGridView_RegistrosSeleccionados(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_RegistrosSeleccionados_Busqueda.Text);
            }
            catch (Exception)
            { }
        }
        public void Actualizar_ListadoBaseDatos_Seleccionados_Colectivo(List<long> _lst_id, bool _bol_Valor)
        {
            try
            {
                //Buscar el Campo Clave
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS().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;
                }

                //Actualizar el listado de registro general
                g_lst_ListadoRegistros.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && _lst_id.Contains(m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null))).ToList().ForEach(x=> x.GetType().GetProperty(g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CAMPO_SELECCIONAR_LINEA()).SetValue(x, _bol_Valor, null));

                //Actualizar el Listado de Seleccionados
                if (_bol_Valor)
                {
                    List<long> lst_RegistrosNuevos=_lst_id.Where(m => !g_lst_RegistrosSeleccionados_Listado.Contains(m)).ToList();

                    if (lst_RegistrosNuevos != null && lst_RegistrosNuevos.Count > 0)
                    {
                        g_lst_RegistrosSeleccionados_Listado.AddRange(lst_RegistrosNuevos);
                    }
                }
                else
                {
                    g_lst_RegistrosSeleccionados_Listado.RemoveAll(m=> _lst_id.Contains(m));
                }
            }
            catch (Exception)
            { }
        }

        #endregion

        #region Impresoras

        #region Impresoras Incluir Registros Lineas

        #region Rellenar DataGridView Impresoras Incluir Registros Lineas

        public void Rellenar_DataGridView_Impresoras_IncluirRegistros(string _str_filtro)
        {
            try
            {
                g_bol_CancelarTareaAsincrona_Impresoras_IncluirRegistros = true;

                while (g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros.IsBusy)
                    Application.DoEvents();

                g_bol_CancelarTareaAsincrona_Impresoras_IncluirRegistros = false;

                //Vaciar el Listado
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_DataGridView_Impresoras_IncluirRegistros_Listado.Rows.Clear();
                g_int_TotalRegistrosInsertados_Impresoras_IncluirRegistros = 0;
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_Impresoras_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Total = 0;
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_Impresoras_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Actualizar = 0;

                //parametros para Filtrar
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_str_filtro);
                lst_Argumentos.Add((INTERNO_ComboBox_Modelo)g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_Impresoras_IncluirRegistros_Filtros.SelectedItem);
                lst_Argumentos.Add(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_CheckBox_Impresoras_IncluirRegistros_MayusculasMinusculas.Checked);
                lst_Argumentos.Add(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_CheckBox_Impresoras_IncluirRegistros_PalabraCompleta.Checked);

                //Orden Actual
                if (g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_Impresoras_IncluirRegistros_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_Impresoras_IncluirRegistros_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                {
                    lst_Argumentos.Add(((INTERNO_ComboBox_Modelo)g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_Impresoras_IncluirRegistros_OrdenListado.SelectedItem).Identificador);
                }
                else
                {
                    lst_Argumentos.Add(g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS_IMPRESORA().ORDENACION_NOMBRECOLUMNA_PORDEFECTO());
                }

                //Lllamra a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros.RunWorkerAsync(lst_Argumentos);
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(Rellenar_DataGridView_Impresoras_IncluirRegistros));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(Rellenar_DataGridView_Impresoras_IncluirRegistros));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Datos Recibidos ..................................................
                List<object> lst_Argumentos = (List<object>)e.Argument;
                string str_Busqueda = (string)lst_Argumentos[0];
                INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado = (INTERNO_ComboBox_Modelo)lst_Argumentos[1];
                bool bol_SensibilidadMayusMin = (bool)lst_Argumentos[2];
                bool bol_PalabraCompleta = (bool)lst_Argumentos[3];

                //Orden Actual
                string str_Ordenacion_PorDefecto = (string)lst_Argumentos[4];

                //Listado de la tabla
                g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros = null;

                //Filtrar #############################################
                if (str_Busqueda.Trim().Length > 0 || g_dct_ListadoFiltros_Impresoras_IncluirRegistros.Count > 0)
                {
                    g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros = g_lst_Impresoras_ListadoRegistros;

                    //Hay algo Escrito en busqueda -------------------------------------------------------------------------------------------------------------------
                    if (mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado != null && str_Busqueda.Trim().Length > 0)
                    {
                        //Todos
                        if (mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador.Equals("-1"))
                        {
                            List<dynamic> lst_TodosFiltrado = new List<dynamic>();
                            foreach (INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_Filtros in g_lst_INTERNO_ComboBox_Modelo_Filtros_Impresoras_IncluirRegistros)
                            {
                                //Palabra Completa
                                if (bol_PalabraCompleta)
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null)) == str_Busqueda).ToList());
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null)).ToUpper() == str_Busqueda.ToUpper()).ToList());
                                    }
                                }
                                //Por Contenido
                                else
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null)).Contains(str_Busqueda)).ToList());
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null)).ToUpper().Contains(str_Busqueda.ToUpper())).ToList());
                                    }
                                }
                            }
                            //Añadir al Listado Final
                            g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros = lst_TodosFiltrado.Distinct().ToList();
                        }
                        //Campo seleccionado
                        else
                        {
                            //Palabra Completa
                            if (bol_PalabraCompleta)
                            {
                                //Sencible a mayusculas y minusculas
                                if (bol_SensibilidadMayusMin)
                                {
                                    g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null)) == str_Busqueda).ToList();
                                }
                                //No tiene en cuenta las mayusculas y las minusculas
                                else
                                {
                                    g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null)).ToUpper() == str_Busqueda.ToUpper()).ToList();
                                }
                            }
                            //Por Contenido
                            else
                            {
                                //Sencible a mayusculas y minusculas
                                if (bol_SensibilidadMayusMin)
                                {
                                    g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null)).Contains(str_Busqueda)).ToList();
                                }
                                //No tiene en cuenta las mayusculas y las minusculas
                                else
                                {
                                    g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null)).ToUpper().Contains(str_Busqueda.ToUpper())).ToList();
                                }
                            }
                        }
                    }

                    //Filtros Avanzados
                    if (g_dct_ListadoFiltros_Impresoras_IncluirRegistros != null && g_dct_ListadoFiltros_Impresoras_IncluirRegistros.Count > 0)
                    {
                        g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros = Funciones_Listado.Filtrar_Listado(g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros, g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS_IMPRESORA(), g_dct_ListadoFiltros_Impresoras_IncluirRegistros);
                    }
                }
                else
                {
                    g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros = g_lst_Impresoras_ListadoRegistros;
                }
                //#####################################################

                if (g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros != null &&
                    g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.Count > 0)
                {
                    //Si sigue habiendo algun registro
                    if (g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros != null &&
                        g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.Count > 0)
                    {
                        //Ordenar el Listado ##################
                        if (str_Ordenacion_PorDefecto.Trim().Length > 0)
                        {
                            //Descendente
                            if (g_frm_P_MantenimientoAgrupacionesLineas.Exferia_Button_Impresoras_IncluirRegistros_OrdenListado.Tag.ToString().Equals("1"))
                            {
                                g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.OrderByDescending(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                            }
                            //Ascendente
                            else
                            {
                                g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.OrderBy(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                            }
                        }
                        //#####################################

                        g_frm_P_MantenimientoAgrupacionesLineas.Listado_Impresoras_IncluirRegistros_Ordenar_DataGridView();

                        //Guadar el listado .......................................................................................
                        //Buscar el Campo Clave
                        string str_NombreCampoClave = "id";
                        INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS_IMPRESORA().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;
                        }
                        //...........................................................................................................

                        g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_Impresoras_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Total = g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.Count;

                        object[] row;
                        foreach (dynamic obj_Dinamico in g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros)
                        {
                            //Se Cancelo la tarea asincrona ---------------------------
                            if (g_bol_CancelarTareaAsincrona_Impresoras_IncluirRegistros)
                            {
                                return;
                            }

                            //Añadir Fila con Columnas .............................
                            row = Funciones_Listado.Transformar_Dynamic_A_Row(obj_Dinamico, g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS_IMPRESORA());

                            //Llamar al Progress
                            g_int_TotalRegistrosInsertados_Impresoras_IncluirRegistros += 1;

                            ((BackgroundWorker)sender).ReportProgress(1, row);

                            //Application.DoEvents();
                            Thread.Sleep(1);
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                g_bol_CancelarTareaAsincrona_Impresoras_IncluirRegistros = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_CancelarTareaAsincrona_Impresoras_IncluirRegistros = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_CancelarTareaAsincrona_Impresoras_IncluirRegistros = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_DataGridView_Impresoras_IncluirRegistros_Listado.Rows.Add((object[])e.UserState);

                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_Impresoras_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Impresoras_IncluirRegistros;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Impresoras_IncluirRegistros_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }

        #endregion

        #region Marcar/Desmarcar
        public void Impresoras_MarcarDesmarcar_IncluirRegistros(bool _bol_Marcar, List<long> _lst_Seleccionados)
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(_bol_Marcar ? Mensajes.G_STR_ESPERANDO_SELECCIONANDO_REGISTROS() : Mensajes.G_STR_ESPERANDO_DESSELECCIONANDO_REGISTROS());
                g_frm_PE_Esperando.TopMost = true;
                g_frm_PE_Esperando.Show();

                //Cancelar Tarea Asincrona
                g_bol_CancelarTareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros = true;

                //Si se estaba ejecutando lo paro
                while (g_obj_TareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros.IsBusy)
                    Application.DoEvents();

                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_bol_Marcar);
                lst_Argumentos.Add(_lst_Seleccionados);

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros.RunWorkerAsync(lst_Argumentos);
            }
            catch (Exception)
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }

        }
        protected void TareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros_DoWork(object sender, DoWorkEventArgs e)
        {
            bool bol_TerminoCorrectamente = true;

            try
            {
                List<object> lst_Argumentos = (List<object>)e.Argument;
                bool bol_Seleccionar = (bool)lst_Argumentos[0];
                List<long> lst_Seleccionados = (List<long>)lst_Argumentos[1];


                //Buscar el Campo Clave
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS_IMPRESORA().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;
                }

                //Listado a Marcar/Desmarcar
                List<long> lst_Listado_Auxiliar = new List<long>();

                //Marcar/Desmarcar Seleccionados
                if (lst_Seleccionados != null && lst_Seleccionados.Count > 0)
                {
                    lst_Listado_Auxiliar = g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && lst_Seleccionados.Contains(m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null))).Select(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m)).Cast<long>().ToList();
                }
                //Marcar/Desmarcar Todos
                else
                {
                    lst_Listado_Auxiliar = g_lst_ListadoRegistros_Filtrados_Impresoras_IncluirRegistros.Select(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m)).Cast<long>().ToList();
                }

                Actualizar_Impresoras_BaseDatos_Seleccionados_Colectivo(lst_Listado_Auxiliar, bol_Seleccionar);
            }
            catch (ThreadAbortException)
            {
                bol_TerminoCorrectamente = false;
            }
            catch (Exception)
            {
                bol_TerminoCorrectamente = false;
            }
            finally
            {
                e.Result = bol_TerminoCorrectamente;
            }
        }
        protected void TareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }

            g_bol_CancelarTareaAsincrona_Impresoras_MarcarDesmarcar_IncluirRegistros = false;

            if ((bool)e.Result)
            {
                Rellenar_DataGridView_Impresoras_IncluirRegistros(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Impresoras_IncluirRegistros_Busqueda.Text);
                Rellenar_DataGridView_Impresoras_RegistrosSeleccionados(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Impresoras_RegistrosSeleccionados_Busqueda.Text);
            }

        }
        #endregion

        #endregion
        #region Impresoras Registros Seleccionados

        #region Rellenar DataGridView Impresoras Registros Seleccionados

        public void Rellenar_DataGridView_Impresoras_RegistrosSeleccionados(string _str_filtro)
        {
            try
            {
                g_bol_CancelarTareaAsincrona_Impresoras_RegistrosSeleccionados = true;

                while (g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados.IsBusy)
                    Application.DoEvents();

                g_bol_CancelarTareaAsincrona_Impresoras_RegistrosSeleccionados = false;

                //Vaciar el Listado
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_DataGridView_Impresoras_RegistrosSeleccionados_Listado.Rows.Clear();
                g_int_TotalRegistrosInsertados_Impresoras_RegistrosSeleccionados = 0;
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_Impresoras_RegistrosSeleccionados_BarraProgreso.Exferia_BarraProgreso_Total = 0;
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_Impresoras_RegistrosSeleccionados_BarraProgreso.Exferia_BarraProgreso_Actualizar = 0;

                //parametros para Filtrar
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_str_filtro);
                lst_Argumentos.Add((INTERNO_ComboBox_Modelo)g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_Impresoras_RegistrosSeleccionados_Filtros.SelectedItem);
                lst_Argumentos.Add(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_CheckBox_Impresoras_RegistrosSeleccionados_MayusculasMinusculas.Checked);
                lst_Argumentos.Add(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_CheckBox_Impresoras_RegistrosSeleccionados_PalabraCompleta.Checked);

                //Orden Actual
                if (g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_Impresoras_RegistrosSeleccionados_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_Impresoras_RegistrosSeleccionados_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                {
                    lst_Argumentos.Add(((INTERNO_ComboBox_Modelo)g_frm_P_MantenimientoAgrupacionesLineas.Exferia_ComboBox_Impresoras_RegistrosSeleccionados_OrdenListado.SelectedItem).Identificador);
                }
                else
                {
                    lst_Argumentos.Add(g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_REGISTROSSELECCIONADOS_IMPRESORA().ORDENACION_NOMBRECOLUMNA_PORDEFECTO());
                }

                //Lllamra a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados.RunWorkerAsync(lst_Argumentos);
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(Rellenar_DataGridView_Impresoras_RegistrosSeleccionados));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(Rellenar_DataGridView_Impresoras_RegistrosSeleccionados));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_REGISTROSSELECCIONADOS_IMPRESORA().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;
                }

                //Datos Recibidos ..................................................
                List<object> lst_Argumentos = (List<object>)e.Argument;
                string str_Busqueda = (string)lst_Argumentos[0];
                INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado = (INTERNO_ComboBox_Modelo)lst_Argumentos[1];
                bool bol_SensibilidadMayusMin = (bool)lst_Argumentos[2];
                bool bol_PalabraCompleta = (bool)lst_Argumentos[3];

                //Orden Actual
                string str_Ordenacion_PorDefecto = (string)lst_Argumentos[4];

                //Listado de la tabla
                List<dynamic> lst_ListadoRegistros_RegistrosSeleccionados = null;
                if (g_lst_Impresoras_ListadoRegistros != null &&
                    g_lst_Impresoras_RegistrosSeleccionados_Listado != null &&
                    g_lst_Impresoras_RegistrosSeleccionados_Listado.Count > 0)
                {
                    //Busco registro listado en memoria
                    lst_ListadoRegistros_RegistrosSeleccionados = g_lst_Impresoras_ListadoRegistros.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && g_lst_Impresoras_RegistrosSeleccionados_Listado.Contains(m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null))).ToList();
                }

                List<dynamic> lst_ListadoRegistros_Filtrados = null;

                //Filtrar #############################################
                if (lst_ListadoRegistros_RegistrosSeleccionados != null)
                {
                    if (str_Busqueda.Trim().Length > 0 || g_dct_ListadoFiltros_Impresoras_RegistrosSeleccionados.Count > 0)
                    {
                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_RegistrosSeleccionados;

                        //Hay algo Escrito en busqueda -------------------------------------------------------------------------------------------------------------------
                        if (mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado != null && str_Busqueda.Trim().Length > 0)
                        {
                            //Todos
                            if (mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador.Equals("-1"))
                            {
                                List<dynamic> lst_TodosFiltrado = new List<dynamic>();
                                foreach (INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_Filtros in g_lst_INTERNO_ComboBox_Modelo_Filtros_Impresoras_RegistrosSeleccionados)
                                {
                                    //Palabra Completa
                                    if (bol_PalabraCompleta)
                                    {
                                        //Sencible a mayusculas y minusculas
                                        if (bol_SensibilidadMayusMin)
                                        {
                                            lst_TodosFiltrado.AddRange(lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null)) == str_Busqueda).ToList());
                                        }
                                        //No tiene en cuenta las mayusculas y las minusculas
                                        else
                                        {
                                            lst_TodosFiltrado.AddRange(lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null)).ToUpper() == str_Busqueda.ToUpper()).ToList());
                                        }
                                    }
                                    //Por Contenido
                                    else
                                    {
                                        //Sencible a mayusculas y minusculas
                                        if (bol_SensibilidadMayusMin)
                                        {
                                            lst_TodosFiltrado.AddRange(lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null)).Contains(str_Busqueda)).ToList());
                                        }
                                        //No tiene en cuenta las mayusculas y las minusculas
                                        else
                                        {
                                            lst_TodosFiltrado.AddRange(lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null)).ToUpper().Contains(str_Busqueda.ToUpper())).ToList());
                                        }
                                    }
                                }
                                //Añadir al Listado Final
                                lst_ListadoRegistros_Filtrados = lst_TodosFiltrado.Distinct().ToList();
                            }
                            //Campo seleccionado
                            else
                            {
                                //Palabra Completa
                                if (bol_PalabraCompleta)
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null)) == str_Busqueda).ToList();
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null)).ToUpper() == str_Busqueda.ToUpper()).ToList();
                                    }
                                }
                                //Por Contenido
                                else
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null)).Contains(str_Busqueda)).ToList();
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && Funciones.Convertir_A_String(m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null)).ToUpper().Contains(str_Busqueda.ToUpper())).ToList();
                                    }
                                }
                            }
                        }

                        //Filtros Avanzados
                        if (g_dct_ListadoFiltros_Impresoras_RegistrosSeleccionados != null && g_dct_ListadoFiltros_Impresoras_RegistrosSeleccionados.Count > 0)
                        {
                            lst_ListadoRegistros_Filtrados = Funciones_Listado.Filtrar_Listado(lst_ListadoRegistros_Filtrados, g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_REGISTROSSELECCIONADOS_IMPRESORA(), g_dct_ListadoFiltros_Impresoras_RegistrosSeleccionados);
                        }
                    }
                    else
                    {
                        lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_RegistrosSeleccionados;
                    }
                    //#####################################################

                    if (lst_ListadoRegistros_Filtrados != null)
                    {
                        //Ordenar el Listado ##################
                        if (str_Ordenacion_PorDefecto.Trim().Length > 0)
                        {
                            //Descendente
                            if (g_frm_P_MantenimientoAgrupacionesLineas.Exferia_Button_Impresoras_RegistrosSeleccionados_OrdenListado.Tag.ToString().Equals("1"))
                            {
                                lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.OrderByDescending(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                            }
                            //Ascendente
                            else
                            {
                                lst_ListadoRegistros_Filtrados = lst_ListadoRegistros_Filtrados.OrderBy(m => m.GetType().GetProperty(str_Ordenacion_PorDefecto).GetValue(m, null)).ToList();
                            }
                        }
                        //#####################################

                        g_frm_P_MantenimientoAgrupacionesLineas.Listado_Impresoras_RegistrosSeleccionados_Ordenar_DataGridView();

                        //Guadar el listado .......................................................................................
                        g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_Impresoras_RegistrosSeleccionados_BarraProgreso.Exferia_BarraProgreso_Total = lst_ListadoRegistros_Filtrados.Count;

                        object[] row;
                        foreach (dynamic obj_Dinamico in lst_ListadoRegistros_Filtrados)
                        {
                            //Se Cancelo la tarea asincrona ---------------------------
                            if (g_bol_CancelarTareaAsincrona_Impresoras_RegistrosSeleccionados)
                            {
                                return;
                            }

                            //Añadir Fila con Columnas .............................
                            row = Funciones_Listado.Transformar_Dynamic_A_Row(obj_Dinamico, g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_REGISTROSSELECCIONADOS_IMPRESORA());

                            //Llamar al Progress
                            g_int_TotalRegistrosInsertados_Impresoras_RegistrosSeleccionados += 1;

                            ((BackgroundWorker)sender).ReportProgress(1, row);

                            //Application.DoEvents();
                            Thread.Sleep(1);
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                g_bol_CancelarTareaAsincrona_Impresoras_RegistrosSeleccionados = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_CancelarTareaAsincrona_Impresoras_RegistrosSeleccionados = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_CancelarTareaAsincrona_Impresoras_RegistrosSeleccionados = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesLineas_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_DataGridView_Impresoras_RegistrosSeleccionados_Listado.Rows.Add((object[])e.UserState);

                g_frm_P_MantenimientoAgrupacionesLineas.Exferia_BarraProgreso_Impresoras_RegistrosSeleccionados_BarraProgreso.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Impresoras_RegistrosSeleccionados;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Impresoras_RegistrosSeleccionados_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }

        #endregion

        #region Vaciar Registros Seleccionados
        public void Vaciar_Impresoras_RegistrosSeleccionados(List<long> _lst_ids_ABorrar)
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_DESSELECCIONANDO_REGISTROS());
                g_frm_PE_Esperando.TopMost = true;
                g_frm_PE_Esperando.Show();

                //Cancelar Tarea Asincrona
                g_bol_CancelarTareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados = true;

                //Si se estaba ejecutando lo paro
                while (g_obj_TareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados.IsBusy)
                    Application.DoEvents();


                g_lst_Impresoras_RegistrosSeleccionados_AVaciar = _lst_ids_ABorrar;

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados.RunWorkerAsync();
            }
            catch (Exception)
            {
                g_bol_CancelarTareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados = false;

                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }

        }
        protected void TareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados_DoWork(object sender, DoWorkEventArgs e)
        {
            bool bol_TerminoCorrectamente = true;

            try
            {
                Actualizar_Impresoras_BaseDatos_Seleccionados_Colectivo(g_lst_Impresoras_RegistrosSeleccionados_AVaciar, false);
            }
            catch (ThreadAbortException)
            {
                bol_TerminoCorrectamente = false;
            }
            catch (Exception)
            {
                bol_TerminoCorrectamente = false;
            }
            finally
            {
                e.Result = bol_TerminoCorrectamente;
            }
        }
        protected void TareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            g_bol_CancelarTareaAsincrona_Vaciar_Impresoras_RegistrosSeleccionados = false;

            try
            {
                if ((bool)e.Result)
                {
                    string str_NombreCampoClave = "id";
                    INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_REGISTROSSELECCIONADOS_IMPRESORA().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;
                    }

                    //Borrar los datos del DataGridView
                    g_frm_P_MantenimientoAgrupacionesLineas.Exferia_DataGridView_Impresoras_RegistrosSeleccionados_Listado.Rows
                            .Cast<DataGridViewRow>()
                            .ToList()
                            .Where(r => g_lst_Impresoras_RegistrosSeleccionados_AVaciar.Contains(long.Parse(r.Cells[str_NombreCampoClave].Value.ToString()))).ToList().ForEach(m => g_frm_P_MantenimientoAgrupacionesLineas.Exferia_DataGridView_Impresoras_RegistrosSeleccionados_Listado.Rows.Remove(m));

                    //Rellenar de Nuevo el Listado de Registros a Incluir
                    Rellenar_DataGridView_Impresoras_IncluirRegistros(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Impresoras_IncluirRegistros_Busqueda.Text);
                }
            }
            catch (Exception)
            { }
            finally
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }
        }
        #endregion

        #endregion

        public void Actualizar_Impresoras_BaseDatos_Seleccionados_Individual(long _lng_id, bool _bol_Valor)
        {
            try
            {
                //Buscar el Campo Clave
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS_IMPRESORA().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;
                }

                //Campo Seleccionar
                string str_NombreCampoSeleccionar = "Seleccionar";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Seleccionar = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS_IMPRESORA().LISTADO_COLUMNAS().Values.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.SELECCIONAR)).FirstOrDefault();
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Seleccionar != null)
                {
                    str_NombreCampoSeleccionar = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Seleccionar.Descripcion_Interna;
                }

                //Busco registro listado en memoria
                dynamic dnm_Registro = g_lst_Impresoras_ListadoRegistros[g_lst_Impresoras_ListadoRegistros.IndexOf(g_lst_Impresoras_ListadoRegistros.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) == _lng_id).FirstOrDefault())];

                if (dnm_Registro != null)
                {
                    //Actualizar registro dinamico
                    dnm_Registro.GetType().GetProperty(str_NombreCampoSeleccionar).SetValue(dnm_Registro, _bol_Valor, null);


                    //Modificar listado en memoria
                    g_lst_Impresoras_ListadoRegistros[g_lst_Impresoras_ListadoRegistros.IndexOf(g_lst_Impresoras_ListadoRegistros.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) == _lng_id).FirstOrDefault())] = dnm_Registro;
                }


                if (_bol_Valor)
                {
                    if (!g_lst_Impresoras_RegistrosSeleccionados_Listado.Contains(_lng_id))
                    {
                        g_lst_Impresoras_RegistrosSeleccionados_Listado.Add(_lng_id);
                    }
                }
                else
                {
                    if (g_lst_Impresoras_RegistrosSeleccionados_Listado.Contains(_lng_id))
                    {
                        g_lst_Impresoras_RegistrosSeleccionados_Listado.Remove(_lng_id);
                    }
                }

                Rellenar_DataGridView_Impresoras_RegistrosSeleccionados(g_frm_P_MantenimientoAgrupacionesLineas.Exferia_TextBox_Impresoras_RegistrosSeleccionados_Busqueda.Text);
            }
            catch (Exception)
            { }
        }
        public void Actualizar_Impresoras_BaseDatos_Seleccionados_Colectivo(List<long> _lst_id, bool _bol_Valor)
        {
            try
            {
                if (g_lst_Impresoras_ListadoRegistros != null)
                {
                    //Buscar el Campo Clave
                    string str_NombreCampoClave = "id";
                    INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo =g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS_IMPRESORA().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;
                    }

                    //Campo Seleccionar
                    string str_NombreCampoSeleccionar = "Seleccionar";
                    INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Seleccionar = g_frm_P_MantenimientoAgrupacionesLineas.g_obj_ABS_MantenimientoAgrupacionesCabecera.ABS_LISTADO_INCLUIRREGISTROS_IMPRESORA().LISTADO_COLUMNAS().Values.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.SELECCIONAR)).FirstOrDefault();
                    if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Seleccionar != null)
                    {
                        str_NombreCampoSeleccionar = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Seleccionar.Descripcion_Interna;
                    }

                    //Actualizar el listado de registro general
                    g_lst_Impresoras_ListadoRegistros.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && _lst_id.Contains(m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null))).ToList().ForEach(x => x.GetType().GetProperty(str_NombreCampoSeleccionar).SetValue(x, _bol_Valor, null));

                    //Actualizar el Listado de Seleccionados
                    if (_bol_Valor)
                    {
                        List<long> lst_RegistrosNuevos = _lst_id.Where(m => !g_lst_Impresoras_RegistrosSeleccionados_Listado.Contains(m)).ToList();

                        if (lst_RegistrosNuevos != null && lst_RegistrosNuevos.Count > 0)
                        {
                            foreach (long lng_idImpresora in lst_RegistrosNuevos)
                            {
                                if (!g_lst_Impresoras_RegistrosSeleccionados_Listado.Contains(lng_idImpresora))
                                {
                                    g_lst_Impresoras_RegistrosSeleccionados_Listado.Add(lng_idImpresora);
                                }
                            }
                        }
                    }
                    else
                    {
                        List<long> lst_ids_ABorrar = _lst_id.GetRange(0, _lst_id.Count);

                        foreach (long lng_idImpresora in lst_ids_ABorrar)
                        {
                            g_lst_Impresoras_RegistrosSeleccionados_Listado.Remove(lng_idImpresora);
                        }
                    }
                }
            }
            catch (Exception)
            { }
        }

        #endregion

        public void CambiarColores(Color _clr_Fondo, Color _clr_Letra)
        {
            g_frm_P_MantenimientoAgrupacionesLineas.Button_ColorFondo.BackColor = _clr_Fondo;
            g_frm_P_MantenimientoAgrupacionesLineas.Button_ColorLetra.BackColor = _clr_Letra;

            g_frm_P_MantenimientoAgrupacionesLineas.Label_Ejemplo.BackColor = _clr_Fondo;
            g_frm_P_MantenimientoAgrupacionesLineas.Label_Ejemplo.ForeColor = _clr_Letra;
        }
    }
}
