using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Generales;
using Exferia_Aplicacion.Sincronizacion;
using Exferia_Formularios;
using Exferia_Mythos._0_Modelos;
using Exferia_Mythos._1_Datos;
using Exferia_Mythos._3_Vistas.Listados;
using Exferia_Mythos.General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_Mythos._3_Vistas.Controladoras
{
    public class P_Visor_Controladora
    {
        #region Variables Generales
        private P_Visor g_frm_P_Visor = null;//Variable que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando = null;

        //Clases
        private MYT_Tecnicos_Datos g_obj_MYT_Tecnicos_Datos = new MYT_Tecnicos_Datos();
        private MYT_Partes_Datos g_obj_MYT_Partes_Datos = new MYT_Partes_Datos();
        
        #region Tecnicos

        //Tarea Asincrona para Rellenar los listado de Tecnicos en memoria
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos_Continua_Tecnicos = null;
        private bool g_bol_TareaAsincrona_CargarDatos_Continua_Tecnicos_EJECUTANDOSE = false;

        private INTERNO_OrdenarDataGridView_Columnas g_obj_INTERNO_OrdenarDataGridView_Columnas_TECNICOS = null;

        //Tarea Asincrona para la Rellenar DataGridView de Tecnicos
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid_Tecnicos = null;
        private bool g_bol_TareaAsincrona_Rellenar_DataGrid_Tecnicos_CANCELAR = false;

        //Listado de Tecnicos
        public List<INTERNO_MYT_Tecnicos_Listado_Modelo> g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo = null;

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

        //Para el filtrado del listado de Tecnicos
        public ABS_Listado_MYT_Tecnicos_P_Visor g_obj_ABS_Listado_MYT_Tecnicos_P_Visor = new ABS_Listado_MYT_Tecnicos_P_Visor();
        private int g_int_TotalRegistrosInsertados_Tecnicos = 0;
        private int g_int_TotalRegistros_Tecnicos = 0;

        #endregion

        #region Partes No Asignados
        //Tarea Asincrona para Rellenar los listado de PartesNoAsignados en memoria
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos_Continua_PartesNoAsignados = null;
        private bool g_bol_TareaAsincrona_CargarDatos_Continua_PartesNoAsignados_EJECUTANDOSE = false;

        private List<INTERNO_MYT_Partes_Listado_Modelo> g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados = null;

        //Tarea Asincrona para la Rellenar DataGridView de PartesNoAsignados
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados;
        public bool g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados = false;

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

        //Filtrado del Listado de Incluir Registros
        public List<string> g_lst_ColumnasAMostrar_PartesNoAsignados = new List<string>();
        public ABS_Listado_MYT_Partes_NoAsignados_P_Visor g_obj_ABS_Listado_MYT_Partes_NoAsignados_P_Visor = new ABS_Listado_MYT_Partes_NoAsignados_P_Visor();
        public Dictionary<string, object> g_dct_ListadoFiltros_PartesNoAsignados = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_PartesNoAsignados = 0;
        private int g_int_TotalRegistros_PartesNoAsignados = 0;
        public List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_Filtros_PartesNoAsignados = new List<INTERNO_ComboBox_Modelo>();
        #endregion

        #region Partes RestoPartes
        public string g_str_Estado_Seleccionado = "";

        //Tarea Asincrona para Rellenar los listado de RestoPartes en memoria
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos_Continua_RestoPartes = null;
        private bool g_bol_TareaAsincrona_CargarDatos_Continua_RestoPartes_EJECUTANDOSE = false;

        private List<INTERNO_MYT_Partes_Listado_Modelo> g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes = null;

        //Tarea Asincrona para la Rellenar DataGridView de RestoPartes
        private BackgroundWorker g_obj_TareaAsincrona_Rellenar_DataGrid_RestoPartes;
        public bool g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_RestoPartes = false;

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

        //Filtrado del Listado de Incluir Registros
        public List<string> g_lst_ColumnasAMostrar_RestoPartes = new List<string>();
        public ABS_Listado_MYT_Partes_RestoPartes_P_Visor g_obj_ABS_Listado_MYT_Partes_RestoPartes_P_Visor = new ABS_Listado_MYT_Partes_RestoPartes_P_Visor();
        public Dictionary<string, object> g_dct_ListadoFiltros_RestoPartes = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_RestoPartes = 0;
        private int g_int_TotalRegistros_RestoPartes = 0;
        public List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_Filtros_RestoPartes = new List<INTERNO_ComboBox_Modelo>();
        #endregion

        #endregion

        #region Constructor
        public P_Visor_Controladora(P_Visor _frm_P_Visor)
        {
            g_frm_P_Visor = _frm_P_Visor;

            //Ordenacion del datagridView Tecnicos
            g_obj_INTERNO_OrdenarDataGridView_Columnas_TECNICOS = new INTERNO_OrdenarDataGridView_Columnas( 1,
                                                                                                            SortOrder.Ascending,
                                                                                                            2,
                                                                                                            SortOrder.Ascending);
        }
        #endregion

        #region CARGAR DATOS INICIAL
        public void CargarDatos_Inicial()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que se termine
                g_frm_P_Visor.Enabled = false;

                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                BackgroundWorker obj_TareaAsincrona_CargarDatos_Inicial = new BackgroundWorker();
                obj_TareaAsincrona_CargarDatos_Inicial.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_Inicial_DoWork);
                obj_TareaAsincrona_CargarDatos_Inicial.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Inicial_Completed);
                obj_TareaAsincrona_CargarDatos_Inicial.WorkerReportsProgress = false;


                //Tarea Asincrona cargar datos###############################################################
                obj_TareaAsincrona_CargarDatos_Inicial.RunWorkerAsync();
                //###########################################################################################

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_Visor.Enabled = true;
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                throw new Control_Errores("", ex, nameof(P_Visor_Controladora) + "/" + nameof(CargarDatos_Inicial), true);
            }
        }

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

            try
            {
                //Obtener Tecnicos
                g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo=g_obj_MYT_Tecnicos_Datos.Obtener_Para_Visor();

                //Obtener Partes No Asignados
                g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados = g_obj_MYT_Partes_Datos.Obtener_Para_Visor_PartesNoAsignados();

                //Obtener Partes RestoPartes
                g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes = g_obj_MYT_Partes_Datos.Obtener_Para_Visor_PartesAsignados();


            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Inicial_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Inicial_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargarDatos_Inicial_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_Visor.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);
                        g_frm_P_Visor.Salir_P_Base();
                    }
                }
                else
                {
                    //Rellenar DataGridView Tecnicos
                    Rellenar_DataGrid_Tecnicos("");

                    //Rellenar DataGridView PartesNoAsignados
                    Rellenar_DataGrid_PartesNoAsignados("");

                    //Rellenar DataGridView RestoPartes
                    Rellenar_DataGrid_RestoPartes("");

                    //CargarDatos_Continua_Tecnicos
                    g_frm_P_Visor.g_timer_CargarDatos_Continua_Tecnicos.Start();

                    //CargarDatos_Continua_PartesNoAsignados
                    g_frm_P_Visor.g_timer_CargarDatos_Continua_PartesNoAsignados.Start();

                    //CargarDatos_Continua_RestoPartes
                    g_frm_P_Visor.g_timer_CargarDatos_Continua_RestoPartes.Start();
                }
                
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Inicial_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Visor.Salir_P_Base();
            }
        }
        #endregion

        #region TECNICOS
        #region Cargar Datos Continua Tecnicos
        public void CargarDatos_Continua_Tecnicos(string _str_Buscar)
        {
            try
            {
                if (g_bol_TareaAsincrona_CargarDatos_Continua_Tecnicos_EJECUTANDOSE == false)
                {
                    g_bol_TareaAsincrona_CargarDatos_Continua_Tecnicos_EJECUTANDOSE = true;

                    if (g_obj_TareaAsincrona_CargarDatos_Continua_Tecnicos == null)
                    {
                        g_obj_TareaAsincrona_CargarDatos_Continua_Tecnicos = new BackgroundWorker();
                        g_obj_TareaAsincrona_CargarDatos_Continua_Tecnicos.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_Continua_Tecnicos_DoWork);
                        g_obj_TareaAsincrona_CargarDatos_Continua_Tecnicos.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargarDatos_Continua_Tecnicos_ProgressChanged);
                        g_obj_TareaAsincrona_CargarDatos_Continua_Tecnicos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Continua_Tecnicos_Completed);
                        g_obj_TareaAsincrona_CargarDatos_Continua_Tecnicos.WorkerReportsProgress = true;
                    }

                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_str_Buscar);
                    lst_Argumentos.Add(g_frm_P_Visor.Exferia_CheckBox_Tecnicos_PalabraCompleta.Checked);
                    lst_Argumentos.Add(g_frm_P_Visor.Exferia_CheckBox_Tecnicos_MayusculasMinusculas.Checked);

                    //Tarea Asincrona ###############################################################
                    g_obj_TareaAsincrona_CargarDatos_Continua_Tecnicos.RunWorkerAsync(lst_Argumentos);
                    //###########################################################################################
                }
            }
            catch (Exception ex)
            {
                g_bol_TareaAsincrona_CargarDatos_Continua_Tecnicos_EJECUTANDOSE = false;
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(CargarDatos_Continua_Tecnicos));
            }
        }

        private void TareaAsincrona_CargarDatos_Continua_Tecnicos_DoWork(object sender, DoWorkEventArgs e)
        {
            bool bol_Ordenar_DataGridView = false;

            try
            {
                //Argumentos
                List<object> lst_Argumentos = (List<object>)e.Argument;
                string str_Buscar = (string)lst_Argumentos[0];
                bool bol_PalabraCompleta = (bool)lst_Argumentos[1];
                bool bol_MayusculasMinusculas = (bool)lst_Argumentos[2];


                //Obtener Listado Tecnicos
                List<INTERNO_MYT_Tecnicos_Listado_Modelo> lst_INTERNO_MYT_Tecnicos_Listado_Modelo = g_obj_MYT_Tecnicos_Datos.Obtener_Para_Visor();
                if (lst_INTERNO_MYT_Tecnicos_Listado_Modelo==null)
                {
                    lst_INTERNO_MYT_Tecnicos_Listado_Modelo = new List<INTERNO_MYT_Tecnicos_Listado_Modelo>();
                }

                #region Tecnicos a Borrar
                if (g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo!=null && g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo.Count>0)
                {
                    List<long> lst_idTecnico_ABorrar = g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo.Where(m => !lst_INTERNO_MYT_Tecnicos_Listado_Modelo.Select(x=>x.id).ToList().Contains(m.id)).Select(a=>a.id).ToList();

                    if (lst_idTecnico_ABorrar!=null && lst_idTecnico_ABorrar.Count>0)
                    {
                        //Borrar del Listado General
                        g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo.RemoveAll(m => lst_idTecnico_ABorrar.Contains(m.id));

                        //Borrar del DataGridView
                        List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Visor.Exferia_DataGridView_Tecnicos.Rows
                                                                                            .Cast<DataGridViewRow>()
                                                                                            .Where(r => lst_idTecnico_ABorrar.Contains(long.Parse(r.Cells[nameof(INTERNO_MYT_Tecnicos_Listado_Modelo.id)].Value.ToString()))).ToList();

                        if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                        {
                            //Borrar del Grid
                            foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                            {
                                //Borrar del DataGridView
                                ((BackgroundWorker)sender).ReportProgress(1, dgvr_Borrar);
                            }

                            //Barra de Progreso
                            g_int_TotalRegistros_Tecnicos -= lst_DataGridViewRow.Count;
                            g_int_TotalRegistrosInsertados_Tecnicos -= lst_DataGridViewRow.Count;

                            //Actualizar barra de Progreso
                            ((BackgroundWorker)sender).ReportProgress(4);
                        }
                    }
                }
                #endregion

                List<INTERNO_MYT_Tecnicos_Listado_Modelo> lst_Tecnicos_ActualizarOInsertar_DataGridView = new List<INTERNO_MYT_Tecnicos_Listado_Modelo>();
                #region Tecnicos a Insertar
                if (lst_INTERNO_MYT_Tecnicos_Listado_Modelo != null && lst_INTERNO_MYT_Tecnicos_Listado_Modelo.Count > 0)
                {
                    if (g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo==null)
                    {
                        g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo = new List<INTERNO_MYT_Tecnicos_Listado_Modelo>();
                    }

                    //Insertar los que no existan
                    List<INTERNO_MYT_Tecnicos_Listado_Modelo> lst_idTecnicos_AInsertar = lst_INTERNO_MYT_Tecnicos_Listado_Modelo.Where(m => !g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo.Select(x=>x.id).ToList().Contains(m.id)).ToList();
                    if (lst_idTecnicos_AInsertar != null && lst_idTecnicos_AInsertar.Count > 0)
                    {
                        //Insertar en el listado general
                        g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo.AddRange(lst_idTecnicos_AInsertar);

                        //Añadir al listado final
                        lst_Tecnicos_ActualizarOInsertar_DataGridView.AddRange(lst_idTecnicos_AInsertar);
                    }
                }
                #endregion

                #region Tecnicos a Actualizar
                if (lst_INTERNO_MYT_Tecnicos_Listado_Modelo != null && lst_INTERNO_MYT_Tecnicos_Listado_Modelo.Count > 0)
                {
                    foreach (INTERNO_MYT_Tecnicos_Listado_Modelo mdl_INTERNO_MYT_Tecnicos_Listado_Modelo_ACTUALIZAR in lst_INTERNO_MYT_Tecnicos_Listado_Modelo)
                    {
                        INTERNO_MYT_Tecnicos_Listado_Modelo mdl_INTERNO_MYT_Tecnicos_Listado_Modelo=g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo.Where(m => m.id == mdl_INTERNO_MYT_Tecnicos_Listado_Modelo_ACTUALIZAR.id).FirstOrDefault();
                        
                        //Nombre Diferente
                        if (mdl_INTERNO_MYT_Tecnicos_Listado_Modelo!=null &&
                            !mdl_INTERNO_MYT_Tecnicos_Listado_Modelo.nombre.Equals(mdl_INTERNO_MYT_Tecnicos_Listado_Modelo_ACTUALIZAR.nombre))
                        {
                            g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo[g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo.IndexOf(mdl_INTERNO_MYT_Tecnicos_Listado_Modelo)] = mdl_INTERNO_MYT_Tecnicos_Listado_Modelo_ACTUALIZAR;

                            //Añadir al listado final
                            lst_Tecnicos_ActualizarOInsertar_DataGridView.Add(mdl_INTERNO_MYT_Tecnicos_Listado_Modelo_ACTUALIZAR);
                        }
                    }
                }
                #endregion

                #region Tecnicos Actualizar DataGridView
                if (lst_Tecnicos_ActualizarOInsertar_DataGridView!=null && 
                    lst_Tecnicos_ActualizarOInsertar_DataGridView.Count>0)
                {
                    bol_Ordenar_DataGridView = true;

                    //FILTRAR
                    lst_Tecnicos_ActualizarOInsertar_DataGridView = Tecnicos_Filtrar(lst_Tecnicos_ActualizarOInsertar_DataGridView, str_Buscar, bol_PalabraCompleta, bol_MayusculasMinusculas);

                    if (lst_Tecnicos_ActualizarOInsertar_DataGridView != null &&
                        lst_Tecnicos_ActualizarOInsertar_DataGridView.Count > 0)
                    {
                        foreach (INTERNO_MYT_Tecnicos_Listado_Modelo mdl_INTERNO_MYT_Tecnicos_Listado_Modelo in lst_Tecnicos_ActualizarOInsertar_DataGridView)
                        {

                            //Borrar del DataGridView
                            DataGridViewRow dgv_Fila = g_frm_P_Visor.Exferia_DataGridView_Tecnicos.Rows
                                                                                                .Cast<DataGridViewRow>()
                                                                                                .Where(r => mdl_INTERNO_MYT_Tecnicos_Listado_Modelo.id == (long.Parse(r.Cells[nameof(INTERNO_MYT_Tecnicos_Listado_Modelo.id)].Value.ToString()))).FirstOrDefault();

                            //Actualizar
                            if (dgv_Fila != null)
                            {
                                //Añadir al DataGridView
                                Transformar_Modelo_A_Row_Tecnicos(mdl_INTERNO_MYT_Tecnicos_Listado_Modelo, dgv_Fila);
                            }
                            //Insertar
                            else
                            {
                                //Añadir al DataGridView
                                ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_Tecnicos(mdl_INTERNO_MYT_Tecnicos_Listado_Modelo, null));

                                //Añadir al DataGridView
                                g_int_TotalRegistros_Tecnicos += 1;
                                g_int_TotalRegistrosInsertados_Tecnicos += 1;

                                //Actualizar barra de Progreso
                                ((BackgroundWorker)sender).ReportProgress(4);
                            }
                        }
                    }
                }
                #endregion

            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Continua_Tecnicos_DoWork));
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Continua_Tecnicos_DoWork));
            }
            e.Result = bol_Ordenar_DataGridView;
        }
        private void TareaAsincrona_CargarDatos_Continua_Tecnicos_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (!g_frm_P_Visor.IsDisposed)
                {
                    //Borrar Registro DataGridView
                    if (e.ProgressPercentage==1)
                    {
                        g_frm_P_Visor.Exferia_DataGridView_Tecnicos.Rows.Remove((DataGridViewRow)e.UserState);
                    }
                    //Insertar Registro DataGridView
                    else if (e.ProgressPercentage == 2)
                    {
                        g_frm_P_Visor.Exferia_DataGridView_Tecnicos.Rows.Add((DataGridViewRow)e.UserState);
                    }
                    //Actualizar Barra de Progreso
                    else if (e.ProgressPercentage == 4)
                    {
                        g_frm_P_Visor.Exferia_BarraProgreso_Tecnicos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Tecnicos;
                        g_frm_P_Visor.Exferia_BarraProgreso_Tecnicos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Tecnicos;
                    }
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_CargarDatos_Continua_Tecnicos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                //ordenar el Listado de Tecnicos
                if (e.Result!=null && 
                    ((bool)e.Result))
                {
                    g_frm_P_Visor.Exferia_DataGridView_Tecnicos.Sort(g_obj_INTERNO_OrdenarDataGridView_Columnas_TECNICOS);

                }
            }
            catch(Exception)
            {}
            finally
            {
                g_bol_TareaAsincrona_CargarDatos_Continua_Tecnicos_EJECUTANDOSE = false;
            }
           
        }
        #endregion

        #region Rellenar DataGrid Tecnicos
        public void Rellenar_DataGrid_Tecnicos(string _str_Buscar)
        {
            try
            {
                if (g_obj_TareaAsincrona_Rellenar_DataGrid_Tecnicos!=null)
                {
                    g_bol_TareaAsincrona_Rellenar_DataGrid_Tecnicos_CANCELAR = true;
                    while (g_obj_TareaAsincrona_Rellenar_DataGrid_Tecnicos.IsBusy)
                    {
                        Application.DoEvents();
                    }
                }
                else
                {
                    g_obj_TareaAsincrona_Rellenar_DataGrid_Tecnicos = new BackgroundWorker();
                    g_obj_TareaAsincrona_Rellenar_DataGrid_Tecnicos.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Tecnicos_DoWork);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_Tecnicos.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Tecnicos_ProgressChanged);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_Tecnicos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Tecnicos_Completed);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_Tecnicos.WorkerReportsProgress = true;
                    g_obj_TareaAsincrona_Rellenar_DataGrid_Tecnicos.WorkerSupportsCancellation = true;
                }

                g_bol_TareaAsincrona_Rellenar_DataGrid_Tecnicos_CANCELAR = false;

                //Vaciar el Listado
                g_frm_P_Visor.Exferia_DataGridView_Tecnicos.Rows.Clear();
                g_int_TotalRegistrosInsertados_Tecnicos = 0;
                g_int_TotalRegistros_Tecnicos = 0;
                g_frm_P_Visor.Exferia_BarraProgreso_Tecnicos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Tecnicos;
                g_frm_P_Visor.Exferia_BarraProgreso_Tecnicos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Tecnicos;

                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_str_Buscar);
                lst_Argumentos.Add(g_frm_P_Visor.Exferia_CheckBox_Tecnicos_PalabraCompleta.Checked);
                lst_Argumentos.Add(g_frm_P_Visor.Exferia_CheckBox_Tecnicos_MayusculasMinusculas.Checked);

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_Rellenar_DataGrid_Tecnicos.RunWorkerAsync(lst_Argumentos);
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(Rellenar_DataGrid_Tecnicos));
            }
        }

        private void TareaAsincrona_Rellenar_DataGrid_Tecnicos_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Argumentos
                List<object> lst_Argumentos = (List<object>)e.Argument;
                string str_Buscar = (string)lst_Argumentos[0];
                bool bol_PalabraCompleta = (bool)lst_Argumentos[1];
                bool bol_MayusculasMinusculas = (bool)lst_Argumentos[2];

                List<INTERNO_MYT_Tecnicos_Listado_Modelo> lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final = new List<INTERNO_MYT_Tecnicos_Listado_Modelo>();

                #region Agregar Todos
                INTERNO_MYT_Tecnicos_Listado_Modelo mdl_INTERNO_MYT_Tecnicos_Listado_Modelo_TODOS = new INTERNO_MYT_Tecnicos_Listado_Modelo();
                mdl_INTERNO_MYT_Tecnicos_Listado_Modelo_TODOS.id = -1;
                mdl_INTERNO_MYT_Tecnicos_Listado_Modelo_TODOS.Tipo = 0;
                mdl_INTERNO_MYT_Tecnicos_Listado_Modelo_TODOS.nombre = "TODOS";
                lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final.Add(mdl_INTERNO_MYT_Tecnicos_Listado_Modelo_TODOS);
                #endregion

                List<INTERNO_MYT_Tecnicos_Listado_Modelo> lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Clonada = g_lst_INTERNO_MYT_Tecnicos_Listado_Modelo.AsQueryable().ToList();
                if (lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Clonada != null && lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Clonada.Count>0)
                {
                    lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final.AddRange(lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Clonada.OrderBy(m=>m.nombre));
                }

                if (lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final != null && lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final.Count>0)
                {
                    //FILTRAR
                    lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final=Tecnicos_Filtrar(lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final,str_Buscar, bol_PalabraCompleta,bol_MayusculasMinusculas);

                    if (lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final != null && lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final.Count > 0)
                    {
                        g_int_TotalRegistros_Tecnicos = lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final.Count;

                        foreach (INTERNO_MYT_Tecnicos_Listado_Modelo mdl_INTERNO_MYT_Tecnicos_Listado_Modelo in lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final)
                        {
                            //Se Cancelo la tarea asincrona #########################
                            if (g_bol_TareaAsincrona_Rellenar_DataGrid_Tecnicos_CANCELAR)
                            {
                                return;
                            }

                            //Progreso
                            g_int_TotalRegistrosInsertados_Tecnicos += 1;


                            //Añadir al DataGridView
                            ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_Tecnicos(mdl_INTERNO_MYT_Tecnicos_Listado_Modelo, null));

                            //Esperar un poco
                            Thread.Sleep(1);
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Tecnicos_DoWork));
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Tecnicos_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Tecnicos_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid de Tecnicos
                g_frm_P_Visor.Exferia_DataGridView_Tecnicos.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_Visor.Exferia_BarraProgreso_Tecnicos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Tecnicos;
                g_frm_P_Visor.Exferia_BarraProgreso_Tecnicos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Tecnicos;

            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Tecnicos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {}

        public DataGridViewRow Transformar_Modelo_A_Row_Tecnicos(INTERNO_MYT_Tecnicos_Listado_Modelo _mdl_INTERNO_MYT_Tecnicos_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Visor.Exferia_DataGridView_Tecnicos.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Visor.Exferia_DataGridView_Tecnicos);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Tecnicos_Columnas)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_MYT_Tecnicos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Tecnicos_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_MYT_Tecnicos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Tecnicos_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_MYT_Tecnicos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Tecnicos_Listado_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_MYT_Tecnicos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Tecnicos_Listado_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_MYT_Tecnicos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Tecnicos_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT))
                {
                    string str_Valor = (string)_mdl_INTERNO_MYT_Tecnicos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Tecnicos_Listado_Modelo, null);

                    long? lng_valor = long.Parse(str_Valor);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_MYT_Tecnicos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Tecnicos_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        private List<INTERNO_MYT_Tecnicos_Listado_Modelo> Tecnicos_Filtrar(List<INTERNO_MYT_Tecnicos_Listado_Modelo> _lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final, string _str_Buscar, bool _bol_PalabraCompleta, bool _bol_MayusculasMinusculas)
        {

            try
            {
                //Tiene Filtro
                if (_str_Buscar.Trim().Length > 0)
                {
                    //Palabra Completa
                    if (_bol_PalabraCompleta)
                    {
                        //Sencible a mayusculas y minusculas
                        if (_bol_MayusculasMinusculas)
                        {
                            _lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final = _lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final.Where(m => m.nombre == _str_Buscar).ToList();
                        }
                        //No tiene en cuenta las mayusculas y las minusculas
                        else
                        {
                            _lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final = _lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final.Where(m => m.nombre.ToUpper() == _str_Buscar.ToUpper()).ToList();
                        }
                    }
                    //Por Contenido
                    else
                    {
                        //Sencible a mayusculas y minusculas
                        if (_bol_MayusculasMinusculas)
                        {
                            _lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final = _lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final.Where(m => m.nombre.Contains(_str_Buscar)).ToList();
                        }
                        //No tiene en cuenta las mayusculas y las minusculas
                        else
                        {
                            _lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final = _lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final.Where(m => m.nombre.ToUpper().Contains(_str_Buscar.ToUpper())).ToList();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(Tecnicos_Filtrar));
            }

            return _lst_INTERNO_MYT_Tecnicos_Listado_Modelo_Final;
        }

        #endregion
        #endregion

        #region PARTES NO ASIGNADOS
        #region Cargar Datos Continua PartesNoAsignados
        public void CargarDatos_Continua_PartesNoAsignados(string _str_Buscar)
        {
            try
            {
                if (g_bol_TareaAsincrona_CargarDatos_Continua_PartesNoAsignados_EJECUTANDOSE == false)
                {
                    g_bol_TareaAsincrona_CargarDatos_Continua_PartesNoAsignados_EJECUTANDOSE = true;

                    if (g_obj_TareaAsincrona_CargarDatos_Continua_PartesNoAsignados == null)
                    {
                        g_obj_TareaAsincrona_CargarDatos_Continua_PartesNoAsignados = new BackgroundWorker();
                        g_obj_TareaAsincrona_CargarDatos_Continua_PartesNoAsignados.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_Continua_PartesNoAsignados_DoWork);
                        g_obj_TareaAsincrona_CargarDatos_Continua_PartesNoAsignados.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargarDatos_Continua_PartesNoAsignados_ProgressChanged);
                        g_obj_TareaAsincrona_CargarDatos_Continua_PartesNoAsignados.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Continua_PartesNoAsignados_Completed);
                        g_obj_TareaAsincrona_CargarDatos_Continua_PartesNoAsignados.WorkerReportsProgress = true;
                    }

                    //parametros para Filtrar
                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_str_Buscar);
                    lst_Argumentos.Add((INTERNO_ComboBox_Modelo)g_frm_P_Visor.Exferia_ComboBox_PartesNoAsignados_Filtros.SelectedItem);
                    lst_Argumentos.Add(g_frm_P_Visor.Exferia_CheckBox_PartesNoAsignados_MayusculasMinusculas.Checked);
                    lst_Argumentos.Add(g_frm_P_Visor.Exferia_CheckBox_PartesNoAsignados_PalabraCompleta.Checked);

                    //Tarea Asincrona ###############################################################
                    g_obj_TareaAsincrona_CargarDatos_Continua_PartesNoAsignados.RunWorkerAsync(lst_Argumentos);
                    //###########################################################################################
                }
            }
            catch (Exception ex)
            {
                g_bol_TareaAsincrona_CargarDatos_Continua_PartesNoAsignados_EJECUTANDOSE = false;
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(CargarDatos_Continua_PartesNoAsignados));
            }
        }

        private void TareaAsincrona_CargarDatos_Continua_PartesNoAsignados_DoWork(object sender, DoWorkEventArgs e)
        {
            bool bol_Ordenar_DataGridView = false;

            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];


                //Obtener Listado PartesNoAsignados
                List<INTERNO_MYT_Partes_Listado_Modelo> lst_INTERNO_MYT_Partes_Listado_Modelo_NoAsignados = g_obj_MYT_Partes_Datos.Obtener_Para_Visor_PartesNoAsignados();
                if (lst_INTERNO_MYT_Partes_Listado_Modelo_NoAsignados == null)
                {
                    lst_INTERNO_MYT_Partes_Listado_Modelo_NoAsignados = new List<INTERNO_MYT_Partes_Listado_Modelo>();
                }

                #region Partes a Borrar
                if (g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados != null && g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados.Count > 0)
                {
                    List<long> lst_idParte_ABorrar = g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados.Where(m => !lst_INTERNO_MYT_Partes_Listado_Modelo_NoAsignados.Select(x => x.id).ToList().Contains(m.id)).Select(a => a.id).ToList();

                    if (lst_idParte_ABorrar != null && lst_idParte_ABorrar.Count > 0)
                    {
                        //Borrar del Listado General
                        g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados.RemoveAll(m => lst_idParte_ABorrar.Contains(m.id));

                        //Borrar del DataGridView
                        List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Visor.Exferia_DataGridView_PartesNoAsignados.Rows
                                                                                            .Cast<DataGridViewRow>()
                                                                                            .Where(r => lst_idParte_ABorrar.Contains(long.Parse(r.Cells[nameof(INTERNO_MYT_Partes_Listado_Modelo.id)].Value.ToString()))).ToList();

                        if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                        {
                            //Borrar del Grid
                            foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                            {
                                //Borrar del DataGridView
                                ((BackgroundWorker)sender).ReportProgress(1, dgvr_Borrar);
                            }

                            //Barra de Progreso
                            g_int_TotalRegistros_PartesNoAsignados -= lst_DataGridViewRow.Count;
                            g_int_TotalRegistrosInsertados_PartesNoAsignados -= lst_DataGridViewRow.Count;

                            //Actualizar barra de Progreso
                            ((BackgroundWorker)sender).ReportProgress(4);
                        }
                    }
                }
                #endregion

                List<INTERNO_MYT_Partes_Listado_Modelo> lst_Partes_ActualizarOInsertar_DataGridView = new List<INTERNO_MYT_Partes_Listado_Modelo>();
                #region Partes a Insertar
                if (lst_INTERNO_MYT_Partes_Listado_Modelo_NoAsignados != null && lst_INTERNO_MYT_Partes_Listado_Modelo_NoAsignados.Count > 0)
                {
                    if (g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados == null)
                    {
                        g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados = new List<INTERNO_MYT_Partes_Listado_Modelo>();
                    }

                    //Insertar los que no existan
                    List<INTERNO_MYT_Partes_Listado_Modelo> lst_Partes_AInsertar = lst_INTERNO_MYT_Partes_Listado_Modelo_NoAsignados.Where(m => !g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados.Select(x => x.id).ToList().Contains(m.id)).ToList();
                    if (lst_Partes_AInsertar != null && lst_Partes_AInsertar.Count > 0)
                    {
                        //Insertar en el listado general
                        g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados.AddRange(lst_Partes_AInsertar);

                        //Añadir al listado final
                        lst_Partes_ActualizarOInsertar_DataGridView.AddRange(lst_Partes_AInsertar);
                    }
                }
                #endregion

                #region Partes a Actualizar
                if (lst_INTERNO_MYT_Partes_Listado_Modelo_NoAsignados != null && lst_INTERNO_MYT_Partes_Listado_Modelo_NoAsignados.Count > 0)
                {
                    foreach (INTERNO_MYT_Partes_Listado_Modelo mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR in lst_INTERNO_MYT_Partes_Listado_Modelo_NoAsignados)
                    {
                        INTERNO_MYT_Partes_Listado_Modelo mdl_INTERNO_MYT_Partes_Listado_Modelo = g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados.Where(m => m.id == mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR.id).FirstOrDefault();

                        if (mdl_INTERNO_MYT_Partes_Listado_Modelo != null)
                        {
                            bool bol_hayAlgunCampoDiferente = false;

                            //Comparar campos diferentes
                            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_PartesNoAsignados_Columnas.Where(m=>m.TipoDato!=G_ENUM_TIPOSDATOS.SELECCIONAR).ToList())
                            {
                                if (
                                        (
                                            mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo, null)==null &&
                                            mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR, null) != null
                                        )
                                        ||
                                        (
                                            mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo, null) != null &&
                                            mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR, null) == null
                                        )
                                        ||
                                        (
                                            mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo, null) != null &&
                                            mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR, null) != null &&
                                            !mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo, null).Equals(mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR, null))
                                        )
                                  )
                                {
                                    bol_hayAlgunCampoDiferente = true;
                                    break;
                                }
                            }

                            //AlgunCampo Diferente
                            if (bol_hayAlgunCampoDiferente)
                            {
                                g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados[g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados.IndexOf(mdl_INTERNO_MYT_Partes_Listado_Modelo)] = mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR;

                                //Añadir al listado final
                                lst_Partes_ActualizarOInsertar_DataGridView.Add(mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR);
                            }
                        }
                    }
                }
                #endregion

                #region Partes Actualizar DataGridView
                if (lst_Partes_ActualizarOInsertar_DataGridView != null &&
                    lst_Partes_ActualizarOInsertar_DataGridView.Count > 0)
                {
                    bol_Ordenar_DataGridView = true;

                    //FILTRAR
                    List<dynamic> lst_Filtrado = PartesNoAsignadosFiltrar(str_Busqueda,
                                                                                            bol_PalabraCompleta,
                                                                                            bol_SensibilidadMayusMin,
                                                                                            mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado,
                                                                                            lst_Partes_ActualizarOInsertar_DataGridView); 


                    if (lst_Filtrado != null &&
                        lst_Filtrado.Count > 0)
                    {
                        foreach (dynamic dnm_Partes in lst_Filtrado)
                        {

                            //Borrar del DataGridView
                            DataGridViewRow dgv_Fila = g_frm_P_Visor.Exferia_DataGridView_PartesNoAsignados.Rows
                                                                                                .Cast<DataGridViewRow>()
                                                                                                .Where(r => dnm_Partes.GetType().GetProperty(nameof(INTERNO_MYT_Partes_Listado_Modelo.id)).GetValue(dnm_Partes, null).ToString() == (r.Cells[nameof(INTERNO_MYT_Partes_Listado_Modelo.id)].Value.ToString())).FirstOrDefault();

                            //Actualizar
                            if (dgv_Fila != null)
                            {
                                //Añadir Fila con Columnas .............................
                                Transformar_Modelo_A_Row_PartesNoAsignados(dnm_Partes, dgv_Fila);
                              
                            }
                            //Insertar
                            else
                            {
                                //Añadir al DataGridView
                                ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_PartesNoAsignados(dnm_Partes, null));

                                //Añadir al DataGridView
                                g_int_TotalRegistros_PartesNoAsignados += 1;
                                g_int_TotalRegistrosInsertados_PartesNoAsignados += 1;

                                //Actualizar barra de Progreso
                                ((BackgroundWorker)sender).ReportProgress(4);
                            }
                        }
                    }
                }
                #endregion

            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Continua_PartesNoAsignados_DoWork));
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Continua_PartesNoAsignados_DoWork));
            }
            e.Result = bol_Ordenar_DataGridView;
        }
        private void TareaAsincrona_CargarDatos_Continua_PartesNoAsignados_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (!g_frm_P_Visor.IsDisposed)
                {
                    //Borrar Registro DataGridView
                    if (e.ProgressPercentage == 1)
                    {
                        g_frm_P_Visor.Exferia_DataGridView_PartesNoAsignados.Rows.Remove((DataGridViewRow)e.UserState);
                    }
                    //Insertar Registro DataGridView
                    else if (e.ProgressPercentage == 2)
                    {
                        g_frm_P_Visor.Exferia_DataGridView_PartesNoAsignados.Rows.Add((DataGridViewRow)e.UserState);
                    }
                    //Actualizar Barra de Progreso
                    else if (e.ProgressPercentage == 4)
                    {
                        g_frm_P_Visor.Exferia_BarraProgreso_PartesNoAsignados.Exferia_BarraProgreso_Total = g_int_TotalRegistros_PartesNoAsignados;
                        g_frm_P_Visor.Exferia_BarraProgreso_PartesNoAsignados.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_PartesNoAsignados;
                    }
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_CargarDatos_Continua_PartesNoAsignados_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                //ordenar el Listado de PartesNoAsignados
                if (e.Result != null &&
                    ((bool)e.Result))
                {
                    g_frm_P_Visor.PartesNoAsignados_Ordenar_DataGridView();

                }
            }
            catch (Exception)
            { }
            finally
            {
                g_bol_TareaAsincrona_CargarDatos_Continua_PartesNoAsignados_EJECUTANDOSE = false;
            }

        }
        #endregion

        #region Rellenar DataGridView Partes No Asignados

        public void Rellenar_DataGrid_PartesNoAsignados(string _str_filtro)
        {
            try
            {

                if (g_obj_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados != null)
                {
                    g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados = true;
                    while (g_obj_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados.IsBusy)
                    {
                        Application.DoEvents();
                    }
                    g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados = false;
                }
                else
                {
                    g_obj_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados = new BackgroundWorker();
                    g_obj_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados_DoWork);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados_ProgressChanged);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados_Completed);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados.WorkerReportsProgress = true;
                    g_obj_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados.WorkerSupportsCancellation = true;
                }

                //Vaciar el Listado
                g_frm_P_Visor.Exferia_DataGridView_PartesNoAsignados.Rows.Clear();
                g_int_TotalRegistrosInsertados_PartesNoAsignados = 0;
                g_frm_P_Visor.Exferia_BarraProgreso_PartesNoAsignados.Exferia_BarraProgreso_Total = 0;
                g_frm_P_Visor.Exferia_BarraProgreso_PartesNoAsignados.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_Visor.Exferia_ComboBox_PartesNoAsignados_Filtros.SelectedItem);
                lst_Argumentos.Add(g_frm_P_Visor.Exferia_CheckBox_PartesNoAsignados_MayusculasMinusculas.Checked);
                lst_Argumentos.Add(g_frm_P_Visor.Exferia_CheckBox_PartesNoAsignados_PalabraCompleta.Checked);

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

                //Llamar a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados.RunWorkerAsync(lst_Argumentos);
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(Rellenar_DataGrid_PartesNoAsignados));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(Rellenar_DataGrid_PartesNoAsignados));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados_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
                List<dynamic> lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = PartesNoAsignadosFiltrar(str_Busqueda,
                                                                                bol_PalabraCompleta,
                                                                                bol_SensibilidadMayusMin,
                                                                                mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado,
                                                                                g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados);

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

                    g_frm_P_Visor.PartesNoAsignados_Ordenar_DataGridView();

                    g_int_TotalRegistros_PartesNoAsignados = lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Count;

                    foreach (dynamic obj_Dinamico in lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS)
                    {
                        //Se Cancelo la tarea asincrona ---------------------------
                        if (g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados)
                        {
                            return;
                        }

                        //Llamar al Progress
                        g_int_TotalRegistrosInsertados_PartesNoAsignados += 1;

                        ((BackgroundWorker)sender).ReportProgress(1, Transformar_Modelo_A_Row_PartesNoAsignados(obj_Dinamico,null));

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

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

                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (!g_frm_P_Visor.IsDisposed)
                {
                    g_frm_P_Visor.Exferia_DataGridView_PartesNoAsignados.Rows.Add((DataGridViewRow)e.UserState);

                    g_frm_P_Visor.Exferia_BarraProgreso_PartesNoAsignados.Exferia_BarraProgreso_Total= g_int_TotalRegistros_PartesNoAsignados;
                    g_frm_P_Visor.Exferia_BarraProgreso_PartesNoAsignados.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_PartesNoAsignados;
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_PartesNoAsignados_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }

        private List<dynamic> PartesNoAsignadosFiltrar(  string _str_Busqueda, 
                                                bool _bol_PalabraCompleta,
                                                bool _bol_SensibilidadMayusMin,
                                                INTERNO_ComboBox_Modelo _mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado,
                                                List<INTERNO_MYT_Partes_Listado_Modelo> _lst_INTERNO_MYT_Partes_Listado_Modelo)
        {
            List<dynamic> lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = null;

            try
            {
                if (_lst_INTERNO_MYT_Partes_Listado_Modelo != null && _lst_INTERNO_MYT_Partes_Listado_Modelo.Count > 0)
                {
                    //Filtrar #############################################
                    if (_str_Busqueda.Trim().Length > 0 || g_dct_ListadoFiltros_PartesNoAsignados.Count > 0)
                    {
                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = _lst_INTERNO_MYT_Partes_Listado_Modelo.Cast<dynamic>().ToList();

                        //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_PartesNoAsignados)
                                {
                                    //Palabra Completa
                                    if (_bol_PalabraCompleta)
                                    {
                                        //Sencible a mayusculas y minusculas
                                        if (_bol_SensibilidadMayusMin)
                                        {
                                            lst_TodosFiltrado.AddRange(lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString() == _str_Busqueda).ToList());
                                        }
                                        //No tiene en cuenta las mayusculas y las minusculas
                                        else
                                        {
                                            lst_TodosFiltrado.AddRange(lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString().ToUpper() == _str_Busqueda.ToUpper()).ToList());
                                        }
                                    }
                                    //Por Contenido
                                    else
                                    {
                                        //Sencible a mayusculas y minusculas
                                        if (_bol_SensibilidadMayusMin)
                                        {
                                            lst_TodosFiltrado.AddRange(lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString().Contains(_str_Busqueda)).ToList());
                                        }
                                        //No tiene en cuenta las mayusculas y las minusculas
                                        else
                                        {
                                            lst_TodosFiltrado.AddRange(lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString().ToUpper().Contains(_str_Busqueda.ToUpper())).ToList());
                                        }
                                    }
                                }
                                //Añadir al Listado Final
                                lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = lst_TodosFiltrado.Distinct().ToList();
                            }
                            //Campo seleccionado
                            else
                            {
                                //Palabra Completa
                                if (_bol_PalabraCompleta)
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (_bol_SensibilidadMayusMin)
                                    {
                                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString() == _str_Busqueda).ToList();
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString().ToUpper() == _str_Busqueda.ToUpper()).ToList();
                                    }
                                }
                                //Por Contenido
                                else
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (_bol_SensibilidadMayusMin)
                                    {
                                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString().Contains(_str_Busqueda)).ToList();
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString().ToUpper().Contains(_str_Busqueda.ToUpper())).ToList();
                                    }
                                }
                            }
                        }

                        //Filtros Avanzados
                        if (g_dct_ListadoFiltros_PartesNoAsignados != null && g_dct_ListadoFiltros_PartesNoAsignados.Count > 0)
                        {
                            lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = Funciones_Listado.Filtrar_Listado(lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS, g_obj_ABS_Listado_MYT_Partes_NoAsignados_P_Visor, g_dct_ListadoFiltros_PartesNoAsignados);
                        }
                    }
                    else
                    {
                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = _lst_INTERNO_MYT_Partes_Listado_Modelo.Cast<dynamic>().ToList();
                    }
                }
            }
            catch (Exception)
            {}

            return lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS;
        }
        #endregion

        public DataGridViewRow Transformar_Modelo_A_Row_PartesNoAsignados(INTERNO_MYT_Partes_Listado_Modelo _mdl_INTERNO_MYT_Partes_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Visor.Exferia_DataGridView_PartesNoAsignados.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Visor.Exferia_DataGridView_PartesNoAsignados);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_PartesNoAsignados_Columnas)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT))
                {
                    string str_Valor = (string)_mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);

                    long? lng_valor = long.Parse(str_Valor);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public void PartesNoAsignados_Actualizar_Individual(long _lng_id, bool _bol_Valor)
        {
            try
            {
                //Busco registro listado en memoria
                INTERNO_MYT_Partes_Listado_Modelo mdl_INTERNO_MYT_Partes_Listado_Modelo = g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados[g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados.IndexOf(g_lst_INTERNO_MYT_Partes_Listado_Modelo_PartesNoAsignados.Where(m => m.id == _lng_id).FirstOrDefault())];

                if (mdl_INTERNO_MYT_Partes_Listado_Modelo != null)
                {
                    //Actualizar registro dinamico
                    mdl_INTERNO_MYT_Partes_Listado_Modelo.Seleccionar= _bol_Valor;
                }
            }
            catch (Exception)
            { }
        }
        #endregion

        #region PARTES RESTOPARTES
        #region Cargar Datos Continua RestoPartes
        public void CargarDatos_Continua_RestoPartes(string _str_Buscar)
        {
            try
            {
                if (g_bol_TareaAsincrona_CargarDatos_Continua_RestoPartes_EJECUTANDOSE == false)
                {
                    g_bol_TareaAsincrona_CargarDatos_Continua_RestoPartes_EJECUTANDOSE = true;

                    if (g_obj_TareaAsincrona_CargarDatos_Continua_RestoPartes == null)
                    {
                        g_obj_TareaAsincrona_CargarDatos_Continua_RestoPartes = new BackgroundWorker();
                        g_obj_TareaAsincrona_CargarDatos_Continua_RestoPartes.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_Continua_RestoPartes_DoWork);
                        g_obj_TareaAsincrona_CargarDatos_Continua_RestoPartes.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargarDatos_Continua_RestoPartes_ProgressChanged);
                        g_obj_TareaAsincrona_CargarDatos_Continua_RestoPartes.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Continua_RestoPartes_Completed);
                        g_obj_TareaAsincrona_CargarDatos_Continua_RestoPartes.WorkerReportsProgress = true;
                    }

                    //parametros para Filtrar
                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_str_Buscar);
                    lst_Argumentos.Add((INTERNO_ComboBox_Modelo)g_frm_P_Visor.Exferia_ComboBox_RestoPartes_Filtros.SelectedItem);
                    lst_Argumentos.Add(g_frm_P_Visor.Exferia_CheckBox_RestoPartes_MayusculasMinusculas.Checked);
                    lst_Argumentos.Add(g_frm_P_Visor.Exferia_CheckBox_RestoPartes_PalabraCompleta.Checked);

                    //Tarea Asincrona ###############################################################
                    g_obj_TareaAsincrona_CargarDatos_Continua_RestoPartes.RunWorkerAsync(lst_Argumentos);
                    //###########################################################################################
                }
            }
            catch (Exception ex)
            {
                g_bol_TareaAsincrona_CargarDatos_Continua_RestoPartes_EJECUTANDOSE = false;
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(CargarDatos_Continua_RestoPartes));
            }
        }

        private void TareaAsincrona_CargarDatos_Continua_RestoPartes_DoWork(object sender, DoWorkEventArgs e)
        {
            bool bol_Ordenar_DataGridView = false;

            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];


                //Obtener Listado RestoPartes
                List<INTERNO_MYT_Partes_Listado_Modelo> lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes = g_obj_MYT_Partes_Datos.Obtener_Para_Visor_PartesAsignados();
                if (lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes == null)
                {
                    lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes = new List<INTERNO_MYT_Partes_Listado_Modelo>();
                }

                #region Partes a Borrar
                if (g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes != null && g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes.Count > 0)
                {
                    List<long> lst_idParte_ABorrar = g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes.Where(m => !lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes.Select(x => x.id).ToList().Contains(m.id)).Select(a => a.id).ToList();

                    if (lst_idParte_ABorrar != null && lst_idParte_ABorrar.Count > 0)
                    {
                        //Borrar del Listado General
                        g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes.RemoveAll(m => lst_idParte_ABorrar.Contains(m.id));

                        //Borrar del DataGridView
                        List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Visor.Exferia_DataGridView_RestoPartes.Rows
                                                                                            .Cast<DataGridViewRow>()
                                                                                            .Where(r => lst_idParte_ABorrar.Contains(long.Parse(r.Cells[nameof(INTERNO_MYT_Partes_Listado_Modelo.id)].Value.ToString()))).ToList();

                        if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                        {
                            //Borrar del Grid
                            foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                            {
                                //Borrar del DataGridView
                                ((BackgroundWorker)sender).ReportProgress(1, dgvr_Borrar);
                            }

                            //Barra de Progreso
                            g_int_TotalRegistros_RestoPartes -= lst_DataGridViewRow.Count;
                            g_int_TotalRegistrosInsertados_RestoPartes -= lst_DataGridViewRow.Count;

                            //Actualizar barra de Progreso
                            ((BackgroundWorker)sender).ReportProgress(4);
                        }
                    }
                }
                #endregion

                List<INTERNO_MYT_Partes_Listado_Modelo> lst_Partes_ActualizarOInsertar_DataGridView = new List<INTERNO_MYT_Partes_Listado_Modelo>();
                #region Partes a Insertar
                if (lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes != null && lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes.Count > 0)
                {
                    if (g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes == null)
                    {
                        g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes = new List<INTERNO_MYT_Partes_Listado_Modelo>();
                    }

                    //Insertar los que no existan
                    List<INTERNO_MYT_Partes_Listado_Modelo> lst_Partes_AInsertar = lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes.Where(m => !g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes.Select(x => x.id).ToList().Contains(m.id)).ToList();
                    if (lst_Partes_AInsertar != null && lst_Partes_AInsertar.Count > 0)
                    {
                        //Insertar en el listado general
                        g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes.AddRange(lst_Partes_AInsertar);

                        //Añadir al listado final
                        lst_Partes_ActualizarOInsertar_DataGridView.AddRange(lst_Partes_AInsertar);
                    }
                }
                #endregion

                #region Partes a Actualizar
                if (lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes != null && lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes.Count > 0)
                {
                    foreach (INTERNO_MYT_Partes_Listado_Modelo mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR in lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes)
                    {
                        INTERNO_MYT_Partes_Listado_Modelo mdl_INTERNO_MYT_Partes_Listado_Modelo = g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes.Where(m => m.id == mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR.id).FirstOrDefault();

                        if (mdl_INTERNO_MYT_Partes_Listado_Modelo != null)
                        {
                            bool bol_hayAlgunCampoDiferente = false;

                            //Comparar campos diferentes
                            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_RestoPartes_Columnas)
                            {
                                if (
                                        (
                                            mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo, null) == null &&
                                            mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR, null) != null
                                        )
                                        ||
                                        (
                                            mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo, null) != null &&
                                            mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR, null) == null
                                        )
                                        ||
                                        (
                                            mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo, null) != null &&
                                            mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR, null) != null &&
                                            !mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo, null).Equals(mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR, null))
                                        )
                                  )
                                {
                                    bol_hayAlgunCampoDiferente = true;
                                    break;
                                }
                            }

                            //AlgunCampo Diferente
                            if (bol_hayAlgunCampoDiferente)
                            {
                                g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes[g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes.IndexOf(mdl_INTERNO_MYT_Partes_Listado_Modelo)] = mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR;

                                //Añadir al listado final
                                lst_Partes_ActualizarOInsertar_DataGridView.Add(mdl_INTERNO_MYT_Partes_Listado_Modelo_ACTUALIZAR);
                            }
                        }
                    }
                }
                #endregion

                #region Partes Actualizar DataGridView
                if (lst_Partes_ActualizarOInsertar_DataGridView != null &&
                    lst_Partes_ActualizarOInsertar_DataGridView.Count > 0)
                {
                    bol_Ordenar_DataGridView = true;

                    //FILTRAR
                    List<dynamic> lst_Filtrado = RestoPartesFiltrar(str_Busqueda,
                                                                                            bol_PalabraCompleta,
                                                                                            bol_SensibilidadMayusMin,
                                                                                            mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado,
                                                                                            lst_Partes_ActualizarOInsertar_DataGridView);


                    if (lst_Filtrado != null &&
                        lst_Filtrado.Count > 0)
                    {
                        foreach (dynamic dnm_Partes in lst_Filtrado)
                        {

                            //Borrar del DataGridView
                            DataGridViewRow dgv_Fila = g_frm_P_Visor.Exferia_DataGridView_RestoPartes.Rows
                                                                                                .Cast<DataGridViewRow>()
                                                                                                .Where(r => dnm_Partes.GetType().GetProperty(nameof(INTERNO_MYT_Partes_Listado_Modelo.id)).GetValue(dnm_Partes, null).ToString() == (r.Cells[nameof(INTERNO_MYT_Partes_Listado_Modelo.id)].Value.ToString())).FirstOrDefault();

                            //Actualizar
                            if (dgv_Fila != null)
                            {
                                //Añadir Fila con Columnas .............................
                                Transformar_Modelo_A_Row_RestoPartes(dnm_Partes, dgv_Fila);

                            }
                            //Insertar
                            else
                            {
                                //Añadir al DataGridView
                                ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_RestoPartes(dnm_Partes, null));

                                //Añadir al DataGridView
                                g_int_TotalRegistros_RestoPartes += 1;
                                g_int_TotalRegistrosInsertados_RestoPartes += 1;

                                //Actualizar barra de Progreso
                                ((BackgroundWorker)sender).ReportProgress(4);
                            }
                        }
                    }
                }
                #endregion

            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Continua_RestoPartes_DoWork));
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Continua_RestoPartes_DoWork));
            }
            e.Result = bol_Ordenar_DataGridView;
        }
        private void TareaAsincrona_CargarDatos_Continua_RestoPartes_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (!g_frm_P_Visor.IsDisposed)
                {
                    //Borrar Registro DataGridView
                    if (e.ProgressPercentage == 1)
                    {
                        g_frm_P_Visor.Exferia_DataGridView_RestoPartes.Rows.Remove((DataGridViewRow)e.UserState);
                    }
                    //Insertar Registro DataGridView
                    else if (e.ProgressPercentage == 2)
                    {
                        g_frm_P_Visor.Exferia_DataGridView_RestoPartes.Rows.Add((DataGridViewRow)e.UserState);
                    }
                    //Actualizar Barra de Progreso
                    else if (e.ProgressPercentage == 4)
                    {
                        g_frm_P_Visor.Exferia_BarraProgreso_RestoPartes.Exferia_BarraProgreso_Total = g_int_TotalRegistros_RestoPartes;
                        g_frm_P_Visor.Exferia_BarraProgreso_RestoPartes.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_RestoPartes;
                    }
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_CargarDatos_Continua_RestoPartes_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                //ordenar el Listado de RestoPartes
                if (e.Result != null &&
                    ((bool)e.Result))
                {
                    g_frm_P_Visor.RestoPartes_Ordenar_DataGridView();

                }
            }
            catch (Exception)
            { }
            finally
            {
                g_bol_TareaAsincrona_CargarDatos_Continua_RestoPartes_EJECUTANDOSE = false;
            }

        }
        #endregion

        #region Rellenar DataGridView RestoPartes

        public void Rellenar_DataGrid_RestoPartes(string _str_filtro)
        {
            try
            {

                if (g_obj_TareaAsincrona_Rellenar_DataGrid_RestoPartes != null)
                {
                    g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_RestoPartes = true;
                    while (g_obj_TareaAsincrona_Rellenar_DataGrid_RestoPartes.IsBusy)
                    {
                        Application.DoEvents();
                    }
                    g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_RestoPartes = false;
                }
                else
                {
                    g_obj_TareaAsincrona_Rellenar_DataGrid_RestoPartes = new BackgroundWorker();
                    g_obj_TareaAsincrona_Rellenar_DataGrid_RestoPartes.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_RestoPartes_DoWork);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_RestoPartes.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_RestoPartes_ProgressChanged);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_RestoPartes.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_RestoPartes_Completed);
                    g_obj_TareaAsincrona_Rellenar_DataGrid_RestoPartes.WorkerReportsProgress = true;
                    g_obj_TareaAsincrona_Rellenar_DataGrid_RestoPartes.WorkerSupportsCancellation = true;
                }

                //Vaciar el Listado
                g_frm_P_Visor.Exferia_DataGridView_RestoPartes.Rows.Clear();
                g_int_TotalRegistrosInsertados_RestoPartes = 0;
                g_frm_P_Visor.Exferia_BarraProgreso_RestoPartes.Exferia_BarraProgreso_Total = 0;
                g_frm_P_Visor.Exferia_BarraProgreso_RestoPartes.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_Visor.Exferia_ComboBox_RestoPartes_Filtros.SelectedItem);
                lst_Argumentos.Add(g_frm_P_Visor.Exferia_CheckBox_RestoPartes_MayusculasMinusculas.Checked);
                lst_Argumentos.Add(g_frm_P_Visor.Exferia_CheckBox_RestoPartes_PalabraCompleta.Checked);

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

                //Llamar a la tarea asincrona
                g_obj_TareaAsincrona_Rellenar_DataGrid_RestoPartes.RunWorkerAsync(lst_Argumentos);
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(Rellenar_DataGrid_RestoPartes));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(Rellenar_DataGrid_RestoPartes));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSLISTADO());
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_RestoPartes_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
                List<dynamic> lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = RestoPartesFiltrar(str_Busqueda,
                                                                                bol_PalabraCompleta,
                                                                                bol_SensibilidadMayusMin,
                                                                                mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado,
                                                                                g_lst_INTERNO_MYT_Partes_Listado_Modelo_RestoPartes);

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

                    g_frm_P_Visor.RestoPartes_Ordenar_DataGridView();

                    g_int_TotalRegistros_RestoPartes = lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Count;

                    foreach (dynamic obj_Dinamico in lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS)
                    {
                        //Se Cancelo la tarea asincrona ---------------------------
                        if (g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_RestoPartes)
                        {
                            return;
                        }

                        //Llamar al Progress
                        g_int_TotalRegistrosInsertados_RestoPartes += 1;

                        ((BackgroundWorker)sender).ReportProgress(1, Transformar_Modelo_A_Row_RestoPartes(obj_Dinamico, null));

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

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

                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_RestoPartes_DoWork));
            }
            catch (Control_Errores ex)
            {
                g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_RestoPartes = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_RestoPartes_DoWork));
            }
            catch (Exception ex)
            {
                g_bol_Cancelar_TareaAsincrona_Rellenar_DataGrid_RestoPartes = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_RestoPartes_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_RestoPartes_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (!g_frm_P_Visor.IsDisposed)
                {
                    g_frm_P_Visor.Exferia_DataGridView_RestoPartes.Rows.Add((DataGridViewRow)e.UserState);

                    g_frm_P_Visor.Exferia_BarraProgreso_RestoPartes.Exferia_BarraProgreso_Total = g_int_TotalRegistros_RestoPartes;
                    g_frm_P_Visor.Exferia_BarraProgreso_RestoPartes.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_RestoPartes;
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_RestoPartes_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }

        private List<dynamic> RestoPartesFiltrar(string _str_Busqueda,
                                                bool _bol_PalabraCompleta,
                                                bool _bol_SensibilidadMayusMin,
                                                INTERNO_ComboBox_Modelo _mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado,
                                                List<INTERNO_MYT_Partes_Listado_Modelo> _lst_INTERNO_MYT_Partes_Listado_Modelo)
        {
            List<dynamic> lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = null;

            try
            {
                if (_lst_INTERNO_MYT_Partes_Listado_Modelo != null && _lst_INTERNO_MYT_Partes_Listado_Modelo.Count > 0)
                {
                    //Filtrar #############################################
                    if (_str_Busqueda.Trim().Length > 0 || g_dct_ListadoFiltros_RestoPartes.Count > 0)
                    {
                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = _lst_INTERNO_MYT_Partes_Listado_Modelo.Cast<dynamic>().ToList();

                        //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_RestoPartes)
                                {
                                    //Palabra Completa
                                    if (_bol_PalabraCompleta)
                                    {
                                        //Sencible a mayusculas y minusculas
                                        if (_bol_SensibilidadMayusMin)
                                        {
                                            lst_TodosFiltrado.AddRange(lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString() == _str_Busqueda).ToList());
                                        }
                                        //No tiene en cuenta las mayusculas y las minusculas
                                        else
                                        {
                                            lst_TodosFiltrado.AddRange(lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString().ToUpper() == _str_Busqueda.ToUpper()).ToList());
                                        }
                                    }
                                    //Por Contenido
                                    else
                                    {
                                        //Sencible a mayusculas y minusculas
                                        if (_bol_SensibilidadMayusMin)
                                        {
                                            lst_TodosFiltrado.AddRange(lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString().Contains(_str_Busqueda)).ToList());
                                        }
                                        //No tiene en cuenta las mayusculas y las minusculas
                                        else
                                        {
                                            lst_TodosFiltrado.AddRange(lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(mdl_INTERNO_ComboBox_Modelo_Filtros.Identificador).GetValue(m, null).ToString().ToUpper().Contains(_str_Busqueda.ToUpper())).ToList());
                                        }
                                    }
                                }
                                //Añadir al Listado Final
                                lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = lst_TodosFiltrado.Distinct().ToList();
                            }
                            //Campo seleccionado
                            else
                            {
                                //Palabra Completa
                                if (_bol_PalabraCompleta)
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (_bol_SensibilidadMayusMin)
                                    {
                                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString() == _str_Busqueda).ToList();
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString().ToUpper() == _str_Busqueda.ToUpper()).ToList();
                                    }
                                }
                                //Por Contenido
                                else
                                {
                                    //Sencible a mayusculas y minusculas
                                    if (_bol_SensibilidadMayusMin)
                                    {
                                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString().Contains(_str_Busqueda)).ToList();
                                    }
                                    //No tiene en cuenta las mayusculas y las minusculas
                                    else
                                    {
                                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null) != null && m.GetType().GetProperty(_mdl_INTERNO_ComboBox_Modelo_FiltrosSeleccionado.Identificador).GetValue(m, null).ToString().ToUpper().Contains(_str_Busqueda.ToUpper())).ToList();
                                    }
                                }
                            }
                        }

                        //Filtros Avanzados
                        if (g_dct_ListadoFiltros_RestoPartes != null && g_dct_ListadoFiltros_RestoPartes.Count > 0)
                        {
                            lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = Funciones_Listado.Filtrar_Listado(lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS, g_obj_ABS_Listado_MYT_Partes_RestoPartes_P_Visor, g_dct_ListadoFiltros_RestoPartes);
                        }
                    }
                    else
                    {
                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = _lst_INTERNO_MYT_Partes_Listado_Modelo.Cast<dynamic>().ToList();
                    }

                    //Filtrar Por Estado
                    if (lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS!=null && 
                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Count>0 &&
                        g_str_Estado_Seleccionado!="")
                    {
                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(nameof(INTERNO_MYT_Partes_Listado_Modelo.ParteEstado_EstadoInterno)).GetValue(m, null) != null && m.GetType().GetProperty(nameof(INTERNO_MYT_Partes_Listado_Modelo.ParteEstado_EstadoInterno)).GetValue(m, null).ToString()==(g_str_Estado_Seleccionado)).ToList();
                    }

                    //Filtrar por Tecnico
                    if (lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS != null &&
                        lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Count > 0)
                    {
                        long lng_idTecnicoSeleccionado = 0;
                        if (g_frm_P_Visor.Exferia_DataGridView_Tecnicos.Rows!=null &&
                            g_frm_P_Visor.Exferia_DataGridView_Tecnicos.Rows.Count>0 &&
                            g_frm_P_Visor.Exferia_DataGridView_Tecnicos.SelectedRows!=null &&
                            g_frm_P_Visor.Exferia_DataGridView_Tecnicos.SelectedRows.Count>0)
                        {
                            lng_idTecnicoSeleccionado=long.Parse( g_frm_P_Visor.Exferia_DataGridView_Tecnicos.SelectedRows[0].Cells[nameof(INTERNO_MYT_Tecnicos_Listado_Modelo.id)].Value.ToString());
                        }

                        if (lng_idTecnicoSeleccionado != -1)
                        {
                            lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS = lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS.Where(m => m.GetType().GetProperty(nameof(INTERNO_MYT_Partes_Listado_Modelo.idTecnico)).GetValue(m, null) != null && m.GetType().GetProperty(nameof(INTERNO_MYT_Partes_Listado_Modelo.idTecnico)).GetValue(m, null).ToString() == (lng_idTecnicoSeleccionado.ToString())).ToList();
                        }
                    }

                }
            }
            catch (Exception)
            { }

            return lst_INTERNO_MYT_Partes_Listado_Modelo_FILTRADOS;
        }
        #endregion

        public DataGridViewRow Transformar_Modelo_A_Row_RestoPartes(INTERNO_MYT_Partes_Listado_Modelo _mdl_INTERNO_MYT_Partes_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Visor.Exferia_DataGridView_RestoPartes.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Visor.Exferia_DataGridView_RestoPartes);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_RestoPartes_Columnas)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT))
                {
                    string str_Valor = (string)_mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);

                    long? lng_valor = long.Parse(str_Valor);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_MYT_Partes_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MYT_Partes_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        #endregion

        #region ASIGNAR TECNICO
        public void Asignar_Tecnico_Partes(long _lng_idTecnico,List<DataGridViewRow> _lst_dgvr_PartesNoAsignados)
        {
            try
            {
                g_frm_P_Visor.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                BackgroundWorker obj_TareaAsincrona_AsignarTecnicoParte = new BackgroundWorker();
                obj_TareaAsincrona_AsignarTecnicoParte.DoWork += new DoWorkEventHandler(TareaAsincrona_AsignarTecnicoParte_DoWork);
                obj_TareaAsincrona_AsignarTecnicoParte.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_AsignarTecnicoParte_Completed);

                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_lng_idTecnico);
                lst_Argumentos.Add(_lst_dgvr_PartesNoAsignados);

                obj_TareaAsincrona_AsignarTecnicoParte.RunWorkerAsync(lst_Argumentos);

                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_Visor.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(Asignar_Tecnico_Partes));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }

        private void TareaAsincrona_AsignarTecnicoParte_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = "";

            try
            {
                //Argumentos
                List<object> lst_Argumentos = (List<object>)e.Argument;
                long lng_idTecnico = (long)lst_Argumentos[0];
                List<DataGridViewRow> lst_dgvr_PartesNoAsignados = (List<DataGridViewRow>)lst_Argumentos[1];

                if (lst_dgvr_PartesNoAsignados != null && lst_dgvr_PartesNoAsignados.Count > 0)
                {
                    long lng_idParte = -1;
                    long lng_CodigoParte = 0;
                    foreach (DataGridViewRow dgv_ParteNoAsignado in lst_dgvr_PartesNoAsignados)
                    {
                        try
                        {
                            lng_idParte=long.Parse(dgv_ParteNoAsignado.Cells[nameof(INTERNO_MYT_Partes_Listado_Modelo.id)].Value.ToString());
                            lng_CodigoParte=long.Parse(dgv_ParteNoAsignado.Cells[nameof(INTERNO_MYT_Partes_Listado_Modelo.codigo)].Value.ToString());

                            //Actualizar el idTecnico
                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARTECNICO=g_obj_MYT_Partes_Datos.Actualizar_Tecnico(lng_idParte, lng_idTecnico);
                            if (mdl_INTERNO_ValorDevuelto_Modelo_ACTUALIZARTECNICO.TodoCorrecto)
                            {
                                #region SINCRONIZACION
                                Sincronizacion_ActualizarRegistro.Sincronizacion_ActualizarRegistro_PARTE_MYTHOS(lng_idParte,null);
                                #endregion
                            }
                            else
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje += Mensajes.G_STR_PARTES_ERROR_ACTUALIZARTECNICO("'Nº " + lng_CodigoParte + "'") + System.Environment.NewLine;
                            }
                        }
                        catch (Control_Errores)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje += Mensajes.G_STR_PARTES_ERROR_ACTUALIZARTECNICO("'Nº " + lng_CodigoParte + "'") + System.Environment.NewLine;
                        }
                        catch (Exception ex)
                        {
                            Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_AsignarTecnicoParte_DoWork));

                            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje += Mensajes.G_STR_PARTES_ERROR_ACTUALIZARTECNICO("'Nº " + lng_CodigoParte + "'") + System.Environment.NewLine;
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_AsignarTecnicoParte_DoWork));

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_AsignarTecnicoParte_DoWork));

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_AsignarTecnicoParte_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Visor.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
                {
                    g_frm_P_Visor.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Visor_Controladora) + "/" + nameof(TareaAsincrona_AsignarTecnicoParte_Completed));
            }
        }
        #endregion

    }
}
