using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Sincronizacion;
using Exferia_Aplicacion.Visualizacion;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_HotelPuntoVenta._0_Modelos;
using Exferia_HotelPuntoVenta._1_Datos;
using Exferia_HotelPuntoVenta._3_Vistas.Listados;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;

namespace Exferia_HotelPuntoVenta._3_Vistas.Controladoras
{
    public class P_Terminal_Controladora
    {
        #region Variables Generales
        private P_Terminal g_frm_P_Terminal; //Variable que enlaza con la pantalla
        private PE_Esperando g_frm_PE_Esperando;//Pantalla de espera, para cuando se ejecuten tareas pesadas como cargar,guardar,etc

        //Clases de Negocio necesarias
        private HPV_Terminales_Datos g_obj_HPV_Terminales_Datos = new HPV_Terminales_Datos();
        private HPV_Terminales_Salas_Datos obj_HPV_Terminales_Salas_Datos = new HPV_Terminales_Salas_Datos();
        private HPV_Terminales_AgrupacionesTerminales_Datos obj_HPV_Terminales_AgrupacionesTerminales_Datos = new HPV_Terminales_AgrupacionesTerminales_Datos();
        private HPV_Salas_Datos g_obj_HPV_Salas_Datos = new HPV_Salas_Datos();
        private HPV_AgrupacionesTerminales_Datos g_obj_HPV_AgrupacionesTerminales_Datos = new HPV_AgrupacionesTerminales_Datos();

        //Modelos necesarios
        public INTERNO_HPV_Terminales_Modelo g_mdl_INTERNO_HPV_Terminales_Modelo = null;

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

        //Tareea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;
        public bool g_bol_CargarDatos_Termino = true;

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

        //Tareea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos;

        public bool g_bol_CampoCodigo_Numerico = false;

        #region Salas
        public Dictionary<long, bool> g_dct_Salas_RegistrosSeleccionados_Listado = new Dictionary<long, bool>();

        public List<long> g_lst_Salas_RegistrosSeleccionados_Listado = new List<long>();
        public List<dynamic> g_lst_Salas_ListadoRegistros = null;

        //Actualizar los valores de Salas desde base de datos ############################
        private BackgroundWorker g_obj_TareaAsincrona_Actualizar_Salas_Desde_BaseDatos;

        #region Salas Registros Seleccionados
        //Tarea Asincrona para la Rellenar DataGridView de Salas Registros Seleccionados
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados;
        public bool g_bol_CancelarTareaAsincrona_Salas_RegistrosSeleccionados = false;

        //Tarea Asincrona de Vaciar Registros Seleccionados
        private BackgroundWorker g_obj_TareaAsincrona_Vaciar_Salas_RegistrosSeleccionados;
        public bool g_bol_CancelarTareaAsincrona_Vaciar_Salas_RegistrosSeleccionados = false;
        private List<long> g_lst_Salas_RegistrosSeleccionados_AVaciar = null;

        //Tareea Asincrona de AsignarPorDefecto
        private BackgroundWorker g_obj_TareaAsincrona_Salas_AsignarPorDefecto_RegistrosSeleccionados;
        public bool g_bol_CancelarTareaAsincrona_Salas_AsignarPorDefecto_RegistrosSeleccionados = false;

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

        //Filtrado del Listado de Incluir Registros
        public List<string> g_lst_ColumnasAMostrar_Salas_RegistrosSeleccionados = new List<string>();
        public List<string> g_lst_Columnas_Salas_RegistrosSeleccionados = new List<string>();
        public ABS_Listado_HPV_Salas_P_Terminal g_obj_ABS_Listado_HPV_Salas_P_Terminal = new ABS_Listado_HPV_Salas_P_Terminal();
        public Dictionary<string, object> g_dct_ListadoFiltros_Salas_RegistrosSeleccionados = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_Salas_RegistrosSeleccionados = 0;
        public List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_Filtros_Salas_RegistrosSeleccionados = new List<INTERNO_ComboBox_Modelo>();

        //long de la Salas que esta actualmente PorDefecto
        public long g_lng_Salas_PorDefecto = -1;
        #endregion

        #region Salas Incluir Registros
        //Tareea Asincrona de Marcar/Desmarcar 
        private BackgroundWorker g_obj_TareaAsincrona_Salas_MarcarDesmarcar_IncluirRegistros;
        public bool g_bol_CancelarTareaAsincrona_Salas_MarcarDesmarcar_IncluirRegistros = false;

        private List<dynamic> g_lst_ListadoRegistros_Filtrados_Salas_IncluirRegistros = null;

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

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

        //Filtrado del Listado de Incluir Registros
        public List<string> g_lst_ColumnasAMostrar_Salas_IncluirRegistros = new List<string>();
        public List<string> g_lst_Columnas_Salas_IncluirRegistros = new List<string>();
        public ABS_Listado_HPV_Salas_P_Terminal_IncluirRegistros g_obj_ABS_Listado_HPV_Salas_P_Terminal_IncluirRegistros = new ABS_Listado_HPV_Salas_P_Terminal_IncluirRegistros();
        public Dictionary<string, object> g_dct_ListadoFiltros_Salas_IncluirRegistros = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_Salas_IncluirRegistros = 0;
        public List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_Filtros_Salas_IncluirRegistros = new List<INTERNO_ComboBox_Modelo>();
        #endregion

        #endregion

        #region AgrupacionesTerminales
        public Dictionary<long, bool> g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado = new Dictionary<long, bool>();

        public List<long> g_lst_AgrupacionesTerminales_RegistrosSeleccionados_Listado = new List<long>();
        public List<dynamic> g_lst_AgrupacionesTerminales_ListadoRegistros = null;

        //Actualizar los valores de AgrupacionesTerminales desde base de datos ############################
        private BackgroundWorker g_obj_TareaAsincrona_Actualizar_AgrupacionesTerminales_Desde_BaseDatos;

        #region AgrupacionesTerminales Registros Seleccionados
        //Tarea Asincrona para la Rellenar DataGridView de AgrupacionesTerminales Registros Seleccionados
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados;
        public bool g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_RegistrosSeleccionados = false;

        //Tarea Asincrona de Vaciar Registros Seleccionados
        private BackgroundWorker g_obj_TareaAsincrona_Vaciar_AgrupacionesTerminales_RegistrosSeleccionados;
        public bool g_bol_CancelarTareaAsincrona_Vaciar_AgrupacionesTerminales_RegistrosSeleccionados = false;
        private List<long> g_lst_AgrupacionesTerminales_RegistrosSeleccionados_AVaciar = null;

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

        //Filtrado del Listado de Incluir Registros
        public List<string> g_lst_ColumnasAMostrar_AgrupacionesTerminales_RegistrosSeleccionados = new List<string>();
        public List<string> g_lst_Columnas_AgrupacionesTerminales_RegistrosSeleccionados = new List<string>();
        public ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal g_obj_ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal = new ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal();
        public Dictionary<string, object> g_dct_ListadoFiltros_AgrupacionesTerminales_RegistrosSeleccionados = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_AgrupacionesTerminales_RegistrosSeleccionados = 0;
        public List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_Filtros_AgrupacionesTerminales_RegistrosSeleccionados = new List<INTERNO_ComboBox_Modelo>();

        #endregion

        #region AgrupacionesTerminales Incluir Registros
        //Tareea Asincrona de Marcar/Desmarcar 
        private BackgroundWorker g_obj_TareaAsincrona_AgrupacionesTerminales_MarcarDesmarcar_IncluirRegistros;
        public bool g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_MarcarDesmarcar_IncluirRegistros = false;

        private List<dynamic> g_lst_ListadoRegistros_Filtrados_AgrupacionesTerminales_IncluirRegistros = null;

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

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

        //Filtrado del Listado de Incluir Registros
        public List<string> g_lst_ColumnasAMostrar_AgrupacionesTerminales_IncluirRegistros = new List<string>();
        public List<string> g_lst_Columnas_AgrupacionesTerminales_IncluirRegistros = new List<string>();
        public ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal_IncluirRegistros g_obj_ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal_IncluirRegistros = new ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal_IncluirRegistros();
        public Dictionary<string, object> g_dct_ListadoFiltros_AgrupacionesTerminales_IncluirRegistros = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_AgrupacionesTerminales_IncluirRegistros = 0;
        public List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_Filtros_AgrupacionesTerminales_IncluirRegistros = new List<INTERNO_ComboBox_Modelo>();
        #endregion

        #endregion

        #region CodigosValidacion Historico
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos;
        private List<HPV_Terminales_ValidacionesHistorico> g_lst_HPV_Terminales_ValidacionesHistorico = null;
        #endregion

        //Obtencion de los valores de los registros desde base de datos ############################
        private BackgroundWorker g_obj_TareaAsincrona_Obtener_Listados_Completo_BaseDatos;
        public bool g_bol_Obtencion_Listados_Completo_BaseDatos_Termino = false;

        private string g_str_Salas_ParaValidacion = "Sala";

        public bool g_bol_CodigoValidacionUtilizado = false;


        #endregion

        #region Constructor
        public P_Terminal_Controladora(P_Terminal _frm_P_Terminal)
        {
            g_frm_P_Terminal = _frm_P_Terminal;

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

            //(Tarea Asincrona) Actualizar Salas desde BaseDatos ####################################################################
            g_obj_TareaAsincrona_Actualizar_Salas_Desde_BaseDatos = new BackgroundWorker();
            g_obj_TareaAsincrona_Actualizar_Salas_Desde_BaseDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_Actualizar_Salas_Desde_BaseDatos_DoWork);
            g_obj_TareaAsincrona_Actualizar_Salas_Desde_BaseDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Actualizar_Salas_Desde_BaseDatos_Completed);
            g_obj_TareaAsincrona_Actualizar_Salas_Desde_BaseDatos.WorkerReportsProgress = false;
            g_obj_TareaAsincrona_Actualizar_Salas_Desde_BaseDatos.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Rellenar Listado Incluir Registros ####################################################################
            g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros = new BackgroundWorker();
            g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros_DoWork);
            g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros_ProgressChanged);
            g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros_Completed);
            g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros.WorkerReportsProgress = true;
            g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Rellenar Listado Registros Seleccionados ####################################################################
            g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados = new BackgroundWorker();
            g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados_DoWork);
            g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados_ProgressChanged);
            g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados_Completed);
            g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados.WorkerReportsProgress = true;
            g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Marcar/Desmarcar Salas ####################################################################
            g_obj_TareaAsincrona_Salas_MarcarDesmarcar_IncluirRegistros = new BackgroundWorker();
            g_obj_TareaAsincrona_Salas_MarcarDesmarcar_IncluirRegistros.DoWork += new DoWorkEventHandler(TareaAsincrona_Salas_MarcarDesmarcar_IncluirRegistros_DoWork);
            g_obj_TareaAsincrona_Salas_MarcarDesmarcar_IncluirRegistros.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Salas_MarcarDesmarcar_IncluirRegistros_Completed);
            g_obj_TareaAsincrona_Salas_MarcarDesmarcar_IncluirRegistros.WorkerReportsProgress = false;
            g_obj_TareaAsincrona_Salas_MarcarDesmarcar_IncluirRegistros.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Vaciar Registros Seleccionados ####################################################################
            g_obj_TareaAsincrona_Vaciar_Salas_RegistrosSeleccionados = new BackgroundWorker();
            g_obj_TareaAsincrona_Vaciar_Salas_RegistrosSeleccionados.DoWork += new DoWorkEventHandler(TareaAsincrona_Vaciar_Salas_RegistrosSeleccionados_DoWork);
            g_obj_TareaAsincrona_Vaciar_Salas_RegistrosSeleccionados.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Vaciar_Salas_RegistrosSeleccionados_Completed);
            g_obj_TareaAsincrona_Vaciar_Salas_RegistrosSeleccionados.WorkerReportsProgress = false;
            g_obj_TareaAsincrona_Vaciar_Salas_RegistrosSeleccionados.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Asignar PorDefecto Salas Registros Seleccionados ####################################################################
            g_obj_TareaAsincrona_Salas_AsignarPorDefecto_RegistrosSeleccionados = new BackgroundWorker();
            g_obj_TareaAsincrona_Salas_AsignarPorDefecto_RegistrosSeleccionados.DoWork += new DoWorkEventHandler(TareaAsincrona_Salas_AsignarPorDefecto_RegistrosSeleccionados_DoWork);
            g_obj_TareaAsincrona_Salas_AsignarPorDefecto_RegistrosSeleccionados.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Salas_AsignarPorDefecto_RegistrosSeleccionados_Completed);
            g_obj_TareaAsincrona_Salas_AsignarPorDefecto_RegistrosSeleccionados.WorkerReportsProgress = false;
            g_obj_TareaAsincrona_Salas_AsignarPorDefecto_RegistrosSeleccionados.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Actualizar AgrupacionesTerminales desde BaseDatos ####################################################################
            g_obj_TareaAsincrona_Actualizar_AgrupacionesTerminales_Desde_BaseDatos = new BackgroundWorker();
            g_obj_TareaAsincrona_Actualizar_AgrupacionesTerminales_Desde_BaseDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_Actualizar_AgrupacionesTerminales_Desde_BaseDatos_DoWork);
            g_obj_TareaAsincrona_Actualizar_AgrupacionesTerminales_Desde_BaseDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Actualizar_AgrupacionesTerminales_Desde_BaseDatos_Completed);
            g_obj_TareaAsincrona_Actualizar_AgrupacionesTerminales_Desde_BaseDatos.WorkerReportsProgress = false;
            g_obj_TareaAsincrona_Actualizar_AgrupacionesTerminales_Desde_BaseDatos.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Rellenar Listado Incluir Registros ####################################################################
            g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros = new BackgroundWorker();
            g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros_DoWork);
            g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros_ProgressChanged);
            g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros_Completed);
            g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros.WorkerReportsProgress = true;
            g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Rellenar Listado Registros Seleccionados ####################################################################
            g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados = new BackgroundWorker();
            g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados_DoWork);
            g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados_ProgressChanged);
            g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados_Completed);
            g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados.WorkerReportsProgress = true;
            g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Marcar/Desmarcar AgrupacionesTerminales ####################################################################
            g_obj_TareaAsincrona_AgrupacionesTerminales_MarcarDesmarcar_IncluirRegistros = new BackgroundWorker();
            g_obj_TareaAsincrona_AgrupacionesTerminales_MarcarDesmarcar_IncluirRegistros.DoWork += new DoWorkEventHandler(TareaAsincrona_AgrupacionesTerminales_MarcarDesmarcar_IncluirRegistros_DoWork);
            g_obj_TareaAsincrona_AgrupacionesTerminales_MarcarDesmarcar_IncluirRegistros.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_AgrupacionesTerminales_MarcarDesmarcar_IncluirRegistros_Completed);
            g_obj_TareaAsincrona_AgrupacionesTerminales_MarcarDesmarcar_IncluirRegistros.WorkerReportsProgress = false;
            g_obj_TareaAsincrona_AgrupacionesTerminales_MarcarDesmarcar_IncluirRegistros.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Vaciar Registros Seleccionados ####################################################################
            g_obj_TareaAsincrona_Vaciar_AgrupacionesTerminales_RegistrosSeleccionados = new BackgroundWorker();
            g_obj_TareaAsincrona_Vaciar_AgrupacionesTerminales_RegistrosSeleccionados.DoWork += new DoWorkEventHandler(TareaAsincrona_Vaciar_AgrupacionesTerminales_RegistrosSeleccionados_DoWork);
            g_obj_TareaAsincrona_Vaciar_AgrupacionesTerminales_RegistrosSeleccionados.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Vaciar_AgrupacionesTerminales_RegistrosSeleccionados_Completed);
            g_obj_TareaAsincrona_Vaciar_AgrupacionesTerminales_RegistrosSeleccionados.WorkerReportsProgress = false;
            g_obj_TareaAsincrona_Vaciar_AgrupacionesTerminales_RegistrosSeleccionados.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Rellenar Listado CodigosValidacion_Historicos ####################################################################
            g_obj_TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos = new BackgroundWorker();
            g_obj_TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos_DoWork);
            g_obj_TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos_ProgressChanged);
            g_obj_TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos_Completed);
            g_obj_TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos.WorkerReportsProgress = true;
            g_obj_TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos.WorkerSupportsCancellation = true;
            //#####################################################################################################

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Vaciar Datos
        private void VaciarDatos()
        {
            //Modelo de Terminal
            g_mdl_INTERNO_HPV_Terminales_Modelo = null;

            //Codigo
            g_frm_P_Terminal.Exferia_TextBox_Codigo.Text = "";
            
            //Descripcion
            g_frm_P_Terminal.Exferia_TextBox_Descripcion.Text = "";

            //PermiteArqueo
            g_frm_P_Terminal.Exferia_CheckBox_PermiteArqueo.Checked = true;

            //CodigoValidacion
            g_bol_CodigoValidacionUtilizado = false;
            g_frm_P_Terminal.Exferia_Label_SinColor_CodigoValidacionNoUtilizado.Text = "";
            g_frm_P_Terminal.Exferia_TextBox_CodigoValidacion.Text = "";
            //Vaciar el Listado
            g_frm_P_Terminal.Exferia_DataGridView_CodigosValidacion.Rows.Clear();

            //Sincronizacion
            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Automatica.Checked = true;
            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Boton.Checked = true;
            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorSocket.Checked = false;
            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorTiempo.Checked = false;
            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos.Checked = false;
            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_AperturaLiquidacion.Checked = false;
            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_CierreLiquidacion.Checked = false;
            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_Gastos.Checked = false;
            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketAparcado.Checked = false;
            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketAnulado.Checked = false;
            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketCobrado.Checked = false;

            g_frm_P_Terminal.Exferia_Panel_Degradado_Sincronizacion_Carencia.Visible = false;
            g_frm_P_Terminal.Exferia_Panel_Degradado_Sincronizacion_Eventos.Visible = false;
            g_frm_P_Terminal.Exferia_Panel_Degradado_Sincronizacion_PuertoEscucha.Visible = false;

            //Perfil
            g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Id = -1;
            g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Codigo = "";
            g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Descripcion = "";
            g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_FechaBorrado = null;

            //Vaciar los Checkeados en el Listado de Incluir Registros y de Registros Seleccionados 
            g_dct_Salas_RegistrosSeleccionados_Listado.Clear();
            //Vaciar los Checkeados en el Listado de Incluir Registros y de Registros Seleccionados 
            if (g_dct_Salas_RegistrosSeleccionados_Listado != null &&
                g_dct_Salas_RegistrosSeleccionados_Listado.Count > 0)
            {
                Actualizar_Salas_BaseDatos_Seleccionados_Colectivo(g_dct_Salas_RegistrosSeleccionados_Listado.Keys.ToList(), false);

                Rellenar_DataGridView_Salas_RegistrosSeleccionados(g_frm_P_Terminal.Exferia_TextBox_Salas_RegistrosSeleccionados_Busqueda.Text);
                Rellenar_DataGridView_Salas_IncluirRegistros(g_frm_P_Terminal.Exferia_TextBox_Salas_IncluirRegistros_Busqueda.Text);
            }

            //Desselccionar los registros del datagridView
            g_frm_P_Terminal.Exferia_DataGridView_Salas_IncluirRegistros_Listado.Rows
                    .Cast<DataGridViewRow>()
                    .ToList()
                    .ForEach(r => r.Cells[nameof(INTERNO_HPV_Salas_Listado_Modelo.Seleccionar)].Value = false);

            //Vaciar los Checkeados en el Listado de Incluir Registros y de Registros Seleccionados 
            g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Clear();
            //Vaciar los Checkeados en el Listado de Incluir Registros y de Registros Seleccionados 
            if (g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado != null &&
                g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Count > 0)
            {
                Actualizar_AgrupacionesTerminales_BaseDatos_Seleccionados_Colectivo(g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Keys.ToList(), false);

                Rellenar_DataGridView_AgrupacionesTerminales_RegistrosSeleccionados(g_frm_P_Terminal.Exferia_TextBox_AgrupacionesTerminales_RegistrosSeleccionados_Busqueda.Text);
                Rellenar_DataGridView_AgrupacionesTerminales_IncluirRegistros(g_frm_P_Terminal.Exferia_TextBox_AgrupacionesTerminales_IncluirRegistros_Busqueda.Text);
            }

            //Desselccionar los registros del datagridView
            g_frm_P_Terminal.Exferia_DataGridView_AgrupacionesTerminales_IncluirRegistros_Listado.Rows
                    .Cast<DataGridViewRow>()
                    .ToList()
                    .ForEach(r => r.Cells[nameof(INTERNO_HPV_AgrupacionesTerminales_Listado_Modelo.Seleccionar)].Value = false);

            string[] str_Separador = new string[] { " [" };
            //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
            if (g_frm_P_Terminal.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
            {
                g_frm_P_Terminal.P_Base_TituloPantalla = (g_frm_P_Terminal.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_Terminal.Tag.ToString());
            //#################################################################################################
        }
        #endregion

        #region Buscar Codigo Siguiente
        public INTERNO_ValorDevuelto_Modelo Buscar_CodigoSiguiente()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                HPV_Terminales obj_HPV_Terminales;

                string str_CodigoSiguiente = Datos_Generales.Buscar_CodigoSiguiente(nameof(HPV_Terminales),
                                                                                    nameof(obj_HPV_Terminales.codigo),
                                                                                    nameof(obj_HPV_Terminales.idEmpresa),
                                                                                    g_mdl_INTERNO_HPV_Terminales_Modelo != null ? g_mdl_INTERNO_HPV_Terminales_Modelo.idEmpresa : Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_Terminal.P_Base_ValoresGenerales.lng_idEmpresa, nameof(HPV_Terminales)),
                                                                                    true,
                                                                                    g_frm_P_Terminal.Exferia_TextBox_Codigo.Exferia_TextBox_MaxLength);

                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    g_frm_P_Terminal.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_Terminal.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_Terminal_Controladora) + "/" + nameof(Buscar_CodigoSiguiente));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Comprobacion de cambios, para  grabar o no antes de salir o cambiar de registro
        public bool ComprobarCambios()
        {
            if (g_frm_P_Terminal.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_Terminal.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();
                }
                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;
                }

                g_bol_CargarDatos_Termino = false;

                //Vaciar
                VaciarDatos();

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

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

                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }


                g_bol_CargarDatos_Termino = true;

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_Terminal_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_Terminal.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_Terminal_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_Terminal_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_Terminal.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_Terminal.Salir_P_Base();
                }
                else
                {
                    //por Tiempo
                    if (g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorTiempo.Checked)
                    {
                        g_frm_P_Terminal.Exferia_Panel_Degradado_Sincronizacion_Carencia.Visible = true;
                    }

                    //por Socket
                    if (g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorSocket.Checked)
                    {
                        g_frm_P_Terminal.Exferia_Panel_Degradado_Sincronizacion_PuertoEscucha.Visible = true;
                    }

                    //Eventos
                    if (g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos.Checked)
                    {
                        g_frm_P_Terminal.Exferia_Panel_Degradado_Sincronizacion_Eventos.Visible = true;
                    }

                    //Salas
                    Rellenar_DataGridView_Salas_IncluirRegistros(g_frm_P_Terminal.Exferia_TextBox_Salas_IncluirRegistros_Busqueda.Text);
                    Rellenar_DataGridView_Salas_RegistrosSeleccionados(g_frm_P_Terminal.Exferia_TextBox_Salas_RegistrosSeleccionados_Busqueda.Text);

                    //AgrupacionesTerminales
                    Rellenar_DataGridView_AgrupacionesTerminales_IncluirRegistros(g_frm_P_Terminal.Exferia_TextBox_AgrupacionesTerminales_IncluirRegistros_Busqueda.Text);
                    Rellenar_DataGridView_AgrupacionesTerminales_RegistrosSeleccionados(g_frm_P_Terminal.Exferia_TextBox_AgrupacionesTerminales_RegistrosSeleccionados_Busqueda.Text);

                    //Codigo de validacion
                    Rellenar_DataGridView_CodigosValidacion_Historicos();
                    CodigoValidacion_CambiarTexto();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Terminal.Salir_P_Base();
            }
            finally
            {
                g_bol_CargarDatos_Termino = true;

                //Hacemos foco al primer control.
                g_frm_P_Terminal.Exferia_TextBox_Codigo.Exferia_TextBox_Foco();
            }
        }

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

            try
            {
                g_mdl_INTERNO_HPV_Terminales_Modelo = g_obj_HPV_Terminales_Datos.Obtener(_lng_id);
                g_lng_Salas_PorDefecto = obj_HPV_Terminales_Salas_Datos.Obtener_PorDefecto_IdSala_Por_IdTerminal(_lng_id);

                //Si no es nulo cargo los datos
                if (g_mdl_INTERNO_HPV_Terminales_Modelo != null)
                {
                    //Paginador ................................................................................
                    if (g_frm_P_Terminal.P_Base_PantallaOrigen != null &&
                        g_frm_P_Terminal.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados != null &&
                        g_frm_P_Terminal.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count > 0)
                    {
                        long lng_id_ParaPaginacion = g_mdl_INTERNO_HPV_Terminales_Modelo.id;
                        int int_PaginaDelObjeto = g_frm_P_Terminal.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.IndexOf(g_frm_P_Terminal.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Where(n => n.ID.Equals(lng_id_ParaPaginacion)).FirstOrDefault());

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

                    //Codigo
                    g_frm_P_Terminal.Exferia_TextBox_Codigo.Text = g_mdl_INTERNO_HPV_Terminales_Modelo.codigo;

                    //Descripcion
                    g_frm_P_Terminal.Exferia_TextBox_Descripcion.Text = g_mdl_INTERNO_HPV_Terminales_Modelo.descripcion;

                    //PermiteArqueo
                    g_frm_P_Terminal.Exferia_CheckBox_PermiteArqueo.Checked = g_mdl_INTERNO_HPV_Terminales_Modelo.permite_Arqueo!=null ? g_mdl_INTERNO_HPV_Terminales_Modelo.permite_Arqueo.Value : false;

                    //Perfil
                    g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Id = g_mdl_INTERNO_HPV_Terminales_Modelo.HPV_Perfiles.id;
                    g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Codigo = g_mdl_INTERNO_HPV_Terminales_Modelo.HPV_Perfiles.codigo;
                    g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Descripcion = g_mdl_INTERNO_HPV_Terminales_Modelo.HPV_Perfiles.descripcion;
                    g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_FechaBorrado = g_mdl_INTERNO_HPV_Terminales_Modelo.HPV_Perfiles.fechaBorrado;

                    //codigoValidacion 
                    g_frm_P_Terminal.Exferia_TextBox_CodigoValidacion.Text= g_mdl_INTERNO_HPV_Terminales_Modelo.codigoValidacion;

                    //codigoValidacionUtilizado 
                    g_bol_CodigoValidacionUtilizado = g_mdl_INTERNO_HPV_Terminales_Modelo.codigoValidacionUtilizado != null ? g_mdl_INTERNO_HPV_Terminales_Modelo.codigoValidacionUtilizado.Value : false;

                    //Cargar Listado de Salas RegistroSelccionado
                    if (g_mdl_INTERNO_HPV_Terminales_Modelo.Salas != null && g_mdl_INTERNO_HPV_Terminales_Modelo.Salas.Count > 0)
                    {
                        foreach (HPV_Salas mdl_HPV_Salas in g_mdl_INTERNO_HPV_Terminales_Modelo.Salas)
                        {
                            if (mdl_HPV_Salas.id.Equals(g_lng_Salas_PorDefecto))
                            {
                                g_dct_Salas_RegistrosSeleccionados_Listado.Add(mdl_HPV_Salas.id, true);
                            }
                            else
                            {
                                g_dct_Salas_RegistrosSeleccionados_Listado.Add(mdl_HPV_Salas.id, false);
                            }
                        }
                        Actualizar_Salas_BaseDatos_Seleccionados_Colectivo(g_dct_Salas_RegistrosSeleccionados_Listado.Keys.ToList(), true);
                    }

                    //Cargar Listado de AgrupacionesTerminales RegistroSelccionado
                    if (g_mdl_INTERNO_HPV_Terminales_Modelo.AgrupacionesTerminales != null && g_mdl_INTERNO_HPV_Terminales_Modelo.AgrupacionesTerminales.Count > 0)
                    {
                        foreach (HPV_AgrupacionesTerminales mdl_HPV_AgrupacionesTerminales in g_mdl_INTERNO_HPV_Terminales_Modelo.AgrupacionesTerminales)
                        {
                            g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Add(mdl_HPV_AgrupacionesTerminales.id, false);
                        }
                        Actualizar_AgrupacionesTerminales_BaseDatos_Seleccionados_Colectivo(g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Keys.ToList(), true);
                    }

                    //Cargar HPV_Terminales_ValidacionesHistorico
                    if (g_mdl_INTERNO_HPV_Terminales_Modelo.HPV_Terminales_ValidacionesHistorico!=null &&
                        g_mdl_INTERNO_HPV_Terminales_Modelo.HPV_Terminales_ValidacionesHistorico.Count>0)
                    {
                        g_lst_HPV_Terminales_ValidacionesHistorico = g_mdl_INTERNO_HPV_Terminales_Modelo.HPV_Terminales_ValidacionesHistorico.ToList();
                    }

                    //Sincronizacion
                    if (g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Tipo!=null &&
                        g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Tipo.Trim().Length>0)
                    {
                        //Automatico
                        g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Automatica.Checked = g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Tipo.Substring(0, 1) == "1";

                        //Boton
                        if (g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Tipo.Length>1)
                        {
                            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Boton.Checked = g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Tipo.Substring(1, 1) == "1";
                        }
                        else
                        {
                            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Boton.Checked = false;
                        }

                        //Por Tiempo
                        if (g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Tipo.Length > 2)
                        {
                            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorTiempo.Checked = g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Tipo.Substring(2, 1) == "1";

                            g_frm_P_Terminal.Exferia_TextBox_Sincronizacion_Carencia.Text= g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Carencia!=null ? g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Carencia.Value.ToString(): "0";

                        }
                        else
                        {
                            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorTiempo.Checked = false;
                        }

                        //Por Eventos
                        if (g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Tipo.Length > 3)
                        {
                            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos.Checked = g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Tipo.Substring(3, 1) == "1";

                            //Apertura de liquidación
                            if (g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Eventos.Length > 0)
                            {
                                g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_AperturaLiquidacion.Checked = g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Eventos.Substring(0, 1) == "1";
                            }
                            else
                            {
                                g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_AperturaLiquidacion.Checked = false;
                            }

                            //Cierre de liquidación
                            if (g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Eventos.Length > 1)
                            {
                                g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_CierreLiquidacion.Checked = g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Eventos.Substring(1, 1) == "1";
                            }
                            else
                            {
                                g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_CierreLiquidacion.Checked = false;
                            }

                            //Gastos
                            if (g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Eventos.Length > 2)
                            {
                                g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_Gastos.Checked = g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Eventos.Substring(2, 1) == "1";
                            }
                            else
                            {
                                g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_Gastos.Checked = false;
                            }

                            //Ticket aparcado
                            if (g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Eventos.Length > 3)
                            {
                                g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketAparcado.Checked = g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Eventos.Substring(3, 1) == "1";
                            }
                            else
                            {
                                g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketAparcado.Checked = false;
                            }

                            //Ticket anulado
                            if (g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Eventos.Length > 4)
                            {
                                g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketAnulado.Checked = g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Eventos.Substring(4, 1) == "1";
                            }
                            else
                            {
                                g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketAnulado.Checked = false;
                            }

                            //Ticket cobrado
                            if (g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Eventos.Length > 5)
                            {
                                g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketCobrado.Checked = g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Eventos.Substring(5, 1) == "1";
                            }
                            else
                            {
                                g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketCobrado.Checked = false;
                            }
                        }
                        else
                        {
                            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos.Checked = false;
                        }

                        //Por Socket
                        if (g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Tipo.Length > 4)
                        {
                            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorSocket.Checked = g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_Tipo.Substring(4, 1) == "1";

                            g_frm_P_Terminal.Exferia_TextBox_Sincronizacion_PuertoEscucha.Text = g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_puerto_Escucha != null ? g_mdl_INTERNO_HPV_Terminales_Modelo.sincronizacion_puerto_Escucha.ToString() : "";
                        }
                        else
                        {
                            g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorSocket.Checked = false;
                        }
                    }


                    // Mostrar Campo en el Titulo de mantenimiento
                    string str_MenuSuperior_Codigo = "";
                    if (g_frm_P_Terminal.g_mdl_PRV_OpcionesDetalle != null &&
                        g_frm_P_Terminal.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento != null &&
                        g_frm_P_Terminal.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Trim().Length > 0)
                    {
                        //Obtener el Array de Campos
                        string[] arr_Campos = g_frm_P_Terminal.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_Terminal.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
                        {
                            g_frm_P_Terminal.P_Base_TituloPantalla = (g_frm_P_Terminal.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
                        }

                        dynamic dnm_Objeto = g_mdl_INTERNO_HPV_Terminales_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_HPV_Terminales_Modelo.codigo)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_INTERNO_HPV_Terminales_Modelo.codigo;
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_Terminal.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_Terminal.Tag.ToString(), str_MenuSuperior_Codigo);
                    //#################################################################################################

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

            return bol_ValorDevuelto;
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos(bool _bol_VolverAlListado)
        {
            try
            {
                g_bol_GrabarDatos_VolverListado = _bol_VolverAlListado;

                g_bol_GrabarDatos_TerminoCorrectamente = true;

                g_frm_P_Terminal.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 != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                g_frm_P_Terminal.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_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_Terminal_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_Terminal_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 != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Terminal.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_Terminal, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    // Devolver al Listado el Row Añadido/Modificado
                    if (g_frm_P_Terminal.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_Terminal.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_Terminal.P_Base_F3Origen != null)
                    {
                        g_frm_P_Terminal.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    if (g_bol_GrabarDatos_VolverListado)
                    {
                        g_frm_P_Terminal.P_Base_SeModificoDatosPantalla = false;
                        g_frm_P_Terminal.Salir_P_Base();
                    }

                    //Si fue todo correcto desbloqueo el boton de borrar
                    g_frm_P_Terminal.Exferia_Button_Borrar.Exferia_Button_Bloqueable = false;

                    g_frm_P_Terminal.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminal_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_Terminal.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_Terminal.Exferia_TextBox_Codigo;
                    }
                }

                // El codigo no puede estar Repetido
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    string str_Codigo = g_frm_P_Terminal.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(nameof(HPV_Terminales), nameof(HPV_Terminales.codigo), str_Codigo, nameof(HPV_Terminales.id), (g_mdl_INTERNO_HPV_Terminales_Modelo != null ? g_mdl_INTERNO_HPV_Terminales_Modelo.id : -1), nameof(HPV_Terminales.idEmpresa), g_frm_P_Terminal.P_Base_ValoresGenerales.lng_idEmpresa, true))
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_REPETIDO(g_frm_P_Terminal.Exferia_Label_Codigo.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Terminal.Exferia_TextBox_Codigo;
                    }
                }

                // La Descripcion no puede estar vacía
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Terminal.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_Terminal.Exferia_Label_Descripcion.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Terminal.Exferia_TextBox_Descripcion;
                }

                // el Perfil no puede estar Vacio (Obligatorio)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Codigo.Trim().Length == 0 &&
                    g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Perfil validar que es Correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                //El listado de Salas no puede estar vacio
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_dct_Salas_RegistrosSeleccionados_Listado.Count == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_NOHAYREGISTROSSELECCIONADOS(g_str_Salas_ParaValidacion);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Terminal.Exferia_DataGridView_Salas_RegistrosSeleccionados_Listado;
                }

                //Si el listado de Salas es 1 la ponemos por defecto
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_dct_Salas_RegistrosSeleccionados_Listado.Count == 1))
                {
                    //Cojo el unico registro que hay y lo pongo como por defecto
                    long lng_Registro = g_dct_Salas_RegistrosSeleccionados_Listado.Keys.FirstOrDefault();//Obtengo el id del registro
                    g_dct_Salas_RegistrosSeleccionados_Listado[lng_Registro] = true;
                }

                //Si el listado de salas es mas de 1 compruebo que tengo una por defecto
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_dct_Salas_RegistrosSeleccionados_Listado.Count > 1))
                {
                    KeyValuePair<long, bool> kvp_Salas = g_dct_Salas_RegistrosSeleccionados_Listado.Where(x => x.Value.Equals(true)).FirstOrDefault();
                    //Si devuelvo 0 es que no hay ninguna por defecto
                    if (kvp_Salas.Key.Equals(0))
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_VALIDACIONES_NOHAYREGISTROPORDEFECTO(g_str_Salas_ParaValidacion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Terminal.Exferia_DataGridView_Salas_RegistrosSeleccionados_Listado;
                    }
                }

                //Tiene que tener algun sistema de sincronizacion activo
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && 
                    g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Boton.Checked==false &&
                    g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorTiempo.Checked == false &&
                    g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos.Checked == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_TERMINALES_VALIDACIONES_NOHAY_TIPOSINCRONIZACION();
                }

                //Si tiene seleccionado por eventos, tiene que tener algun evento seleccionado
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto &&
                    g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos.Checked &&
                    g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_AperturaLiquidacion.Checked==false &&
                    g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_CierreLiquidacion.Checked == false &&
                    g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_Gastos.Checked == false &&
                    g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketAnulado.Checked == false &&
                    g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketAparcado.Checked == false &&
                    g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketCobrado.Checked == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_TERMINALES_VALIDACIONES_NOHAY_SINCRONIZACION_EVENTOS();
                }

                //Si tiene seleccionado por tiempo, tiene que poner una carecnia superior a 0
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto &&
                    g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorTiempo.Checked &&
                    (
                        g_frm_P_Terminal.Exferia_TextBox_Sincronizacion_Carencia.Text.Trim().Length==0 ||
                        int.Parse(g_frm_P_Terminal.Exferia_TextBox_Sincronizacion_Carencia.Text.Trim())==0
                    ))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_TERMINALES_VALIDACIONES_NOHAY_CARENCIA();
                }

                //Si tiene seleccionado por socket, tiene que poner un puerto de escucha
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto &&
                    g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorSocket.Checked &&
                    (
                        g_frm_P_Terminal.Exferia_TextBox_Sincronizacion_PuertoEscucha.Text.Trim().Length == 0 ||
                        int.Parse(g_frm_P_Terminal.Exferia_TextBox_Sincronizacion_PuertoEscucha.Text.Trim()) == 0
                    ))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_TERMINALES_VALIDACIONES_NOHAY_PUERTOESCUCHA();
                }
            }
            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_Terminal_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()
        {
            Encriptador obj_Encriptador = new Encriptador();
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    HPV_Terminales mdl_HPV_Terminales = new HPV_Terminales();
                    mdl_HPV_Terminales.id = g_mdl_INTERNO_HPV_Terminales_Modelo != null ? g_mdl_INTERNO_HPV_Terminales_Modelo.id : -1;

                    //Asignar el idEmpresa...........................................................................................
                    if ((g_mdl_INTERNO_HPV_Terminales_Modelo != null ? g_mdl_INTERNO_HPV_Terminales_Modelo.idEmpresa : -1) != -1)
                    {
                        mdl_HPV_Terminales.idEmpresa = g_mdl_INTERNO_HPV_Terminales_Modelo.idEmpresa;
                    }
                    else
                    {
                        //Buscar el idEmpresa que Corresponda
                        mdl_HPV_Terminales.idEmpresa = Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_Terminal.P_Base_ValoresGenerales.lng_idEmpresa, nameof(HPV_Terminales));
                    }

                    // Codigo
                    mdl_HPV_Terminales.codigo = g_frm_P_Terminal.Exferia_TextBox_Codigo.Text.Trim();

                    // Descripcion
                    mdl_HPV_Terminales.descripcion = g_frm_P_Terminal.Exferia_TextBox_Descripcion.Text.Trim();

                    //PermiteArqueo
                    mdl_HPV_Terminales.permite_Arqueo = g_frm_P_Terminal.Exferia_CheckBox_PermiteArqueo.Checked;

                    //Perfil 
                    mdl_HPV_Terminales.idPerfil = g_frm_P_Terminal.Exferia_F3_Perfil.Exferia_F3_Id;

                    //codigoValidacion 
                    mdl_HPV_Terminales.codigoValidacion = g_frm_P_Terminal.Exferia_TextBox_CodigoValidacion.Text;

                    //codigoValidacionUtilizado 
                    mdl_HPV_Terminales.codigoValidacionUtilizado = g_bol_CodigoValidacionUtilizado;

                    //sincronizacion_Tipo
                    string str_Sincronizacion_Tipo = "";
                    str_Sincronizacion_Tipo += g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Automatica.Checked ? "1" : "0";
                    str_Sincronizacion_Tipo += g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Boton.Checked ? "1" : "0";
                    str_Sincronizacion_Tipo += g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorTiempo.Checked ? "1" : "0";
                    str_Sincronizacion_Tipo += g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos.Checked ? "1" : "0";
                    str_Sincronizacion_Tipo += g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorSocket.Checked ? "1" : "0";
                    mdl_HPV_Terminales.sincronizacion_Tipo = str_Sincronizacion_Tipo;

                    //sincronizacion_Carencia
                    int int_Sincronizacion_Carencia = 0;
                    if (g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorTiempo.Checked &&
                        g_frm_P_Terminal.Exferia_TextBox_Sincronizacion_Carencia.Text.Trim().Length>0)
                    {
                        int_Sincronizacion_Carencia = int.Parse(g_frm_P_Terminal.Exferia_TextBox_Sincronizacion_Carencia.Text.Trim());
                    }
                    mdl_HPV_Terminales.sincronizacion_Carencia = int_Sincronizacion_Carencia;


                    //puerto_Escucha
                    string str_puerto_Escucha = "";
                    if (g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_PorSocket.Checked &&
                        g_frm_P_Terminal.Exferia_TextBox_Sincronizacion_PuertoEscucha.Text.Trim().Length > 0)
                    {
                        str_puerto_Escucha = g_frm_P_Terminal.Exferia_TextBox_Sincronizacion_PuertoEscucha.Text.Trim();
                    }
                    mdl_HPV_Terminales.sincronizacion_puerto_Escucha = str_puerto_Escucha;


                    //sincronizacion_Eventos
                    string str_Sincronizacion_Eventos = "";
                    str_Sincronizacion_Eventos += g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_AperturaLiquidacion.Checked ? "1" : "0";
                    str_Sincronizacion_Eventos += g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_CierreLiquidacion.Checked ? "1" : "0";
                    str_Sincronizacion_Eventos += g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_Gastos.Checked ? "1" : "0";
                    str_Sincronizacion_Eventos += g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketAparcado.Checked ? "1" : "0";
                    str_Sincronizacion_Eventos += g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketAnulado.Checked ? "1" : "0";
                    str_Sincronizacion_Eventos += g_frm_P_Terminal.Exferia_CheckBox_Sincronizacion_Eventos_TicketCobrado.Checked ? "1" : "0";
                    mdl_HPV_Terminales.sincronizacion_Eventos = str_Sincronizacion_Eventos;

                    // Se graba el modelo ya relleno.
                    mdl_ValorDevuelto_Modelo = g_obj_HPV_Terminales_Datos.Grabar(mdl_HPV_Terminales);

                    long lng_idTerminal = -1;
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        lng_idTerminal = mdl_ValorDevuelto_Modelo.Id;

                        #region Salas
                        INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Salas = obj_HPV_Terminales_Salas_Datos.Grabar(lng_idTerminal, g_dct_Salas_RegistrosSeleccionados_Listado);
                        if (mdl_ValorDevuelto_Modelo_Salas.TodoCorrecto == false)
                        {
                            transaccion_SQL.Dispose();
                            return mdl_ValorDevuelto_Modelo_Salas;
                        }
                        #endregion

                        #region AgrupacionesTerminales
                        INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_AgrupacionesTerminales = obj_HPV_Terminales_AgrupacionesTerminales_Datos.Grabar(lng_idTerminal, g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado);
                        if (mdl_ValorDevuelto_Modelo_AgrupacionesTerminales.TodoCorrecto == false)
                        {
                            transaccion_SQL.Dispose();
                            return mdl_ValorDevuelto_Modelo_AgrupacionesTerminales;
                        }
                        #endregion

                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Obtener el modelo que se acaba de grabar
                        g_mdl_INTERNO_HPV_Terminales_Modelo = g_obj_HPV_Terminales_Datos.Obtener(lng_idTerminal);
                        g_frm_P_Terminal.P_Base_id = lng_idTerminal;
                        g_frm_P_Terminal.P_Base_TituloPantalla = g_frm_P_Terminal.g_mdl_PRV_OpcionesDetalle.descripcion_TituloMantenimiento;

                        #region SINCRONIZACION PARA TERMINALES
                        Sincronizar_Registros obj_Sincronizar_Registros = new Sincronizar_Registros();

                        //HPV_Terminales
                        obj_Sincronizar_Registros.Sincronizar_Actualizar(new Sincronizar_Actualizar_Modelo(g_mdl_INTERNO_HPV_Terminales_Modelo,
                                                                                                            g_frm_P_Terminal.P_Base_ValoresGenerales.lng_idEmpresa,
                                                                                                            nameof(HPV_Terminales)));

                        #endregion


                    }
                }
                catch (Control_Errores)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_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_Terminal_Controladora) + "/" + nameof(GrabarDatos_Final));
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                finally
                {
                    //Termino Transaccion
                    transaccion_SQL.Dispose();
                }
            }
            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar Datos
        public void BorrarDatos()
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Terminal.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 != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                g_frm_P_Terminal.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_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_Terminal_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_Terminal_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 != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Terminal.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
                {
                    // Devolver al Listado el Row Borrar
                    if (g_frm_P_Terminal.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_Terminal.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_Terminal.P_Base_F3Origen != null)
                    {
                        g_frm_P_Terminal.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    g_frm_P_Terminal.P_Base_SeModificoDatosPantalla = false;
                    g_frm_P_Terminal.Salir_P_Base();

                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_HPV_Terminales_Datos.Borrar(g_mdl_INTERNO_HPV_Terminales_Modelo != null ? g_mdl_INTERNO_HPV_Terminales_Modelo.id : -1);


                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    #region SINCRONIZACION PARA TERMINALES
                    Sincronizar_Registros obj_Sincronizar_Registros = new Sincronizar_Registros();

                    //HPV_Terminales
                    obj_Sincronizar_Registros.Sincronizar_Borrar(new Sincronizar_Borrar_Modelo(g_mdl_INTERNO_HPV_Terminales_Modelo.id.ToString(),
                                                                                                g_frm_P_Terminal.P_Base_ValoresGenerales.lng_idEmpresa,
                                                                                                nameof(HPV_Terminales)));

                    #endregion
                }
            }
            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_Terminal_Controladora) + "/" + nameof(BorrarDatos_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Obtener (Salas,AgrupacionesTerminales) Completo de base de datos
        public void Obtener_Listados_Completo_BaseDatos()
        {
            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_Listados_Completo_BaseDatos.IsBusy)
                    Application.DoEvents();

                g_bol_Obtencion_Listados_Completo_BaseDatos_Termino = false;

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_Obtener_Listados_Completo_BaseDatos.RunWorkerAsync();
            }
            catch (Exception)
            {
                g_bol_Obtencion_Listados_Completo_BaseDatos_Termino = true;

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

        }
        protected void TareaAsincrona_Obtener_Listados_Completo_BaseDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                Obtener_Salas_BaseDatos();

                Obtener_AgrupacionesTerminales_BaseDatos();
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        protected void TareaAsincrona_Obtener_Listados_Completo_BaseDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }

            g_bol_Obtencion_Listados_Completo_BaseDatos_Termino = true;
        }

        private void Obtener_Salas_BaseDatos()
        {
            g_lst_Salas_ListadoRegistros = g_obj_HPV_Salas_Datos.Obtener_Listado(g_frm_P_Terminal.P_Base_ValoresGenerales.lng_idEmpresa, g_frm_P_Terminal.P_Base_ValoresGenerales.EjercicioActivo.id, g_lst_Columnas_Salas_IncluirRegistros, null, null);
        }
        private void Obtener_AgrupacionesTerminales_BaseDatos()
        {
            g_lst_AgrupacionesTerminales_ListadoRegistros = g_obj_HPV_AgrupacionesTerminales_Datos.Obtener_Listado(g_frm_P_Terminal.P_Base_ValoresGenerales.lng_idEmpresa, g_frm_P_Terminal.P_Base_ValoresGenerales.EjercicioActivo.id, g_lst_Columnas_AgrupacionesTerminales_IncluirRegistros, null, null);
        }
        #endregion

        #region Salas
        #region Actualizar Salas desde Base datos
        public void Actualizar_Salas_Desde_BaseDatos()
        {
            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_Actualizar_Salas_Desde_BaseDatos.IsBusy)
                    Application.DoEvents();

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_Actualizar_Salas_Desde_BaseDatos.RunWorkerAsync();
            }
            catch (Exception)
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }
        }
        protected void TareaAsincrona_Actualizar_Salas_Desde_BaseDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Actualizo los registros de Salas de base de datos
                Obtener_Salas_BaseDatos();

                //Recargar el modelo
                if (g_mdl_INTERNO_HPV_Terminales_Modelo != null)
                {
                    INTERNO_HPV_Terminales_Modelo mdl_INTERNO_HPV_Terminales_Modelo = g_obj_HPV_Terminales_Datos.Obtener(g_mdl_INTERNO_HPV_Terminales_Modelo.id);

                    if (mdl_INTERNO_HPV_Terminales_Modelo != null)
                    {
                        g_mdl_INTERNO_HPV_Terminales_Modelo = mdl_INTERNO_HPV_Terminales_Modelo;
                    }
                }

                //Listado de Salas relacionados con la sala
                if (g_mdl_INTERNO_HPV_Terminales_Modelo.Salas != null &&
                    g_mdl_INTERNO_HPV_Terminales_Modelo.Salas.Count > 0)
                {
                    foreach (HPV_Salas mdl_HPV_Salas in g_mdl_INTERNO_HPV_Terminales_Modelo.Salas)
                    {
                        if (mdl_HPV_Salas.id.Equals(g_lng_Salas_PorDefecto))
                        {
                            g_dct_Salas_RegistrosSeleccionados_Listado.Add(mdl_HPV_Salas.id, true);
                        }
                        else
                        {
                            g_dct_Salas_RegistrosSeleccionados_Listado.Add(mdl_HPV_Salas.id, false);
                        }
                    }
                    Actualizar_Salas_BaseDatos_Seleccionados_Colectivo(g_dct_Salas_RegistrosSeleccionados_Listado.Keys.ToList(), true);
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        protected void TareaAsincrona_Actualizar_Salas_Desde_BaseDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }

            if (!e.Cancelled)
            {
                //Rellenar Grid
                Rellenar_DataGridView_Salas_IncluirRegistros(g_frm_P_Terminal.Exferia_TextBox_Salas_IncluirRegistros_Busqueda.Text);
                Rellenar_DataGridView_Salas_RegistrosSeleccionados(g_frm_P_Terminal.Exferia_TextBox_Salas_RegistrosSeleccionados_Busqueda.Text);
            }
        }
        #endregion

        #region Salas Incluir Registros

        #region Rellenar DataGridView Salas Incluir Registros
        public void Rellenar_DataGridView_Salas_IncluirRegistros(string _str_filtro)
        {
            try
            {
                g_bol_CancelarTareaAsincrona_Salas_IncluirRegistros = true;

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

                g_bol_CancelarTareaAsincrona_Salas_IncluirRegistros = false;

                //Vaciar el Listado
                g_frm_P_Terminal.Exferia_DataGridView_Salas_IncluirRegistros_Listado.Rows.Clear();
                g_int_TotalRegistrosInsertados_Salas_IncluirRegistros = 0;
                g_frm_P_Terminal.Exferia_BarraProgreso_Salas_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Total = 0;
                g_frm_P_Terminal.Exferia_BarraProgreso_Salas_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_Terminal.Exferia_ComboBox_Salas_IncluirRegistros_Filtros.SelectedItem);
                lst_Argumentos.Add(g_frm_P_Terminal.Exferia_CheckBox_Salas_IncluirRegistros_MayusculasMinusculas.Checked);
                lst_Argumentos.Add(g_frm_P_Terminal.Exferia_CheckBox_Salas_IncluirRegistros_PalabraCompleta.Checked);

                //Orden Actual
                if (g_frm_P_Terminal.Exferia_ComboBox_Salas_IncluirRegistros_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)g_frm_P_Terminal.Exferia_ComboBox_Salas_IncluirRegistros_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                {
                    lst_Argumentos.Add(((INTERNO_ComboBox_Modelo)g_frm_P_Terminal.Exferia_ComboBox_Salas_IncluirRegistros_OrdenListado.SelectedItem).Identificador);
                }
                else
                {
                    lst_Argumentos.Add(g_obj_ABS_Listado_HPV_Salas_P_Terminal_IncluirRegistros.ORDENACION_NOMBRECOLUMNA_PORDEFECTO());
                }

                //Lllamra a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros.RunWorkerAsync(lst_Argumentos);
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(Rellenar_DataGridView_Salas_IncluirRegistros));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_Terminal_Controladora) + "/" + nameof(Rellenar_DataGridView_Salas_IncluirRegistros));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Salas_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_Salas_IncluirRegistros = null;

                //Filtrar #############################################
                if (str_Busqueda.Trim().Length > 0 || g_dct_ListadoFiltros_Salas_IncluirRegistros.Count > 0)
                {
                    g_lst_ListadoRegistros_Filtrados_Salas_IncluirRegistros = g_lst_Salas_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_Salas_IncluirRegistros)
                            {
                                //Palabra Completa
                                if (bol_PalabraCompleta)
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_Salas_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_Salas_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_Salas_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_Salas_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_Salas_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_Salas_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_Salas_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_Salas_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_Salas_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_Salas_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_Salas_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_Salas_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_Salas_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_Salas_IncluirRegistros != null && g_dct_ListadoFiltros_Salas_IncluirRegistros.Count > 0)
                    {
                        g_lst_ListadoRegistros_Filtrados_Salas_IncluirRegistros = Funciones_Listado.Filtrar_Listado(g_lst_ListadoRegistros_Filtrados_Salas_IncluirRegistros, g_obj_ABS_Listado_HPV_Salas_P_Terminal_IncluirRegistros, g_dct_ListadoFiltros_Salas_IncluirRegistros);
                    }
                }
                else
                {
                    g_lst_ListadoRegistros_Filtrados_Salas_IncluirRegistros = g_lst_Salas_ListadoRegistros;
                }
                //#####################################################

                if (g_lst_ListadoRegistros_Filtrados_Salas_IncluirRegistros != null)
                {

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

                    g_frm_P_Terminal.Listado_Salas_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_obj_ABS_Listado_HPV_Salas_P_Terminal_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_frm_P_Terminal.Exferia_BarraProgreso_Salas_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Total = g_lst_ListadoRegistros_Filtrados_Salas_IncluirRegistros.Count;

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

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

                        //Llamar al Progress
                        g_int_TotalRegistrosInsertados_Salas_IncluirRegistros += 1;

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

                        //Application.DoEvents();
                        Thread.Sleep(1);
                    }

                }
            }
            catch (ThreadAbortException ex)
            {
                g_bol_CancelarTareaAsincrona_Salas_IncluirRegistros = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_CancelarTareaAsincrona_Salas_IncluirRegistros = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_CancelarTareaAsincrona_Salas_IncluirRegistros = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                g_frm_P_Terminal.Exferia_DataGridView_Salas_IncluirRegistros_Listado.Rows.Add((object[])e.UserState);

                g_frm_P_Terminal.Exferia_BarraProgreso_Salas_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Salas_IncluirRegistros;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Salas_IncluirRegistros_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }
        #endregion

        #region Marcar/Desmarcar
        public void Salas_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_Salas_MarcarDesmarcar_IncluirRegistros = true;

                //Si se estaba ejecutando lo paro
                while (g_obj_TareaAsincrona_Salas_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_Salas_MarcarDesmarcar_IncluirRegistros.RunWorkerAsync(lst_Argumentos);
            }
            catch (Exception)
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }

        }
        protected void TareaAsincrona_Salas_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_obj_ABS_Listado_HPV_Salas_P_Terminal_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_Salas_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_Salas_IncluirRegistros.Select(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m)).Cast<long>().ToList();
                }

                Actualizar_Salas_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_Salas_MarcarDesmarcar_IncluirRegistros_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }

            g_bol_CancelarTareaAsincrona_Salas_MarcarDesmarcar_IncluirRegistros = false;

            if ((bool)e.Result)
            {
                Rellenar_DataGridView_Salas_IncluirRegistros(g_frm_P_Terminal.Exferia_TextBox_Salas_IncluirRegistros_Busqueda.Text);
                Rellenar_DataGridView_Salas_RegistrosSeleccionados(g_frm_P_Terminal.Exferia_TextBox_Salas_RegistrosSeleccionados_Busqueda.Text);
            }

        }
        #endregion

        #endregion

        #region Salas Registros Seleccionados

        #region Rellenar DataGridView Salas Registros Seleccionados
        public void Rellenar_DataGridView_Salas_RegistrosSeleccionados(string _str_filtro)
        {
            try
            {
                g_bol_CancelarTareaAsincrona_Salas_RegistrosSeleccionados = true;

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

                g_bol_CancelarTareaAsincrona_Salas_RegistrosSeleccionados = false;

                //Vaciar el Listado
                g_frm_P_Terminal.Exferia_DataGridView_Salas_RegistrosSeleccionados_Listado.Rows.Clear();
                g_int_TotalRegistrosInsertados_Salas_RegistrosSeleccionados = 0;
                g_frm_P_Terminal.Exferia_BarraProgreso_Salas_RegistrosSeleccionados_BarraProgreso.Exferia_BarraProgreso_Total = 0;
                g_frm_P_Terminal.Exferia_BarraProgreso_Salas_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_Terminal.Exferia_ComboBox_Salas_RegistrosSeleccionados_Filtros.SelectedItem);
                lst_Argumentos.Add(g_frm_P_Terminal.Exferia_CheckBox_Salas_RegistrosSeleccionados_MayusculasMinusculas.Checked);
                lst_Argumentos.Add(g_frm_P_Terminal.Exferia_CheckBox_Salas_RegistrosSeleccionados_PalabraCompleta.Checked);

                //Orden Actual
                if (g_frm_P_Terminal.Exferia_ComboBox_Salas_RegistrosSeleccionados_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)g_frm_P_Terminal.Exferia_ComboBox_Salas_RegistrosSeleccionados_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                {
                    lst_Argumentos.Add(((INTERNO_ComboBox_Modelo)g_frm_P_Terminal.Exferia_ComboBox_Salas_RegistrosSeleccionados_OrdenListado.SelectedItem).Identificador);
                }
                else
                {
                    lst_Argumentos.Add(g_obj_ABS_Listado_HPV_Salas_P_Terminal.ORDENACION_NOMBRECOLUMNA_PORDEFECTO());
                }

                //Lllamra a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados.RunWorkerAsync(lst_Argumentos);
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(Rellenar_DataGridView_Salas_RegistrosSeleccionados));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_Terminal_Controladora) + "/" + nameof(Rellenar_DataGridView_Salas_RegistrosSeleccionados));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_HPV_Salas_P_Terminal.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_Salas_ListadoRegistros != null &&
                    g_dct_Salas_RegistrosSeleccionados_Listado != null &&
                    g_dct_Salas_RegistrosSeleccionados_Listado.Count > 0)
                {
                    //Busco registro listado en memoria
                    lst_ListadoRegistros_RegistrosSeleccionados = g_lst_Salas_ListadoRegistros.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && g_dct_Salas_RegistrosSeleccionados_Listado.Keys.ToList().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_Salas_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_Salas_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_Salas_RegistrosSeleccionados != null && g_dct_ListadoFiltros_Salas_RegistrosSeleccionados.Count > 0)
                        {
                            lst_ListadoRegistros_Filtrados = Funciones_Listado.Filtrar_Listado(lst_ListadoRegistros_Filtrados, g_obj_ABS_Listado_HPV_Salas_P_Terminal, g_dct_ListadoFiltros_Salas_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_Terminal.Exferia_Button_Salas_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_Terminal.Listado_Salas_RegistrosSeleccionados_Ordenar_DataGridView();

                        //Guadar el listado .......................................................................................
                        g_frm_P_Terminal.Exferia_BarraProgreso_Salas_RegistrosSeleccionados_BarraProgreso.Exferia_BarraProgreso_Total = lst_ListadoRegistros_Filtrados.Count;

                        object[] row;
                        long lng_idSala = -1;
                        bool bol_PorDefecto = false;
                        foreach (dynamic obj_Dinamico in lst_ListadoRegistros_Filtrados)
                        {
                            //Se Cancelo la tarea asincrona ---------------------------
                            if (g_bol_CancelarTareaAsincrona_Salas_RegistrosSeleccionados)
                            {
                                return;
                            }

                            lng_idSala = obj_Dinamico.GetType().GetProperty(str_NombreCampoClave).GetValue(obj_Dinamico, null);

                            //Poner la SeccionMenu si la Tuviera
                            if (g_dct_Salas_RegistrosSeleccionados_Listado != null &&
                                g_dct_Salas_RegistrosSeleccionados_Listado.Count > 0 &&
                                g_dct_Salas_RegistrosSeleccionados_Listado.ContainsKey(lng_idSala))
                            {
                                //Ver si tiene una seccion asignada
                                bol_PorDefecto = g_dct_Salas_RegistrosSeleccionados_Listado[lng_idSala];
                                if (bol_PorDefecto)
                                {
                                    obj_Dinamico.GetType().GetProperty(nameof(INTERNO_HPV_Salas_Listado_Modelo.Pordefecto)).SetValue(obj_Dinamico, true, null);
                                }
                                else
                                {
                                    obj_Dinamico.GetType().GetProperty(nameof(INTERNO_HPV_Salas_Listado_Modelo.Pordefecto)).SetValue(obj_Dinamico, false, null);
                                }
                            }
                            else
                            {
                                obj_Dinamico.GetType().GetProperty(nameof(INTERNO_HPV_Salas_Listado_Modelo.Pordefecto)).SetValue(obj_Dinamico, false, null);
                            }

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

                            //Llamar al Progress
                            g_int_TotalRegistrosInsertados_Salas_RegistrosSeleccionados += 1;

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

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_CancelarTareaAsincrona_Salas_RegistrosSeleccionados = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_CancelarTareaAsincrona_Salas_RegistrosSeleccionados = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                g_frm_P_Terminal.Exferia_DataGridView_Salas_RegistrosSeleccionados_Listado.Rows.Add((object[])e.UserState);

                g_frm_P_Terminal.Exferia_BarraProgreso_Salas_RegistrosSeleccionados_BarraProgreso.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Salas_RegistrosSeleccionados;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Salas_RegistrosSeleccionados_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }
        #endregion

        #region Vaciar Registros Seleccionados
        public void Vaciar_Salas_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_Salas_RegistrosSeleccionados = true;

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


                g_lst_Salas_RegistrosSeleccionados_AVaciar = _lst_ids_ABorrar;

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_Vaciar_Salas_RegistrosSeleccionados.RunWorkerAsync();
            }
            catch (Exception)
            {
                g_bol_CancelarTareaAsincrona_Vaciar_Salas_RegistrosSeleccionados = false;

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

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

            try
            {
                Actualizar_Salas_BaseDatos_Seleccionados_Colectivo(g_lst_Salas_RegistrosSeleccionados_AVaciar, false);
            }
            catch (ThreadAbortException)
            {
                bol_TerminoCorrectamente = false;
            }
            catch (Exception)
            {
                bol_TerminoCorrectamente = false;
            }
            finally
            {
                e.Result = bol_TerminoCorrectamente;
            }
        }
        protected void TareaAsincrona_Vaciar_Salas_RegistrosSeleccionados_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            g_bol_CancelarTareaAsincrona_Vaciar_Salas_RegistrosSeleccionados = false;

            try
            {
                if ((bool)e.Result)
                {
                    string str_NombreCampoClave = "id";
                    INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_HPV_Salas_P_Terminal.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_Terminal.Exferia_DataGridView_Salas_RegistrosSeleccionados_Listado.Rows
                            .Cast<DataGridViewRow>()
                            .ToList()
                            .Where(r => g_lst_Salas_RegistrosSeleccionados_AVaciar.Contains(long.Parse(r.Cells[str_NombreCampoClave].Value.ToString()))).ToList().ForEach(m => g_frm_P_Terminal.Exferia_DataGridView_Salas_RegistrosSeleccionados_Listado.Rows.Remove(m));

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

        #region AsignarPorDefecto
        public void Salas_AsignaPorDefecto_RegistrosSeleccionados(long _lng_idPorDefecto)
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_SELECCIONANDO_REGISTROS());
                g_frm_PE_Esperando.TopMost = true;
                g_frm_PE_Esperando.Show();

                //Cancelar Tarea Asincrona
                g_bol_CancelarTareaAsincrona_Salas_AsignarPorDefecto_RegistrosSeleccionados = true;

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

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

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

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

            try
            {
                List<object> lst_Argumentos = (List<object>)e.Argument;
                long lng_idPorDefecto = (long)lst_Argumentos[0];

                //quitamos el PorDefecto Anterios
                if (g_lng_Salas_PorDefecto > -1)
                {
                    if (g_dct_Salas_RegistrosSeleccionados_Listado.ContainsKey(g_lng_Salas_PorDefecto))
                    {
                        g_dct_Salas_RegistrosSeleccionados_Listado[g_lng_Salas_PorDefecto] = false;
                    }
                }

                //Asignamos el nuevo por defecto al liestado
                g_dct_Salas_RegistrosSeleccionados_Listado[lng_idPorDefecto] = true;

                //Guadamos el id Sala de la nueva por defecto
                g_lng_Salas_PorDefecto = lng_idPorDefecto;

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

            g_bol_CancelarTareaAsincrona_Salas_MarcarDesmarcar_IncluirRegistros = false;

            Rellenar_DataGridView_Salas_RegistrosSeleccionados(g_frm_P_Terminal.Exferia_TextBox_Salas_RegistrosSeleccionados_Busqueda.Text);
        }
        #endregion

        #endregion

        public void Actualizar_Salas_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_obj_ABS_Listado_HPV_Salas_P_Terminal_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_Salas_ListadoRegistros[g_lst_Salas_ListadoRegistros.IndexOf(g_lst_Salas_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(nameof(INTERNO_HPV_Salas_Listado_Modelo.Seleccionar)).SetValue(dnm_Registro, _bol_Valor, null);


                    //Modificar listado en memoria
                    g_lst_Salas_ListadoRegistros[g_lst_Salas_ListadoRegistros.IndexOf(g_lst_Salas_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_dct_Salas_RegistrosSeleccionados_Listado.ContainsKey(_lng_id))
                    {
                        //si es la pirmera Sala la ponemos por defecto
                        if (g_dct_Salas_RegistrosSeleccionados_Listado.Count == 0)
                        {
                            g_dct_Salas_RegistrosSeleccionados_Listado.Add(_lng_id, true);
                            g_lng_Salas_PorDefecto = _lng_id;
                        }
                        else
                        {
                            g_dct_Salas_RegistrosSeleccionados_Listado.Add(_lng_id, false);
                        }
                    }
                }
                else
                {
                    if (g_dct_Salas_RegistrosSeleccionados_Listado.ContainsKey(_lng_id))
                    {
                        g_dct_Salas_RegistrosSeleccionados_Listado[_lng_id] = false;
                        g_dct_Salas_RegistrosSeleccionados_Listado.Remove(_lng_id);
                    }
                }

                Rellenar_DataGridView_Salas_RegistrosSeleccionados(g_frm_P_Terminal.Exferia_TextBox_Salas_RegistrosSeleccionados_Busqueda.Text);
            }
            catch (Exception)
            { }
        }
        public void Actualizar_Salas_BaseDatos_Seleccionados_Colectivo(List<long> _lst_id, bool _bol_Valor)
        {
            try
            {
                if (g_lst_Salas_ListadoRegistros != null)
                {
                    //Buscar el Campo Clave
                    string str_NombreCampoClave = "id";
                    INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_HPV_Salas_P_Terminal_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_Salas_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(nameof(INTERNO_HPV_Salas_Listado_Modelo.Seleccionar)).SetValue(x, _bol_Valor, null));

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

                        if (lst_RegistrosNuevos != null && lst_RegistrosNuevos.Count > 0)
                        {
                            foreach (long lng_idSalas in lst_RegistrosNuevos)
                            {
                                if (!g_dct_Salas_RegistrosSeleccionados_Listado.ContainsKey(lng_idSalas))
                                {
                                    g_dct_Salas_RegistrosSeleccionados_Listado.Add(lng_idSalas, false);
                                }
                            }
                        }
                    }
                    else
                    {
                        foreach (long lng_idSala in _lst_id)
                        {
                            g_dct_Salas_RegistrosSeleccionados_Listado[lng_idSala] = false;
                            g_dct_Salas_RegistrosSeleccionados_Listado.Remove(lng_idSala);
                        }
                    }
                }
            }
            catch (Exception)
            { }
        }
        #endregion

        #region AgrupacionesTerminales
        #region Actualizar AgrupacionesTerminales desde Base datos
        public void Actualizar_AgrupacionesTerminales_Desde_BaseDatos()
        {
            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_Actualizar_AgrupacionesTerminales_Desde_BaseDatos.IsBusy)
                    Application.DoEvents();

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_Actualizar_AgrupacionesTerminales_Desde_BaseDatos.RunWorkerAsync();
            }
            catch (Exception)
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }
        }
        protected void TareaAsincrona_Actualizar_AgrupacionesTerminales_Desde_BaseDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Actualizo los registros de AgrupacionesTerminales de base de datos
                Obtener_AgrupacionesTerminales_BaseDatos();

                //Recargar el modelo
                if (g_mdl_INTERNO_HPV_Terminales_Modelo != null)
                {
                    INTERNO_HPV_Terminales_Modelo mdl_INTERNO_HPV_Terminales_Modelo = g_obj_HPV_Terminales_Datos.Obtener(g_mdl_INTERNO_HPV_Terminales_Modelo.id);

                    if (mdl_INTERNO_HPV_Terminales_Modelo != null)
                    {
                        g_mdl_INTERNO_HPV_Terminales_Modelo = mdl_INTERNO_HPV_Terminales_Modelo;
                    }
                }

                //Listado de AgrupacionesTerminales relacionados con la AgrupacionesTerminales
                if (g_mdl_INTERNO_HPV_Terminales_Modelo.AgrupacionesTerminales != null &&
                    g_mdl_INTERNO_HPV_Terminales_Modelo.AgrupacionesTerminales.Count > 0)
                {
                    foreach (HPV_AgrupacionesTerminales mdl_HPV_AgrupacionesTerminales in g_mdl_INTERNO_HPV_Terminales_Modelo.AgrupacionesTerminales)
                    {
                        g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Add(mdl_HPV_AgrupacionesTerminales.id, false);
                    }
                    Actualizar_AgrupacionesTerminales_BaseDatos_Seleccionados_Colectivo(g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Keys.ToList(), true);
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        protected void TareaAsincrona_Actualizar_AgrupacionesTerminales_Desde_BaseDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }

            if (!e.Cancelled)
            {
                //Rellenar Grid
                Rellenar_DataGridView_AgrupacionesTerminales_IncluirRegistros(g_frm_P_Terminal.Exferia_TextBox_AgrupacionesTerminales_IncluirRegistros_Busqueda.Text);
                Rellenar_DataGridView_AgrupacionesTerminales_RegistrosSeleccionados(g_frm_P_Terminal.Exferia_TextBox_AgrupacionesTerminales_RegistrosSeleccionados_Busqueda.Text);
            }
        }
        #endregion

        #region AgrupacionesTerminales Incluir Registros

        #region Rellenar DataGridView AgrupacionesTerminales Incluir Registros
        public void Rellenar_DataGridView_AgrupacionesTerminales_IncluirRegistros(string _str_filtro)
        {
            try
            {
                g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_IncluirRegistros = true;

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

                g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_IncluirRegistros = false;

                //Vaciar el Listado
                g_frm_P_Terminal.Exferia_DataGridView_AgrupacionesTerminales_IncluirRegistros_Listado.Rows.Clear();
                g_int_TotalRegistrosInsertados_AgrupacionesTerminales_IncluirRegistros = 0;
                g_frm_P_Terminal.Exferia_BarraProgreso_AgrupacionesTerminales_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Total = 0;
                g_frm_P_Terminal.Exferia_BarraProgreso_AgrupacionesTerminales_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_Terminal.Exferia_ComboBox_AgrupacionesTerminales_IncluirRegistros_Filtros.SelectedItem);
                lst_Argumentos.Add(g_frm_P_Terminal.Exferia_CheckBox_AgrupacionesTerminales_IncluirRegistros_MayusculasMinusculas.Checked);
                lst_Argumentos.Add(g_frm_P_Terminal.Exferia_CheckBox_AgrupacionesTerminales_IncluirRegistros_PalabraCompleta.Checked);

                //Orden Actual
                if (g_frm_P_Terminal.Exferia_ComboBox_AgrupacionesTerminales_IncluirRegistros_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)g_frm_P_Terminal.Exferia_ComboBox_AgrupacionesTerminales_IncluirRegistros_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                {
                    lst_Argumentos.Add(((INTERNO_ComboBox_Modelo)g_frm_P_Terminal.Exferia_ComboBox_AgrupacionesTerminales_IncluirRegistros_OrdenListado.SelectedItem).Identificador);
                }
                else
                {
                    lst_Argumentos.Add(g_obj_ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal_IncluirRegistros.ORDENACION_NOMBRECOLUMNA_PORDEFECTO());
                }

                //Lllamra a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros.RunWorkerAsync(lst_Argumentos);
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(Rellenar_DataGridView_AgrupacionesTerminales_IncluirRegistros));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_Terminal_Controladora) + "/" + nameof(Rellenar_DataGridView_AgrupacionesTerminales_IncluirRegistros));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_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_AgrupacionesTerminales_IncluirRegistros = null;

                //Filtrar #############################################
                if (str_Busqueda.Trim().Length > 0 || g_dct_ListadoFiltros_AgrupacionesTerminales_IncluirRegistros.Count > 0)
                {
                    g_lst_ListadoRegistros_Filtrados_AgrupacionesTerminales_IncluirRegistros = g_lst_AgrupacionesTerminales_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_AgrupacionesTerminales_IncluirRegistros)
                            {
                                //Palabra Completa
                                if (bol_PalabraCompleta)
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (bol_SensibilidadMayusMin)
                                    {
                                        lst_TodosFiltrado.AddRange(g_lst_ListadoRegistros_Filtrados_AgrupacionesTerminales_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_AgrupacionesTerminales_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_AgrupacionesTerminales_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_AgrupacionesTerminales_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_AgrupacionesTerminales_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_AgrupacionesTerminales_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_AgrupacionesTerminales_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_AgrupacionesTerminales_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_AgrupacionesTerminales_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_AgrupacionesTerminales_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_AgrupacionesTerminales_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_AgrupacionesTerminales_IncluirRegistros = g_lst_ListadoRegistros_Filtrados_AgrupacionesTerminales_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_AgrupacionesTerminales_IncluirRegistros != null && g_dct_ListadoFiltros_AgrupacionesTerminales_IncluirRegistros.Count > 0)
                    {
                        g_lst_ListadoRegistros_Filtrados_AgrupacionesTerminales_IncluirRegistros = Funciones_Listado.Filtrar_Listado(g_lst_ListadoRegistros_Filtrados_AgrupacionesTerminales_IncluirRegistros, g_obj_ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal_IncluirRegistros, g_dct_ListadoFiltros_AgrupacionesTerminales_IncluirRegistros);
                    }
                }
                else
                {
                    g_lst_ListadoRegistros_Filtrados_AgrupacionesTerminales_IncluirRegistros = g_lst_AgrupacionesTerminales_ListadoRegistros;
                }
                //#####################################################

                if (g_lst_ListadoRegistros_Filtrados_AgrupacionesTerminales_IncluirRegistros != null)
                {

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

                    g_frm_P_Terminal.Listado_AgrupacionesTerminales_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_obj_ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal_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_frm_P_Terminal.Exferia_BarraProgreso_AgrupacionesTerminales_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Total = g_lst_ListadoRegistros_Filtrados_AgrupacionesTerminales_IncluirRegistros.Count;

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

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

                        //Llamar al Progress
                        g_int_TotalRegistrosInsertados_AgrupacionesTerminales_IncluirRegistros += 1;

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

                        //Application.DoEvents();
                        Thread.Sleep(1);
                    }

                }
            }
            catch (ThreadAbortException ex)
            {
                g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_IncluirRegistros = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_IncluirRegistros = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_IncluirRegistros = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                g_frm_P_Terminal.Exferia_DataGridView_AgrupacionesTerminales_IncluirRegistros_Listado.Rows.Add((object[])e.UserState);

                g_frm_P_Terminal.Exferia_BarraProgreso_AgrupacionesTerminales_IncluirRegistros_BarraProgreso.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_AgrupacionesTerminales_IncluirRegistros;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_IncluirRegistros_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }
        #endregion

        #region Marcar/Desmarcar
        public void AgrupacionesTerminales_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_AgrupacionesTerminales_MarcarDesmarcar_IncluirRegistros = true;

                //Si se estaba ejecutando lo paro
                while (g_obj_TareaAsincrona_AgrupacionesTerminales_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_AgrupacionesTerminales_MarcarDesmarcar_IncluirRegistros.RunWorkerAsync(lst_Argumentos);
            }
            catch (Exception)
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
            }

        }
        protected void TareaAsincrona_AgrupacionesTerminales_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_obj_ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal_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_AgrupacionesTerminales_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_AgrupacionesTerminales_IncluirRegistros.Select(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m)).Cast<long>().ToList();
                }

                Actualizar_AgrupacionesTerminales_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_AgrupacionesTerminales_MarcarDesmarcar_IncluirRegistros_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }

            g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_MarcarDesmarcar_IncluirRegistros = false;

            if ((bool)e.Result)
            {
                Rellenar_DataGridView_AgrupacionesTerminales_IncluirRegistros(g_frm_P_Terminal.Exferia_TextBox_AgrupacionesTerminales_IncluirRegistros_Busqueda.Text);
                Rellenar_DataGridView_AgrupacionesTerminales_RegistrosSeleccionados(g_frm_P_Terminal.Exferia_TextBox_AgrupacionesTerminales_RegistrosSeleccionados_Busqueda.Text);
            }

        }
        #endregion

        #endregion

        #region AgrupacionesTerminales Registros Seleccionados

        #region Rellenar DataGridView AgrupacionesTerminales Registros Seleccionados
        public void Rellenar_DataGridView_AgrupacionesTerminales_RegistrosSeleccionados(string _str_filtro)
        {
            try
            {
                g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_RegistrosSeleccionados = true;

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

                g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_RegistrosSeleccionados = false;

                //Vaciar el Listado
                g_frm_P_Terminal.Exferia_DataGridView_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Rows.Clear();
                g_int_TotalRegistrosInsertados_AgrupacionesTerminales_RegistrosSeleccionados = 0;
                g_frm_P_Terminal.Exferia_BarraProgreso_AgrupacionesTerminales_RegistrosSeleccionados_BarraProgreso.Exferia_BarraProgreso_Total = 0;
                g_frm_P_Terminal.Exferia_BarraProgreso_AgrupacionesTerminales_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_Terminal.Exferia_ComboBox_AgrupacionesTerminales_RegistrosSeleccionados_Filtros.SelectedItem);
                lst_Argumentos.Add(g_frm_P_Terminal.Exferia_CheckBox_AgrupacionesTerminales_RegistrosSeleccionados_MayusculasMinusculas.Checked);
                lst_Argumentos.Add(g_frm_P_Terminal.Exferia_CheckBox_AgrupacionesTerminales_RegistrosSeleccionados_PalabraCompleta.Checked);

                //Orden Actual
                if (g_frm_P_Terminal.Exferia_ComboBox_AgrupacionesTerminales_RegistrosSeleccionados_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)g_frm_P_Terminal.Exferia_ComboBox_AgrupacionesTerminales_RegistrosSeleccionados_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                {
                    lst_Argumentos.Add(((INTERNO_ComboBox_Modelo)g_frm_P_Terminal.Exferia_ComboBox_AgrupacionesTerminales_RegistrosSeleccionados_OrdenListado.SelectedItem).Identificador);
                }
                else
                {
                    lst_Argumentos.Add(g_obj_ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal.ORDENACION_NOMBRECOLUMNA_PORDEFECTO());
                }

                //Lllamra a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados.RunWorkerAsync(lst_Argumentos);
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(Rellenar_DataGridView_AgrupacionesTerminales_RegistrosSeleccionados));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_Terminal_Controladora) + "/" + nameof(Rellenar_DataGridView_AgrupacionesTerminales_RegistrosSeleccionados));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                string str_NombreCampoClave = "id";
                INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal.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_AgrupacionesTerminales_ListadoRegistros != null &&
                    g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado != null &&
                    g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Count > 0)
                {
                    //Busco registro listado en memoria
                    lst_ListadoRegistros_RegistrosSeleccionados = g_lst_AgrupacionesTerminales_ListadoRegistros.Where(m => m.GetType().GetProperty(str_NombreCampoClave).GetValue(m, null) != null && g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Keys.ToList().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_AgrupacionesTerminales_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_AgrupacionesTerminales_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_AgrupacionesTerminales_RegistrosSeleccionados != null && g_dct_ListadoFiltros_AgrupacionesTerminales_RegistrosSeleccionados.Count > 0)
                        {
                            lst_ListadoRegistros_Filtrados = Funciones_Listado.Filtrar_Listado(lst_ListadoRegistros_Filtrados, g_obj_ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal, g_dct_ListadoFiltros_AgrupacionesTerminales_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_Terminal.Exferia_Button_AgrupacionesTerminales_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_Terminal.Listado_AgrupacionesTerminales_RegistrosSeleccionados_Ordenar_DataGridView();

                        //Guadar el listado .......................................................................................
                        g_frm_P_Terminal.Exferia_BarraProgreso_AgrupacionesTerminales_RegistrosSeleccionados_BarraProgreso.Exferia_BarraProgreso_Total = lst_ListadoRegistros_Filtrados.Count;

                        object[] row;
                        long lng_idAgrupacionTerminal = -1;
                        foreach (dynamic obj_Dinamico in lst_ListadoRegistros_Filtrados)
                        {
                            //Se Cancelo la tarea asincrona ---------------------------
                            if (g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_RegistrosSeleccionados)
                            {
                                return;
                            }

                            lng_idAgrupacionTerminal = obj_Dinamico.GetType().GetProperty(str_NombreCampoClave).GetValue(obj_Dinamico, null);

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

                            //Llamar al Progress
                            g_int_TotalRegistrosInsertados_AgrupacionesTerminales_RegistrosSeleccionados += 1;

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

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_RegistrosSeleccionados = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_RegistrosSeleccionados = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                g_frm_P_Terminal.Exferia_DataGridView_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Rows.Add((object[])e.UserState);

                g_frm_P_Terminal.Exferia_BarraProgreso_AgrupacionesTerminales_RegistrosSeleccionados_BarraProgreso.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_AgrupacionesTerminales_RegistrosSeleccionados;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_AgrupacionesTerminales_RegistrosSeleccionados_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }
        #endregion

        #region Vaciar Registros Seleccionados
        public void Vaciar_AgrupacionesTerminales_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_AgrupacionesTerminales_RegistrosSeleccionados = true;

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


                g_lst_AgrupacionesTerminales_RegistrosSeleccionados_AVaciar = _lst_ids_ABorrar;

                //Empezar TareaAsincrona
                g_obj_TareaAsincrona_Vaciar_AgrupacionesTerminales_RegistrosSeleccionados.RunWorkerAsync();
            }
            catch (Exception)
            {
                g_bol_CancelarTareaAsincrona_Vaciar_AgrupacionesTerminales_RegistrosSeleccionados = false;

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

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

            try
            {
                Actualizar_AgrupacionesTerminales_BaseDatos_Seleccionados_Colectivo(g_lst_AgrupacionesTerminales_RegistrosSeleccionados_AVaciar, false);
            }
            catch (ThreadAbortException)
            {
                bol_TerminoCorrectamente = false;
            }
            catch (Exception)
            {
                bol_TerminoCorrectamente = false;
            }
            finally
            {
                e.Result = bol_TerminoCorrectamente;
            }
        }
        protected void TareaAsincrona_Vaciar_AgrupacionesTerminales_RegistrosSeleccionados_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            g_bol_CancelarTareaAsincrona_Vaciar_AgrupacionesTerminales_RegistrosSeleccionados = false;

            try
            {
                if ((bool)e.Result)
                {
                    string str_NombreCampoClave = "id";
                    INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal.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_Terminal.Exferia_DataGridView_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Rows
                            .Cast<DataGridViewRow>()
                            .ToList()
                            .Where(r => g_lst_AgrupacionesTerminales_RegistrosSeleccionados_AVaciar.Contains(long.Parse(r.Cells[str_NombreCampoClave].Value.ToString()))).ToList().ForEach(m => g_frm_P_Terminal.Exferia_DataGridView_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Rows.Remove(m));

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

        #endregion

        public void Actualizar_AgrupacionesTerminales_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_obj_ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal_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_AgrupacionesTerminales_ListadoRegistros[g_lst_AgrupacionesTerminales_ListadoRegistros.IndexOf(g_lst_AgrupacionesTerminales_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(nameof(INTERNO_HPV_AgrupacionesTerminales_Listado_Modelo.Seleccionar)).SetValue(dnm_Registro, _bol_Valor, null);


                    //Modificar listado en memoria
                    g_lst_AgrupacionesTerminales_ListadoRegistros[g_lst_AgrupacionesTerminales_ListadoRegistros.IndexOf(g_lst_AgrupacionesTerminales_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_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.ContainsKey(_lng_id))
                    {
                        g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Add(_lng_id, false);
                    }
                }
                else
                {
                    if (g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.ContainsKey(_lng_id))
                    {
                        g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado[_lng_id] = false;
                        g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Remove(_lng_id);
                    }
                }

                Rellenar_DataGridView_AgrupacionesTerminales_RegistrosSeleccionados(g_frm_P_Terminal.Exferia_TextBox_AgrupacionesTerminales_RegistrosSeleccionados_Busqueda.Text);
            }
            catch (Exception)
            { }
        }
        public void Actualizar_AgrupacionesTerminales_BaseDatos_Seleccionados_Colectivo(List<long> _lst_id, bool _bol_Valor)
        {
            try
            {
                if (g_lst_AgrupacionesTerminales_ListadoRegistros != null)
                {
                    //Buscar el Campo Clave
                    string str_NombreCampoClave = "id";
                    INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo = g_obj_ABS_Listado_HPV_AgrupacionesTerminales_P_Terminal_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_AgrupacionesTerminales_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(nameof(INTERNO_HPV_AgrupacionesTerminales_Listado_Modelo.Seleccionar)).SetValue(x, _bol_Valor, null));

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

                        if (lst_RegistrosNuevos != null && lst_RegistrosNuevos.Count > 0)
                        {
                            foreach (long lng_idAgrupacionesTerminales in lst_RegistrosNuevos)
                            {
                                if (!g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.ContainsKey(lng_idAgrupacionesTerminales))
                                {
                                    g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Add(lng_idAgrupacionesTerminales, false);
                                }
                            }
                        }
                    }
                    else
                    {
                        foreach (long lng_idAgrupacionesTerminales in _lst_id)
                        {
                            g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado[lng_idAgrupacionesTerminales] = false;
                            g_dct_AgrupacionesTerminales_RegistrosSeleccionados_Listado.Remove(lng_idAgrupacionesTerminales);
                        }
                    }
                }
            }
            catch (Exception)
            { }
        }
        #endregion

        #region CodigoValidacion
        public void CodigoValidacion_CambiarTexto()
        {
            if (g_frm_P_Terminal.Exferia_TextBox_CodigoValidacion.Text.Trim().Length>0)
            {
                if (g_bol_CodigoValidacionUtilizado)
                {
                    g_frm_P_Terminal.Exferia_Label_SinColor_CodigoValidacionNoUtilizado.Text = "YA UTILIZADO";
                    g_frm_P_Terminal.Exferia_Label_SinColor_CodigoValidacionNoUtilizado.ForeColor = Colores.G_COLOR_LETRA_INCORRECTO;
                }
                else
                {
                    g_frm_P_Terminal.Exferia_Label_SinColor_CodigoValidacionNoUtilizado.Text = "NO UTILIZADO";
                    g_frm_P_Terminal.Exferia_Label_SinColor_CodigoValidacionNoUtilizado.ForeColor = Colores.G_COLOR_LETRA_CORRECTO;
                }
            }
            else
            {
                g_frm_P_Terminal.Exferia_Label_SinColor_CodigoValidacionNoUtilizado.Text = "";
            }
        }

        public void CodigoValidacion_Actualizar(string _str_CodigoValidacion,bool _bol_CodigoValidacionUtilizado)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_HPV_Terminales_Datos.Actualizar_CodigoValidacion(g_mdl_INTERNO_HPV_Terminales_Modelo.id, _bol_CodigoValidacionUtilizado, _str_CodigoValidacion);

                if (!mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo.Mensaje);
                }
                else
                {
                    g_frm_P_Terminal.Exferia_TextBox_CodigoValidacion.Text = _str_CodigoValidacion;
                    g_bol_CodigoValidacionUtilizado = _bol_CodigoValidacionUtilizado;
                    CodigoValidacion_CambiarTexto();
                }
            }
            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_Terminal_Controladora) + "/" + nameof(CodigoValidacion_Actualizar));

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

        #region Rellenar DataGridView 
        public void Rellenar_DataGridView_CodigosValidacion_Historicos()
        {
            try
            {
                while (g_obj_TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos.IsBusy)
                    Application.DoEvents();

                //Vaciar el Listado
                g_frm_P_Terminal.Exferia_DataGridView_CodigosValidacion.Rows.Clear();

                //Llamra a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos.RunWorkerAsync();
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(Rellenar_DataGridView_CodigosValidacion_Historicos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_Terminal_Controladora) + "/" + nameof(Rellenar_DataGridView_CodigosValidacion_Historicos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                if (g_lst_HPV_Terminales_ValidacionesHistorico != null)
                {

                    //Ascendente
                    g_lst_HPV_Terminales_ValidacionesHistorico = g_lst_HPV_Terminales_ValidacionesHistorico.OrderByDescending(m => m.fechaHora).ToList();
                    //#####################################
                        
                    foreach (HPV_Terminales_ValidacionesHistorico mdl_HPV_Terminales_ValidacionesHistorico in g_lst_HPV_Terminales_ValidacionesHistorico)
                    {
                        //Se Cancelo la tarea asincrona ---------------------------
                        if (g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_RegistrosSeleccionados)
                        {
                            return;
                        }

                        ((BackgroundWorker)sender).ReportProgress(1, Transformar_Modelo_A_Row_ClavesTemporales(mdl_HPV_Terminales_ValidacionesHistorico,null));

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_RegistrosSeleccionados = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_CancelarTareaAsincrona_AgrupacionesTerminales_RegistrosSeleccionados = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Terminal_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                g_frm_P_Terminal.Exferia_DataGridView_CodigosValidacion.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_CodigosValidacion_Historicos_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }

        public DataGridViewRow Transformar_Modelo_A_Row_ClavesTemporales(HPV_Terminales_ValidacionesHistorico _mdl_HPV_Terminales_ValidacionesHistorico, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Terminal.Exferia_DataGridView_CodigosValidacion.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Terminal.Exferia_DataGridView_CodigosValidacion);
            }

            obj_DataGridViewRow.Cells[0].Value = _mdl_HPV_Terminales_ValidacionesHistorico.id;
            obj_DataGridViewRow.Cells[1].Value = _mdl_HPV_Terminales_ValidacionesHistorico.clave;
            obj_DataGridViewRow.Cells[2].Value = _mdl_HPV_Terminales_ValidacionesHistorico.fechaHora.ToString("dd/MM/yyyy HH:mm");
            obj_DataGridViewRow.Cells[3].Value = _mdl_HPV_Terminales_ValidacionesHistorico.MAC;

            return obj_DataGridViewRow;
        }

        #endregion

        #endregion

    }
}
