using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General._0_Modelos;
using Exferia_General._1_Datos;
using Exferia_General.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_General._3_Vistas.Controladoras
{
    public class P_Permisos_Controladora
    {
        #region Variables Generales
        private P_Permisos g_frm_P_Permisos = null;//Variable que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc

        public bool g_bol_UsuarioActual_PermisosCambiados = false;

        //Objetos
        private PRV_Opcion_Objeto_Permiso_Datos g_obj_PRV_Opcion_Objeto_Permiso_Datos = new PRV_Opcion_Objeto_Permiso_Datos();
        private USR_Usuarios_Datos g_obj_USR_Usuarios_Datos = new USR_Usuarios_Datos();
        private USR_Perfiles_Datos g_obj_USR_Perfiles_Datos = new USR_Perfiles_Datos();
        private USR_Usuarios_Perfiles_Permisos_Datos g_obj_USR_Usuarios_Perfiles_Permisos_Datos = new USR_Usuarios_Perfiles_Permisos_Datos();
        private PRV_OpcionesDisponiblesParaCliente_Datos g_obj_PRV_OpcionesDisponiblesParaCliente_Datos = new PRV_OpcionesDisponiblesParaCliente_Datos();

        //Listados Generales Inciales
        List<INTERNO_PRV_PermisosOpciones_Modelo> g_lst_INTERNO_PRV_PermisosOpciones_Modelo = null;
        public List<USR_Usuarios> g_lst_USR_Usuarios = null;
        public List<USR_Perfiles> g_lst_USR_Perfiles = null;
        public List<string> g_lst_OpcionesDisponibles = null;

        //Variables de Bloqueo para Carga de Datos
        public bool g_bol_CargandoDatos_Usuarios_Permisos = false;
        public bool g_bol_CargandoDatos_Perfiles_Permisos = false;

        //Tarea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos_EnMemoria;
        private bool g_bol_CargarDatos_EnMemoria_Opciones = false;
        private bool g_bol_CargarDatos_EnMemoria_Usuarios = false;
        private bool g_bol_CargarDatos_EnMemoria_Perfiles = false;
        private long g_lng_idUsuario_Guardado = -1;
        private long g_lng_idPerfil_Guardado = -1;

        public string g_str_ValorCelda_CONPERMISO = "V";
        public string g_str_ValorCelda_SINPERMISO = "X";
        public string g_str_ValorCelda_VACIO = "";

        //Tareea Asincrona de grabar de datos
        private BackgroundWorker g_obj_TareaAsincrona_Grabar_Usuarios_Permisos;
        private BackgroundWorker g_obj_TareaAsincrona_Grabar_Perfiles_Permisos;

        //Tareea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_Borrar_Usuarios_Permisos;
        private BackgroundWorker g_obj_TareaAsincrona_Borrar_Perfiles_Permisos;
        private BackgroundWorker g_obj_TareaAsincrona_Borrar_Perfiles;
        private BackgroundWorker g_obj_TareaAsincrona_Borrar_Usuarios;

        public enum G_ENUM_ESTADOCELDA
        {
            CONPERMISO = 0,
            SINPERMISO = 1,
            VACIO = 2
        }

        #endregion

        #region DataGridView Posicion Campos
        //Usuarios Permisos
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_Opcion = 0;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_IdObjeto = 1;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_OpcionPadre = 2;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_OpcionPadre_Inicial = 3;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_ExpandirContraer = 4;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_Descripcion = 5;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_U = 6;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_P = 7;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_U = 8;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_P = 9;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_U = 10;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_P = 11;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_U = 12;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_P = 13;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_U = 14;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_P = 15;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_U = 16;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_P = 17;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_U = 18;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_P = 19;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_U = 20;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_P = 21;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_U = 22;
        public int g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_P = 23;

        //Perfiles Permisos
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_Opcion = 0;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_IdObjeto = 1;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_OpcionPadre = 2;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_OpcionPadre_Inicial = 3;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_ExpandirContraer = 4;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_Descripcion = 5;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_ADD_U = 6;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_MODIFICAR_U = 7;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_VER_U = 8;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_BORRAR_U = 9;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_SELECCIONAR_U = 10;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_OCULTAR_U = 11;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_BLOQUEAR_U = 12;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_EXPORTAREXCEL_U = 13;
        public int g_int_PosicionCampo_DataGridView_PerfilesPermisos_IMPRIMIR_U = 14;
        #endregion

        public P_Permisos_Controladora(P_Permisos _frm_P_Permisos)
        {
            g_frm_P_Permisos = _frm_P_Permisos;
        }

        #region Cargar Datos
        public void CargarDatos_EnMemoria(bool _bol_CargarDatos_EnMemoria_Opciones,
                                            bool _bol_CargarDatos_EnMemoria_Usuarios,
                                            bool _bol_CargarDatos_EnMemoria_Perfiles,
                                            long _lng_idUsuario_Guardado,
                                            long _lng_idPerfil_Guardado)
        {
            try
            {
                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                g_bol_CargarDatos_EnMemoria_Opciones = _bol_CargarDatos_EnMemoria_Opciones;
                g_bol_CargarDatos_EnMemoria_Usuarios = _bol_CargarDatos_EnMemoria_Usuarios;
                g_bol_CargarDatos_EnMemoria_Perfiles = _bol_CargarDatos_EnMemoria_Perfiles;
                g_lng_idUsuario_Guardado = _lng_idUsuario_Guardado;
                g_lng_idPerfil_Guardado = _lng_idPerfil_Guardado;

                //Vaciar Grid
                if (g_bol_CargarDatos_EnMemoria_Perfiles)
                {
                    g_frm_P_Permisos.Exferia_DataGridView_Perfiles.DataSource = null;
                }
                if (_bol_CargarDatos_EnMemoria_Usuarios)
                {
                    g_frm_P_Permisos.Exferia_DataGridView_Usuarios.DataSource = null;
                }

                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_Permisos.Enabled = false;

                //Bandera para que no grabe a la hora de cambiar los valores
                g_bol_CargandoDatos_Usuarios_Permisos = true;
                g_bol_CargandoDatos_Perfiles_Permisos = true;

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_CargarDatos_EnMemoria != null)
                {
                    while (g_obj_TareaAsincrona_CargarDatos_EnMemoria.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos_EnMemoria = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos_EnMemoria.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_EnMemoria_DoWork);
                    g_obj_TareaAsincrona_CargarDatos_EnMemoria.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargarDatos_EnMemoria_ProgressChanged);
                    g_obj_TareaAsincrona_CargarDatos_EnMemoria.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_EnMemoria_Completed);
                    g_obj_TareaAsincrona_CargarDatos_EnMemoria.WorkerReportsProgress = true;
                }

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                //Bandera para que no grabe a la hora de cambiar los valores
                g_bol_CargandoDatos_Usuarios_Permisos = false;
                g_bol_CargandoDatos_Perfiles_Permisos = false;

                g_frm_P_Permisos.Enabled = true;

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

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_Permisos_Controladora) + "/" + nameof(CargarDatos_EnMemoria), true);
            }
        }

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

            try
            {
                if (g_bol_CargarDatos_EnMemoria_Opciones)
                {
                    //Opciones Disponibles activas
                    g_lst_OpcionesDisponibles = g_obj_PRV_OpcionesDisponiblesParaCliente_Datos.Obtener_Listado_SoloOpciones();

                    //Listado de las opciones de permisos
                    g_lst_INTERNO_PRV_PermisosOpciones_Modelo = g_obj_PRV_Opcion_Objeto_Permiso_Datos.Obtener_Listado();

                    //filtros todos los permisos para obtener solo las opciones que estan en PRV_OpcionesDisponibles
                    if (g_lst_INTERNO_PRV_PermisosOpciones_Modelo!=null && 
                        g_lst_INTERNO_PRV_PermisosOpciones_Modelo.Count>0 &&
                        g_lst_OpcionesDisponibles != null &&
                        g_lst_OpcionesDisponibles.Count > 0)
                    {
                        g_lst_INTERNO_PRV_PermisosOpciones_Modelo = g_lst_INTERNO_PRV_PermisosOpciones_Modelo.Where(x => (x.opcionPadre != null ? g_lst_OpcionesDisponibles.Contains(x.opcionPadre) : g_lst_OpcionesDisponibles.Contains(x.opcion))).ToList();
                    }


                    // Cargar Valores Objetos ................................................
                    if (g_lst_INTERNO_PRV_PermisosOpciones_Modelo == null || g_lst_INTERNO_PRV_PermisosOpciones_Modelo.Count == 0)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                    }
                    else
                    {
                        foreach (var obj_valores in g_lst_INTERNO_PRV_PermisosOpciones_Modelo.Where(n => n.opcionPadre == null).GroupBy(m => new { m.descripcion,m.opcion })
                                                                                                                                           .Select(m => new
                                                                                                                                           {
                                                                                                                                               m.Key.opcion,
                                                                                                                                               m.Key.descripcion
                                                                                                                                           })
                                                                                                                                           .OrderBy(m => m.descripcion).ToList())
                        {

                            //Se Cancelo la tarea asincrona #########################
                            if (((BackgroundWorker)sender).CancellationPending)
                            {
                                e.Cancel = true;
                                return;
                            }

                            //Añadir Fila con Columnas .............................
                            Cargar_Opcion_E_Hijos(obj_valores.opcion, null, "", ((BackgroundWorker)sender), "");
                        }
                    }
                    //..........................................................................
                }

                //Perfiles
                if (g_bol_CargarDatos_EnMemoria_Perfiles)
                {
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        g_lst_USR_Perfiles = g_obj_USR_Perfiles_Datos.Obtener_ModeloListado(true);
                    }
                }
                //Usuarios
                if (g_bol_CargarDatos_EnMemoria_Usuarios)
                {
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        g_lst_USR_Usuarios = g_obj_USR_Usuarios_Datos.Obtener_ModeloListado_por_NoSuperusuario(true,true,true);
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_EnMemoria_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_EnMemoria_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargarDatos_EnMemoria_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Usuarios Permisos
                if (e.ProgressPercentage == 1)
                {
                    g_frm_P_Permisos.Exferia_DataGridView_Usuarios_Permisos.Rows.Add((DataGridViewRow)e.UserState);
                }
                //Pefiles Permisos
                else if (e.ProgressPercentage == 2)
                {
                    g_frm_P_Permisos.Exferia_DataGridView_Perfiles_Permisos.Rows.Add((DataGridViewRow)e.UserState);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_EnMemoria_ProgressChanged));
            }
        }
        private void TareaAsincrona_CargarDatos_EnMemoria_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_Permisos.Enabled = true;

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

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    g_frm_P_Permisos.Salir_P_Base();
                }
                else
                {

                    g_frm_P_Permisos.Exferia_DataGridView_Usuarios.AutoGenerateColumns = false;
                    g_frm_P_Permisos.Exferia_DataGridView_Perfiles.AutoGenerateColumns = false;

                    

                    //Cargar Valores en el DatagridView de Perfiles
                    if (g_bol_CargarDatos_EnMemoria_Perfiles)
                    {
                        g_frm_P_Permisos.Exferia_DataGridView_Perfiles.DataSource = g_lst_USR_Perfiles;

                        //Recargar permisos del perfil seleccionado
                        if (g_lng_idPerfil_Guardado != -1)
                        {
                            if (g_frm_P_Permisos.Exferia_DataGridView_Perfiles.SelectedRows.Count > 0)
                            {
                                //Si el registro seleccionado es diferente al guardado, se seleccionado el guardado
                                if (g_lng_idPerfil_Guardado != long.Parse(g_frm_P_Permisos.Exferia_DataGridView_Perfiles.SelectedRows[0].Cells[0].Value.ToString()))
                                {
                                    DataGridViewRow dgvr_Fila = g_frm_P_Permisos.Exferia_DataGridView_Perfiles.Rows
                                                        .Cast<DataGridViewRow>()
                                                        .Where(r => r.Cells[0].Value.ToString().Equals(g_lng_idPerfil_Guardado.ToString())).FirstOrDefault();

                                    if (dgvr_Fila != null)
                                    {
                                        g_frm_P_Permisos.Exferia_DataGridView_Perfiles.Rows[dgvr_Fila.Index].Selected = true;
                                        g_frm_P_Permisos.Exferia_DataGridView_Perfiles.FirstDisplayedScrollingRowIndex = dgvr_Fila.Index;
                                    }
                                }
                                //SIno se recargar los permisos del registro
                                else
                                {
                                    //Bloquear
                                    g_bol_CargandoDatos_Perfiles_Permisos = true;

                                    //Cargar los Datos del nuevo registro seleccionado
                                    Cargar_Permisos_PerfilSeleccionado(g_lng_idPerfil_Guardado);

                                    //Desbloquear
                                    g_bol_CargandoDatos_Perfiles_Permisos = false;
                                }
                            }
                        }
                    }

                    //Cargar Valores en le DatagridView de Usuarios
                    if (g_bol_CargarDatos_EnMemoria_Usuarios)
                    {
                        g_frm_P_Permisos.Exferia_DataGridView_Usuarios.DataSource = g_lst_USR_Usuarios;

                        //Recargar permisos del usuario seleccionado
                        if (g_lng_idUsuario_Guardado != -1)
                        {
                            if (g_frm_P_Permisos.Exferia_DataGridView_Usuarios.SelectedRows.Count > 0)
                            {
                                //Si el registro seleccionado es diferente al guardado, se seleccionado el guardado
                                if (g_lng_idUsuario_Guardado != long.Parse(g_frm_P_Permisos.Exferia_DataGridView_Usuarios.SelectedRows[0].Cells[0].Value.ToString()))
                                {
                                    DataGridViewRow dgvr_Fila = g_frm_P_Permisos.Exferia_DataGridView_Usuarios.Rows
                                                        .Cast<DataGridViewRow>()
                                                        .Where(r => r.Cells[0].Value.ToString().Equals(g_lng_idUsuario_Guardado.ToString())).FirstOrDefault();

                                    if (dgvr_Fila != null)
                                    {
                                        g_frm_P_Permisos.Exferia_DataGridView_Usuarios.Rows[dgvr_Fila.Index].Selected = true;
                                        g_frm_P_Permisos.Exferia_DataGridView_Usuarios.FirstDisplayedScrollingRowIndex = dgvr_Fila.Index;
                                    }
                                }
                                //SIno se recargar los permisos del registro
                                else
                                {
                                    //Bloquear
                                    g_bol_CargandoDatos_Usuarios_Permisos = true;

                                    //Cargar los Datos del nuevo registro seleccionado
                                    Cargar_Permisos_UsuarioSeleccionado(g_lng_idUsuario_Guardado);

                                    //Desbloquear
                                    g_bol_CargandoDatos_Usuarios_Permisos = false;
                                }
                            }
                        }

                        //Si el usuario guardado es igual al usuario validado y se cambio el perfil se pone para que recargue los premisos del arbol,etc
                        if (Variables.G_MDL_USUARIOVALIDADO_MODELO.id.Equals(g_lng_idUsuario_Guardado))
                        {
                            long lng_idPerfil_UsuarioValidadoAplicacion = Variables.G_MDL_USUARIOVALIDADO_MODELO.idPerfil != null ? Variables.G_MDL_USUARIOVALIDADO_MODELO.idPerfil.Value : -1;

                            //Usuario Guardado
                            USR_Usuarios mdl_USR_Usuarios = g_lst_USR_Usuarios.Where(m => m.id.Equals(g_lng_idUsuario_Guardado)).FirstOrDefault();
                            long lng_idPerfil_UsuarioGuardado = (mdl_USR_Usuarios != null && mdl_USR_Usuarios.idPerfil != null) ? mdl_USR_Usuarios.idPerfil.Value : -1;
                            if (!lng_idPerfil_UsuarioValidadoAplicacion.Equals(lng_idPerfil_UsuarioGuardado))
                            {
                                g_bol_UsuarioActual_PermisosCambiados = true;
                            }
                        }
                    }

                    #region Codigo para que el ScrollView Vertical salga correcto
                    //perfiles
                    g_frm_P_Permisos.Exferia_DataGridView_Perfiles_Permisos.SuspendLayout();
                    g_frm_P_Permisos.Exferia_DataGridView_Perfiles_Permisos.ResumeLayout();

                    //usuarios
                    g_frm_P_Permisos.Exferia_DataGridView_Usuarios_Permisos.SuspendLayout();
                    g_frm_P_Permisos.Exferia_DataGridView_Usuarios_Permisos.ResumeLayout();
                    #endregion
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_EnMemoria_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Permisos.Salir_P_Base();
            }
            finally
            {
                g_bol_CargandoDatos_Usuarios_Permisos = false;
                g_bol_CargandoDatos_Perfiles_Permisos = false;
            }
        }

        private void Cargar_Opcion_E_Hijos(string _str_Opcion, long? _lng_idObjeto, string _str_OpcionPadre, BackgroundWorker _obj_BackgroundWorker, string _str_OpcionPadre_Inicial)
        {
            //Permisos Permitidos
            List<int> lst_PermisosPermitidos = new List<int>();
            INTERNO_PRV_PermisosOpciones_Modelo mdl_INTERNO_PRV_PermisosOpciones_Modelo_AUX = null;

            //Objeto ##############################
            if (_lng_idObjeto != null)
            {
                foreach (INTERNO_PRV_PermisosOpciones_Modelo mdl_INTERNO_PRV_PermisosOpciones_Modelo in g_lst_INTERNO_PRV_PermisosOpciones_Modelo
                                                                                .Where(n => n.idObjeto != null && n.idObjeto.Value.Equals(_lng_idObjeto) &&
                                                                                            (_str_OpcionPadre.Trim().Length > 0 ? (n.opcionPadre != null && n.opcionPadre.Equals(_str_OpcionPadre)) : n.opcionPadre == null))
                                                                                .ToList())
                {
                    lst_PermisosPermitidos.Add(mdl_INTERNO_PRV_PermisosOpciones_Modelo.idPermiso);
                }
                //Para tener los otros datos necesarios
                mdl_INTERNO_PRV_PermisosOpciones_Modelo_AUX = g_lst_INTERNO_PRV_PermisosOpciones_Modelo
                                                                                                    .Where(n => n.idObjeto != null && n.idObjeto.Value.Equals(_lng_idObjeto) &&
                                                                                                                    (_str_OpcionPadre.Trim().Length > 0 ? (n.opcionPadre != null && n.opcionPadre.Equals(_str_OpcionPadre)) : n.opcionPadre == null))
                                                                                                    .FirstOrDefault();

            }
            //Opcion ##############################
            else
            {
                foreach (INTERNO_PRV_PermisosOpciones_Modelo mdl_INTERNO_PRV_PermisosOpciones_Modelo in g_lst_INTERNO_PRV_PermisosOpciones_Modelo
                                                                                .Where(n => n.opcion != null && n.opcion.Equals(_str_Opcion) &&
                                                                                            (_str_OpcionPadre.Trim().Length > 0 ? (n.opcionPadre != null && n.opcionPadre.Equals(_str_OpcionPadre)) : n.opcionPadre == null))
                                                                                .ToList())
                {
                    lst_PermisosPermitidos.Add(mdl_INTERNO_PRV_PermisosOpciones_Modelo.idPermiso);
                }
                //Para tener los otrso datos necesarios
                mdl_INTERNO_PRV_PermisosOpciones_Modelo_AUX = g_lst_INTERNO_PRV_PermisosOpciones_Modelo
                                                                                                    .Where(n => n.opcion != null && n.opcion.Equals(_str_Opcion) &&
                                                                                                                    (_str_OpcionPadre.Trim().Length > 0 ? (n.opcionPadre != null && n.opcionPadre.Equals(_str_OpcionPadre)) : n.opcionPadre == null))
                                                                                                    .FirstOrDefault();

            }

            //Saber si es Hijo o Padre
            bool bol_Hijo = false;
            if (_str_OpcionPadre.Trim().Length > 0)
            {
                bol_Hijo = true;
            }

            //Usuarios
            DataGridViewRow obj_DataGridViewRow = Transformar_Modelo_A_Row_PermisosOpciones_Usuarios(lst_PermisosPermitidos, mdl_INTERNO_PRV_PermisosOpciones_Modelo_AUX, bol_Hijo, _str_OpcionPadre_Inicial);
            _obj_BackgroundWorker.ReportProgress(1, obj_DataGridViewRow);
            Thread.Sleep(1);

            //Perfiles
            obj_DataGridViewRow = Transformar_Modelo_A_Row_PermisosOpciones_Perfiles(lst_PermisosPermitidos, mdl_INTERNO_PRV_PermisosOpciones_Modelo_AUX, bol_Hijo, _str_OpcionPadre_Inicial);
            _obj_BackgroundWorker.ReportProgress(2, obj_DataGridViewRow);
            Thread.Sleep(1);


            if (_str_OpcionPadre_Inicial.Trim().Length == 0)
            {
                _str_OpcionPadre_Inicial = _str_Opcion;
            }

            //Opciones Hijas
            foreach (string str_OpcionesHijas in g_lst_INTERNO_PRV_PermisosOpciones_Modelo
                                                                            .Where(n => n.opcion != null && n.opcionPadre != null && n.opcionPadre.Equals(_str_Opcion))
                                                                            .GroupBy(m => m.opcion)
                                                                            .OrderBy(m => m.Key).Select(m => m.Key).ToList())
            {
                Cargar_Opcion_E_Hijos(str_OpcionesHijas, null, _str_Opcion, _obj_BackgroundWorker, _str_OpcionPadre_Inicial);
            }

            //Objetos Hijos
            foreach (long lng_idObjeto in g_lst_INTERNO_PRV_PermisosOpciones_Modelo
                                                                            .Where(n => n.idObjeto != null && n.opcionPadre != null && n.opcionPadre.Equals(_str_Opcion) && n.idObjeto != null)
                                                                            .GroupBy(m => m.idObjeto.Value)
                                                                            .OrderBy(m => m.Key).Select(m => m.Key).ToList())
            {
                Cargar_Opcion_E_Hijos("", lng_idObjeto, _str_Opcion, _obj_BackgroundWorker, _str_OpcionPadre_Inicial);
            }

        }

        private DataGridViewRow Transformar_Modelo_A_Row_PermisosOpciones_Usuarios(List<int> _lst_PermisosPermitidos, INTERNO_PRV_PermisosOpciones_Modelo _mdl_INTERNO_PRV_PermisosOpciones_Modelo, bool _bol_Hijo, string _str_OpcionPadre_Inicial)
        {
            DataGridViewRow obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Permisos.Exferia_DataGridView_Usuarios_Permisos.RowTemplate.Clone();
            obj_DataGridViewRow.CreateCells(g_frm_P_Permisos.Exferia_DataGridView_Usuarios_Permisos);

            // Rellenamos las celdas de la fila
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_Opcion].Value = _mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcion != null ? _mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcion : "";
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IdObjeto].Value = _mdl_INTERNO_PRV_PermisosOpciones_Modelo.idObjeto;
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OpcionPadre].Value = _mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcionPadre != null ? _mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcionPadre : "";
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OpcionPadre_Inicial].Value = _str_OpcionPadre_Inicial;
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ExpandirContraer].Value = "/";
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ExpandirContraer].ToolTipText = "Contraer";

            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_Descripcion].Value = (_mdl_INTERNO_PRV_PermisosOpciones_Modelo.idObjeto != null ? _mdl_INTERNO_PRV_PermisosOpciones_Modelo.ObjetoDescripcion_AMostrar : _mdl_INTERNO_PRV_PermisosOpciones_Modelo.descripcion);

            //AÑADIR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Anadir))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_P], G_ENUM_ESTADOCELDA.VACIO, false, true);
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_P].ReadOnly = true;
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //MODIFICAR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Modificar))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_P], G_ENUM_ESTADOCELDA.VACIO, false, true);
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_P].ReadOnly = true;
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //VER
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Ver))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_P], G_ENUM_ESTADOCELDA.VACIO, false, true);
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_P].ReadOnly = true;
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //BORRAR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Borrar))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_P], G_ENUM_ESTADOCELDA.VACIO, false, true);
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_P].ReadOnly = true;
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //SELECCIONAR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Seleccionar))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_P], G_ENUM_ESTADOCELDA.VACIO, false, true);
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_P].ReadOnly = true;
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //OCULTAR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Ocultar))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_P], G_ENUM_ESTADOCELDA.VACIO, false, true);
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_P].ReadOnly = true;
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //BLOQUEAR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Bloquear))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_P], G_ENUM_ESTADOCELDA.VACIO, false, true);
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_P].ReadOnly = true;
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //EXPORTAR A EXCEL
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.ExportarAExcel))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_P], G_ENUM_ESTADOCELDA.VACIO, false, true);
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_P].ReadOnly = true;
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //IMPRIMIR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Imprimir))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_P], G_ENUM_ESTADOCELDA.VACIO, false, true);
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_P].ReadOnly = true;
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                //..... Perfil
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //Sino tiene permisos, se ponen como readonly las celdas
            if (Datos_Generales.Permisos_Comprobar(g_frm_P_Permisos.g_mdl_INTERNO_OpcionesDetalle_Modelo.opcion, g_frm_P_Permisos.g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Modificar, false) == false)
            {
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_U].ReadOnly = true;
            }

            return obj_DataGridViewRow;
        }
        private DataGridViewRow Transformar_Modelo_A_Row_PermisosOpciones_Perfiles(List<int> _lst_PermisosPermitidos, INTERNO_PRV_PermisosOpciones_Modelo _mdl_INTERNO_PRV_PermisosOpciones_Modelo, bool _bol_Hijo, string _str_OpcionPadre_Inicial)
        {
            DataGridViewRow obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Permisos.Exferia_DataGridView_Perfiles_Permisos.RowTemplate.Clone();
            obj_DataGridViewRow.CreateCells(g_frm_P_Permisos.Exferia_DataGridView_Perfiles_Permisos);

            // Rellenamos las celdas de la fila
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_Opcion].Value = _mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcion != null ? _mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcion : "";
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_IdObjeto].Value = _mdl_INTERNO_PRV_PermisosOpciones_Modelo.idObjeto;
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_OpcionPadre].Value = _mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcionPadre != null ? _mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcionPadre : "";
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_OpcionPadre_Inicial].Value = _str_OpcionPadre_Inicial;
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_ExpandirContraer].Value = "/";
            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_ExpandirContraer].ToolTipText = "Contraer";

            obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_Descripcion].Value = (_mdl_INTERNO_PRV_PermisosOpciones_Modelo.idObjeto != null ? _mdl_INTERNO_PRV_PermisosOpciones_Modelo.ObjetoDescripcion_AMostrar : _mdl_INTERNO_PRV_PermisosOpciones_Modelo.descripcion);

            //AÑADIR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Anadir))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_ADD_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_ADD_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //MODIFICAR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Modificar))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_MODIFICAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_MODIFICAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //VER
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Ver))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_VER_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_VER_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //BORRAR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Borrar))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BORRAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BORRAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //SELECCIONAR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Seleccionar))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_SELECCIONAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_SELECCIONAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //OCULTAR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Ocultar))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_OCULTAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_OCULTAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //BLOQUEAR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Bloquear))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BLOQUEAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BLOQUEAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //EXPORTAR A EXCEL
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.ExportarAExcel))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_EXPORTAREXCEL_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_EXPORTAREXCEL_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //IMPRIMIR
            if (_lst_PermisosPermitidos.Contains((int)G_ENUM_PERMISOS.Imprimir))
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_IMPRIMIR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
            }
            else
            {
                Cambio_Texto_Celda_Permiso_Perfil(obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_IMPRIMIR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
            }

            //Si no tiene permisos PARA MODIFICAR, se ponen como readonly las celdas
            if (Datos_Generales.Permisos_Comprobar(g_frm_P_Permisos.g_mdl_INTERNO_OpcionesDetalle_Modelo.opcion, g_frm_P_Permisos.g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Modificar, false) == false)
            {
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_ADD_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_MODIFICAR_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_VER_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BORRAR_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_SELECCIONAR_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_OCULTAR_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BLOQUEAR_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_EXPORTAREXCEL_U].ReadOnly = true;
                obj_DataGridViewRow.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_IMPRIMIR_U].ReadOnly = true;
            }

            return obj_DataGridViewRow;
        }
        #endregion

        private INTERNO_PRV_PermisosOpciones_Modelo Devolver_INTERNO_PRV_PermisosOpciones_Modelo(string _str_Opcion, long? _lng_idObjeto, string _str_OpcionPadre, int _int_idPermiso)
        {
            INTERNO_PRV_PermisosOpciones_Modelo mdl_INTERNO_PRV_PermisosOpciones_Modelo = null;
            //Por objeto
            if (_lng_idObjeto != null)
            {
                mdl_INTERNO_PRV_PermisosOpciones_Modelo = g_lst_INTERNO_PRV_PermisosOpciones_Modelo.Where(m => (m.idObjeto != null) &&
                                                                     (m.idObjeto.Value.Equals(_lng_idObjeto.Value)) &&
                                                                     (_str_OpcionPadre.Trim().Length > 0 ? m.opcionPadre.Equals(_str_OpcionPadre) : 1 == 1) &&
                                                                     (m.idPermiso.Equals(_int_idPermiso))
                                                               ).FirstOrDefault();
            }
            //Por opcion
            else
            {
                mdl_INTERNO_PRV_PermisosOpciones_Modelo = g_lst_INTERNO_PRV_PermisosOpciones_Modelo.Where(m => (m.opcion != null) &&
                                                                     (m.opcion.Equals(_str_Opcion)) &&
                                                                     (_str_OpcionPadre.Trim().Length > 0 ? (m.opcionPadre != null && m.opcionPadre.Equals(_str_OpcionPadre)) : 1 == 1) &&
                                                                     (m.idPermiso.Equals(_int_idPermiso))
                                                               ).FirstOrDefault();
            }

            return mdl_INTERNO_PRV_PermisosOpciones_Modelo;
        }

        #region Usuarios
        public void Cargar_Permisos_UsuarioSeleccionado(long _lng_idUsuario_Seleccionado)
        {
            try
            {

                //Quitar valores Desmarcados
                foreach (DataGridViewRow n in g_frm_P_Permisos.Exferia_DataGridView_Usuarios_Permisos.Rows.Cast<DataGridViewRow>().ToList())
                {
                    //AÑADIR ##################################
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }
                    //..... Perfil
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_P].Tag.ToString().Equals("1"))
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
                    }
                    else
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_P], G_ENUM_ESTADOCELDA.CONPERMISO, false, true);
                        n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_P].ReadOnly = true;
                    }

                    //MODIFICAR ##################################
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_U], G_ENUM_ESTADOCELDA.VACIO, false, false);

                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }
                    //..... Perfil
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_P].Tag.ToString().Equals("1"))
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
                    }
                    else
                    {
                        //..... Perfil
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_P], G_ENUM_ESTADOCELDA.VACIO, false, true);
                        n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_P].ReadOnly = true;
                    }

                    //VER ##################################
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }
                    //..... Perfil
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_P].Tag.ToString().Equals("1"))
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
                    }
                    else
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_P], G_ENUM_ESTADOCELDA.CONPERMISO, false, true);
                        n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_P].ReadOnly = true;
                    }

                    //BORRAR ##################################
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }
                    //..... Perfil
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_P].Tag.ToString().Equals("1"))
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
                    }
                    else
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_P], G_ENUM_ESTADOCELDA.CONPERMISO, false, true);
                        n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_P].ReadOnly = true;
                    }

                    //SELECCIONAR ##################################
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }
                    //..... Perfil
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_P].Tag.ToString().Equals("1"))
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
                    }
                    else
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_P], G_ENUM_ESTADOCELDA.CONPERMISO, false, true);
                        n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_P].ReadOnly = true;
                    }

                    //OCULTAR ##################################
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }
                    //..... Perfil
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_P].Tag.ToString().Equals("1"))
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
                    }
                    else
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_P], G_ENUM_ESTADOCELDA.CONPERMISO, false, true);
                        n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_P].ReadOnly = true;
                    }

                    //BLOQUEAR ##################################
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }
                    //..... Perfil
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_P].Tag.ToString().Equals("1"))
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
                    }
                    else
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_P], G_ENUM_ESTADOCELDA.CONPERMISO, false, true);
                        n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_P].ReadOnly = true;
                    }

                    //EXPORTAR A EXCEL ##################################
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }
                    //..... Perfil
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_P].Tag.ToString().Equals("1"))
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
                    }
                    else
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_P], G_ENUM_ESTADOCELDA.CONPERMISO, false, true);
                        n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_P].ReadOnly = true;
                    }

                    //IMPRIMIR ##################################
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_U], G_ENUM_ESTADOCELDA.VACIO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }
                    //..... Perfil
                    if (n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_P].Tag.ToString().Equals("1"))
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_P], G_ENUM_ESTADOCELDA.VACIO, true, false);
                    }
                    else
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_P], G_ENUM_ESTADOCELDA.CONPERMISO, false, true);
                        n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_P].ReadOnly = true;
                    }
                };

                //Marcar valores segun usuario selecccionado
                //1º Buscar el Usuario en el Listado
                USR_Usuarios mdl_USR_Usuarios = g_lst_USR_Usuarios.Where(m => m.id.Equals(_lng_idUsuario_Seleccionado)).FirstOrDefault();
                if (mdl_USR_Usuarios != null)
                {
                    //Valores del Usuario
                    if (mdl_USR_Usuarios.USR_Usuarios_Perfiles_Permisos != null)
                    {
                        DataGridViewRow dgvr_Fila = null;
                        foreach (USR_Usuarios_Perfiles_Permisos mdl_USR_Usuarios_Perfiles_Permisos in mdl_USR_Usuarios.USR_Usuarios_Perfiles_Permisos)
                        {
                            //Si es un permiso pàra idObjeto
                            if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idObjeto != null)
                            {
                                dgvr_Fila = g_frm_P_Permisos.Exferia_DataGridView_Usuarios_Permisos.Rows.Cast<DataGridViewRow>()
                                                                                                     .Where(n => n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IdObjeto].Value != null &&
                                                                                                                 n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IdObjeto].Value.ToString().Equals(mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idObjeto.Value.ToString()))
                                                                                                    .FirstOrDefault();
                            }
                            //Si es Permiso para opcion
                            else
                            {
                                dgvr_Fila = g_frm_P_Permisos.Exferia_DataGridView_Usuarios_Permisos.Rows.Cast<DataGridViewRow>()
                                                                                                    .Where(n => n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_Opcion].Value != null &&
                                                                                                                n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_Opcion].Value.ToString().Equals(mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.opcion))
                                                                                                   .FirstOrDefault();
                            }

                            if (dgvr_Fila != null)
                            {
                                //AÑADIR
                                if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Anadir))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_U].ReadOnly == false)
                                    {
                                        if (mdl_USR_Usuarios_Perfiles_Permisos.conPermiso)
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                                        }
                                        else
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                        }

                                    }
                                }
                                //MODIFICAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Modificar))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_U].ReadOnly == false)
                                    {
                                        if (mdl_USR_Usuarios_Perfiles_Permisos.conPermiso)
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                                        }
                                        else
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                        }
                                    }
                                }
                                //VER
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Ver))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_U].ReadOnly == false)
                                    {
                                        if (mdl_USR_Usuarios_Perfiles_Permisos.conPermiso)
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                                        }
                                        else
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                        }
                                    }
                                }
                                //BORRAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Borrar))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_U].ReadOnly == false)
                                    {
                                        if (mdl_USR_Usuarios_Perfiles_Permisos.conPermiso)
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                                        }
                                        else
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                        }
                                    }
                                }
                                //SELECCIONAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Seleccionar))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_U].ReadOnly == false)
                                    {
                                        if (mdl_USR_Usuarios_Perfiles_Permisos.conPermiso)
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                                        }
                                        else
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                        }
                                    }
                                }
                                //OCULTAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Ocultar))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_U].ReadOnly == false)
                                    {
                                        if (mdl_USR_Usuarios_Perfiles_Permisos.conPermiso)
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                                        }
                                        else
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                        }
                                    }
                                }
                                //BLOQUEAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Bloquear))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_U].ReadOnly == false)
                                    {
                                        if (mdl_USR_Usuarios_Perfiles_Permisos.conPermiso)
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                                        }
                                        else
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                        }
                                    }
                                }
                                //EXPORTAR A EXCEL
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.ExportarAExcel))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_U].ReadOnly == false)
                                    {
                                        if (mdl_USR_Usuarios_Perfiles_Permisos.conPermiso)
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                                        }
                                        else
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                        }
                                    }
                                }
                                //IMPRIMIR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Imprimir))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_U].ReadOnly == false)
                                    {
                                        if (mdl_USR_Usuarios_Perfiles_Permisos.conPermiso)
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                                        }
                                        else
                                        {
                                            Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                        }
                                    }
                                }
                            }
                        }
                    }

                    //Valores del perfil
                    if (mdl_USR_Usuarios.USR_Perfiles != null && mdl_USR_Usuarios.USR_Perfiles.USR_Usuarios_Perfiles_Permisos != null)
                    {
                        DataGridViewRow dgvr_Fila = null;
                        foreach (USR_Usuarios_Perfiles_Permisos mdl_USR_Usuarios_Perfiles_Permisos in mdl_USR_Usuarios.USR_Perfiles.USR_Usuarios_Perfiles_Permisos)
                        {
                            //Si es un permiso pàra idObjeto
                            if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idObjeto != null)
                            {
                                dgvr_Fila = g_frm_P_Permisos.Exferia_DataGridView_Usuarios_Permisos.Rows.Cast<DataGridViewRow>()
                                                                                                     .Where(n => n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IdObjeto].Value != null &&
                                                                                                                 n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IdObjeto].Value.ToString().Equals(mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idObjeto.Value.ToString()))
                                                                                                    .FirstOrDefault();
                            }
                            //Si es Permiso para opcion
                            else
                            {
                                dgvr_Fila = g_frm_P_Permisos.Exferia_DataGridView_Usuarios_Permisos.Rows.Cast<DataGridViewRow>()
                                                                                                    .Where(n => n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_Opcion].Value != null &&
                                                                                                                n.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_Opcion].Value.ToString().Equals(mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.opcion))
                                                                                                   .FirstOrDefault();
                            }

                            if (dgvr_Fila != null)
                            {
                                //AÑADIR
                                if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Anadir))
                                {

                                    Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_P], G_ENUM_ESTADOCELDA.SINPERMISO, false, true);
                                    dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_P].ReadOnly = true;

                                }
                                //MODIFICAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Modificar))
                                {

                                    Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_P], G_ENUM_ESTADOCELDA.SINPERMISO, false, true);
                                    dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_P].ReadOnly = true;

                                }
                                //VER
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Ver))
                                {

                                    Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_P], G_ENUM_ESTADOCELDA.SINPERMISO, false, true);
                                    dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_P].ReadOnly = true;

                                }
                                //BORRAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Borrar))
                                {

                                    Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_P], G_ENUM_ESTADOCELDA.SINPERMISO, false, true);
                                    dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_P].ReadOnly = true;

                                }
                                //SELECCIONAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Seleccionar))
                                {

                                    Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_P], G_ENUM_ESTADOCELDA.SINPERMISO, false, true);
                                    dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_P].ReadOnly = true;

                                }
                                //OCULTAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Ocultar))
                                {

                                    Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_P], G_ENUM_ESTADOCELDA.SINPERMISO, false, true);
                                    dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_P].ReadOnly = true;

                                }
                                //BLOQUEAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Bloquear))
                                {

                                    Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_P], G_ENUM_ESTADOCELDA.SINPERMISO, false, true);
                                    dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_P].ReadOnly = true;

                                }
                                //EXPORTAR A EXCEL
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.ExportarAExcel))
                                {

                                    Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_P], G_ENUM_ESTADOCELDA.SINPERMISO, false, true);
                                    dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_P].ReadOnly = true;

                                }
                                //IMPRIMIR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Imprimir))
                                {

                                    Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_P], G_ENUM_ESTADOCELDA.SINPERMISO, false, true);
                                    dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_P].ReadOnly = true;

                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(Cargar_Permisos_UsuarioSeleccionado) + "/" + nameof(P_Permisos_Controladora));
            }
        }

        private int Devolver_idPermiso_Segun_Columna_Usuarios(int _int_ColumnaAModificar)
        {
            int int_idPermiso = 0;

            //AÑADIR
            if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_UsuariosPermisos_ADD_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Anadir;
            }
            //MODIFICAR
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_UsuariosPermisos_MODIFICAR_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Modificar;
            }
            //VER
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_UsuariosPermisos_VER_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Ver;
            }
            //BORRAR
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_UsuariosPermisos_BORRAR_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Borrar;
            }
            //SELECCIONAR
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_UsuariosPermisos_SELECCIONAR_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Seleccionar;
            }
            //OCULTAR
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_UsuariosPermisos_OCULTAR_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Ocultar;
            }
            //BLOQUEAR
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_UsuariosPermisos_BLOQUEAR_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Bloquear;
            }
            //EXPORTAR A EXCEL
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_UsuariosPermisos_EXPORTAREXCEL_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.ExportarAExcel;
            }
            //IMPRIMIR
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_UsuariosPermisos_IMPRIMIR_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Imprimir;
            }
            return int_idPermiso;
        }

        #region Grabar Permiso de Usuario
        public void Grabar_Usuarios_Permisos(long _lng_idUsuario, string _str_Opcion, long? _lng_idObjeto, int _int_ColumnaAModificar, string _str_OpcionPadre, bool _bol_conPermiso)
        {
            try
            {
                g_frm_P_Permisos.Enabled = false;

                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());
                g_frm_PE_Esperando.Show();

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_Grabar_Usuarios_Permisos != null)
                {
                    while (g_obj_TareaAsincrona_Grabar_Usuarios_Permisos.IsBusy)
                        Application.DoEvents();

                }
                else
                {
                    g_obj_TareaAsincrona_Grabar_Usuarios_Permisos = new BackgroundWorker();
                    g_obj_TareaAsincrona_Grabar_Usuarios_Permisos.DoWork += new DoWorkEventHandler(TareaAsincrona_Grabar_Usuarios_Permisos_DoWork);
                    g_obj_TareaAsincrona_Grabar_Usuarios_Permisos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Grabar_Usuarios_Permisos_Completed);
                }

                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_lng_idUsuario);
                lst_Argumentos.Add(_str_Opcion);
                lst_Argumentos.Add(_lng_idObjeto);
                lst_Argumentos.Add(_int_ColumnaAModificar);
                lst_Argumentos.Add(_str_OpcionPadre);
                lst_Argumentos.Add(_bol_conPermiso);

                g_obj_TareaAsincrona_Grabar_Usuarios_Permisos.RunWorkerAsync(lst_Argumentos);
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                g_frm_P_Permisos.Enabled = true;

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

            try
            {
                List<object> lst_Argumentos = (List<object>)e.Argument;

                long lng_idUsuario = (long)lst_Argumentos[0];
                string str_Opcion = (string)lst_Argumentos[1];
                long? lng_idObjeto = (long?)lst_Argumentos[2];
                int int_ColumnaAModificar = (int)lst_Argumentos[3];
                string str_OpcionPadre = (string)lst_Argumentos[4];
                bool bol_conPermiso = (bool)lst_Argumentos[5];

                // Validar Primero
                mdl_ValorDevuelto_Modelo = Grabar_Usuarios_Permisos_Final(lng_idUsuario, str_Opcion, lng_idObjeto, int_ColumnaAModificar, str_OpcionPadre, bol_conPermiso);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_Grabar_Usuarios_Permisos_DoWork));

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_Grabar_Usuarios_Permisos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Permisos.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);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_Grabar_Usuarios_Permisos_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo Grabar_Usuarios_Permisos_Final(long _lng_idUsuario, string _str_Opcion, long? _lng_idObjeto, int _int_ColumnaAModificar, string _str_OpcionPadre, bool _bol_conPermiso)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Buscar el idPermiso
                int int_idPermiso = Devolver_idPermiso_Segun_Columna_Usuarios(_int_ColumnaAModificar);

                //Buscar el idOpciones_Objetos_Permisos que corresponda
                INTERNO_PRV_PermisosOpciones_Modelo mdl_INTERNO_PRV_PermisosOpciones_Modelo = Devolver_INTERNO_PRV_PermisosOpciones_Modelo(_str_Opcion, _lng_idObjeto, _str_OpcionPadre, int_idPermiso);

                if (mdl_INTERNO_PRV_PermisosOpciones_Modelo != null)
                {
                    //Rellenar el Modelo a Grabar
                    USR_Usuarios_Perfiles_Permisos mdl_USR_Usuarios_Perfiles_Permisos = new USR_Usuarios_Perfiles_Permisos();
                    mdl_USR_Usuarios_Perfiles_Permisos.idUsuario = _lng_idUsuario;
                    mdl_USR_Usuarios_Perfiles_Permisos.idPerfil = null;
                    mdl_USR_Usuarios_Perfiles_Permisos.idOpciones_Objetos_Permisos = mdl_INTERNO_PRV_PermisosOpciones_Modelo.idOpcion_Objeto_Permiso;
                    mdl_USR_Usuarios_Perfiles_Permisos.conPermiso = _bol_conPermiso;

                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_USR_Usuarios_Perfiles_Permisos_Datos.Grabar(mdl_USR_Usuarios_Perfiles_Permisos);

                    //Si eta todo Correcto, actualizo el listado en memoria del usuario seleccionado
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Poner los datos de la tabla de PRV_Opcion_Objeto_Permiso
                        PRV_Opcion_Objeto_Permiso mdl_PRV_Opcion_Objeto_Permiso = new PRV_Opcion_Objeto_Permiso();
                        mdl_PRV_Opcion_Objeto_Permiso.id = mdl_INTERNO_PRV_PermisosOpciones_Modelo.idOpcion_Objeto_Permiso;
                        mdl_PRV_Opcion_Objeto_Permiso.opcion = mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcion;
                        mdl_PRV_Opcion_Objeto_Permiso.idPermiso = mdl_INTERNO_PRV_PermisosOpciones_Modelo.idPermiso;
                        mdl_PRV_Opcion_Objeto_Permiso.idObjeto = mdl_INTERNO_PRV_PermisosOpciones_Modelo.idObjeto;
                        mdl_PRV_Opcion_Objeto_Permiso.opcionPadre = mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcionPadre;
                        mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso = mdl_PRV_Opcion_Objeto_Permiso;

                        //Valores del Usuario
                        if (g_lst_USR_Usuarios[g_lst_USR_Usuarios.IndexOf(g_lst_USR_Usuarios.Where(m => m.id.Equals(_lng_idUsuario)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos != null)
                        {
                            var obj_Buscado = g_lst_USR_Usuarios[g_lst_USR_Usuarios.IndexOf(g_lst_USR_Usuarios.Where(m => m.id.Equals(_lng_idUsuario)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos
                                                                                    .Where(m =>
                                                                                        (mdl_USR_Usuarios_Perfiles_Permisos.idUsuario != null ? (m.idUsuario != null && m.idUsuario.Value.Equals(mdl_USR_Usuarios_Perfiles_Permisos.idUsuario.Value)) : 1 == 1) &&
                                                                                        (mdl_USR_Usuarios_Perfiles_Permisos.idPerfil != null ? (m.idPerfil != null && m.idPerfil.Value.Equals(mdl_USR_Usuarios_Perfiles_Permisos.idPerfil.Value)) : 1 == 1) &&
                                                                                        (m.idOpciones_Objetos_Permisos.Equals(mdl_USR_Usuarios_Perfiles_Permisos.idOpciones_Objetos_Permisos))
                                                                                    ).FirstOrDefault();
                            if (obj_Buscado != null)
                            {
                                obj_Buscado.conPermiso = _bol_conPermiso;
                            }
                            else
                            {
                                g_lst_USR_Usuarios[g_lst_USR_Usuarios.IndexOf(g_lst_USR_Usuarios.Where(m => m.id.Equals(_lng_idUsuario)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos.Add(mdl_USR_Usuarios_Perfiles_Permisos);
                            }
                        }
                        else
                        {
                            List<USR_Usuarios_Perfiles_Permisos> lst_Auxiliar = new List<USR_Usuarios_Perfiles_Permisos>();
                            lst_Auxiliar.Add(mdl_USR_Usuarios_Perfiles_Permisos);
                            g_lst_USR_Usuarios[g_lst_USR_Usuarios.IndexOf(g_lst_USR_Usuarios.Where(m => m.id.Equals(_lng_idUsuario)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos = lst_Auxiliar;
                        }

                        //Usuario Actual se han cambiado los permisos
                        if (Variables.G_MDL_USUARIOVALIDADO_MODELO.id.Equals(_lng_idUsuario))
                        {
                            g_bol_UsuarioActual_PermisosCambiados = true;
                        }
                    }
                }
                else
                {
                    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.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(Grabar_Usuarios_Permisos));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar Permiso de Usuario
        public void Borrar_Usuarios_Permisos(long _lng_idUsuario, string _str_Opcion, long? _lng_idObjeto, int _int_ColumnaAModificar, string _str_OpcionPadre)
        {
            try
            {
                g_frm_P_Permisos.Enabled = false;

                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());//Se pone grabando aunque se borre de base de datos, para el usuario es grabar
                g_frm_PE_Esperando.Show();

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_Borrar_Usuarios_Permisos != null)
                {
                    while (g_obj_TareaAsincrona_Borrar_Usuarios_Permisos.IsBusy)
                        Application.DoEvents();

                }
                else
                {
                    g_obj_TareaAsincrona_Borrar_Usuarios_Permisos = new BackgroundWorker();
                    g_obj_TareaAsincrona_Borrar_Usuarios_Permisos.DoWork += new DoWorkEventHandler(TareaAsincrona_Borrar_Usuarios_Permisos_DoWork);
                    g_obj_TareaAsincrona_Borrar_Usuarios_Permisos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Borrar_Usuarios_Permisos_Completed);
                }

                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_lng_idUsuario);
                lst_Argumentos.Add(_str_Opcion);
                lst_Argumentos.Add(_lng_idObjeto);
                lst_Argumentos.Add(_int_ColumnaAModificar);
                lst_Argumentos.Add(_str_OpcionPadre);

                g_obj_TareaAsincrona_Borrar_Usuarios_Permisos.RunWorkerAsync(lst_Argumentos);
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                g_frm_P_Permisos.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(Borrar_Usuarios_Permisos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());//Se pone grabando aunque se borre de base de datos, para el usuario es grabar
            }
        }
        private void TareaAsincrona_Borrar_Usuarios_Permisos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                List<object> lst_Argumentos = (List<object>)e.Argument;

                long lng_idUsuario = (long)lst_Argumentos[0];
                string str_Opcion = (string)lst_Argumentos[1];
                long? lng_idObjeto = (long?)lst_Argumentos[2];
                int int_ColumnaAModificar = (int)lst_Argumentos[3];
                string str_OpcionPadre = (string)lst_Argumentos[4];

                // Validar Primero
                mdl_ValorDevuelto_Modelo = Borrar_Usuarios_Permisos_Final(lng_idUsuario, str_Opcion, lng_idObjeto, int_ColumnaAModificar, str_OpcionPadre);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Usuarios_Permisos_DoWork));

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_Borrar_Usuarios_Permisos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Permisos.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);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Usuarios_Permisos_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo Borrar_Usuarios_Permisos_Final(long _lng_idUsuario, string _str_Opcion, long? _lng_idObjeto, int _int_ColumnaAModificar, string _str_OpcionPadre)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Buscar el idPermiso
                int int_idPermiso = Devolver_idPermiso_Segun_Columna_Usuarios(_int_ColumnaAModificar);

                //Buscar el idOpciones_Objetos_Permisos que corresponda
                INTERNO_PRV_PermisosOpciones_Modelo mdl_INTERNO_PRV_PermisosOpciones_Modelo = Devolver_INTERNO_PRV_PermisosOpciones_Modelo(_str_Opcion, _lng_idObjeto, _str_OpcionPadre, int_idPermiso);

                if (mdl_INTERNO_PRV_PermisosOpciones_Modelo != null)
                {
                    //Borrar
                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_USR_Usuarios_Perfiles_Permisos_Datos.Borrar(_lng_idUsuario, null, mdl_INTERNO_PRV_PermisosOpciones_Modelo.idOpcion_Objeto_Permiso);

                    //Si eta todo Correcto, actualizo el listado en memoria del usuario seleccionado
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Valores del Usuario
                        if (g_lst_USR_Usuarios[g_lst_USR_Usuarios.IndexOf(g_lst_USR_Usuarios.Where(m => m.id.Equals(_lng_idUsuario)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos != null)
                        {
                            var obj_Buscado = g_lst_USR_Usuarios[g_lst_USR_Usuarios.IndexOf(g_lst_USR_Usuarios.Where(m => m.id.Equals(_lng_idUsuario)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos
                                                                                    .Where(m =>
                                                                                        (m.idUsuario != null) &&
                                                                                        (m.idUsuario.Value.Equals(_lng_idUsuario)) &&
                                                                                        (m.idOpciones_Objetos_Permisos.Equals(mdl_INTERNO_PRV_PermisosOpciones_Modelo.idOpcion_Objeto_Permiso))
                                                                                    ).FirstOrDefault();
                            if (obj_Buscado != null)
                            {
                                g_lst_USR_Usuarios[g_lst_USR_Usuarios.IndexOf(g_lst_USR_Usuarios.Where(m => m.id.Equals(_lng_idUsuario)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos.Remove(obj_Buscado);
                            }
                        }

                        //Usuario Actual se han cambiado los permisos
                        if (Variables.G_MDL_USUARIOVALIDADO_MODELO.id.Equals(_lng_idUsuario))
                        {
                            g_bol_UsuarioActual_PermisosCambiados = true;
                        }
                    }
                }
                else
                {
                    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.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(Borrar_Usuarios_Permisos));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar Usuario
        public void Borrar_Usuario(long _lng_idUsuario)
        {
            try
            {
                g_frm_P_Permisos.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());
                g_frm_PE_Esperando.Show();

                g_obj_TareaAsincrona_Borrar_Usuarios = new BackgroundWorker();
                g_obj_TareaAsincrona_Borrar_Usuarios.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarUsuarios_DoWork);
                g_obj_TareaAsincrona_Borrar_Usuarios.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarUsuarios_Completed);
                g_obj_TareaAsincrona_Borrar_Usuarios.RunWorkerAsync(_lng_idUsuario);
            }
            catch (Exception ex)
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }

                g_frm_P_Permisos.Enabled = true;

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

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

            try
            {
                long lng_idUsuario = (long)e.Argument;

                // Borrar 
                mdl_ValorDevuelto_Modelo = BorrarUsuarios_Final(lng_idUsuario);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_BorrarUsuarios_DoWork));

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_BorrarUsuarios_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }
            g_frm_P_Permisos.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_Permisos.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion, Variables.G_STR_OPCION_GEN_USUARIO);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_BorrarUsuarios_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarUsuarios_Final(long _lng_idUsuario)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_USR_Usuarios_Datos.Borrar(_lng_idUsuario);

                return mdl_INTERNO_ValorDevuelto_Modelo;
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(BorrarUsuarios_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion
        #endregion

        #region Perfiles
        public void Cargar_Permisos_PerfilSeleccionado(long _lng_idPerfil_Seleccionado)
        {
            try
            {
                //Quitar valores Desmarcados
                g_frm_P_Permisos.Exferia_DataGridView_Perfiles_Permisos.Rows.Cast<DataGridViewRow>().ToList().ForEach(n =>
                {
                    //AÑADIR
                    if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_ADD_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_ADD_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_ADD_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_ADD_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }

                    //MODIFICAR
                    if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_MODIFICAR_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_MODIFICAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_MODIFICAR_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_MODIFICAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }

                    //VER
                    if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_VER_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_VER_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_VER_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_VER_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }

                    //BORRAR
                    if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BORRAR_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BORRAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BORRAR_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BORRAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }

                    //SELECCIONAR
                    if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_SELECCIONAR_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_SELECCIONAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_SELECCIONAR_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_SELECCIONAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }

                    //OCULTAR
                    if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_OCULTAR_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_OCULTAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_OCULTAR_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_OCULTAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }

                    //BLOQUEAR
                    if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BLOQUEAR_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BLOQUEAR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BLOQUEAR_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BLOQUEAR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }

                    //EXPORTAR A EXCEL
                    if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_EXPORTAREXCEL_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_EXPORTAREXCEL_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_EXPORTAREXCEL_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_EXPORTAREXCEL_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }

                    //IMPRMIR
                    if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_IMPRIMIR_U].ReadOnly == false)
                    {
                        Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_IMPRIMIR_U], G_ENUM_ESTADOCELDA.CONPERMISO, false, false);
                    }
                    else
                    {
                        if (n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_IMPRIMIR_U].Tag.ToString().Equals("1"))
                        {
                            Cambio_Texto_Celda_Permiso_Perfil(n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_IMPRIMIR_U], G_ENUM_ESTADOCELDA.VACIO, true, false);
                        }
                    }
                });

                //Marcar valores segun usuario selecccionado
                //1º Buscar el Perfil en el Listado
                USR_Perfiles mdl_USR_Perfiles = g_lst_USR_Perfiles.Where(m => m.id.Equals(_lng_idPerfil_Seleccionado)).FirstOrDefault();
                if (mdl_USR_Perfiles != null)
                {
                    //Valores del Usuario
                    if (mdl_USR_Perfiles.USR_Usuarios_Perfiles_Permisos != null)
                    {
                        DataGridViewRow dgvr_Fila = null;
                        foreach (USR_Usuarios_Perfiles_Permisos mdl_USR_Usuarios_Perfiles_Permisos in mdl_USR_Perfiles.USR_Usuarios_Perfiles_Permisos)
                        {
                            //Si es un permiso pàra idObjeto
                            if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idObjeto != null)
                            {
                                dgvr_Fila = g_frm_P_Permisos.Exferia_DataGridView_Perfiles_Permisos.Rows.Cast<DataGridViewRow>()
                                                                                                     .Where(n => n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_IdObjeto].Value != null &&
                                                                                                                 n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_IdObjeto].Value.ToString().Equals(mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idObjeto.Value.ToString()))
                                                                                                    .FirstOrDefault();
                            }
                            //Si es Permiso para opcion
                            else
                            {
                                dgvr_Fila = g_frm_P_Permisos.Exferia_DataGridView_Perfiles_Permisos.Rows.Cast<DataGridViewRow>()
                                                                                                    .Where(n => n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_Opcion].Value != null &&
                                                                                                                n.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_Opcion].Value.ToString().Equals(mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.opcion))
                                                                                                   .FirstOrDefault();
                            }

                            if (dgvr_Fila != null)
                            {
                                //AÑADIR
                                if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Anadir))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_ADD_U].ReadOnly == false)
                                    {
                                        Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_ADD_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                    }
                                }
                                //MODIFICAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Modificar))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_MODIFICAR_U].ReadOnly == false)
                                    {
                                        Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_MODIFICAR_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                    }
                                }
                                //VER
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Ver))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_VER_U].ReadOnly == false)
                                    {
                                        Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_VER_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                    }
                                }
                                //BORRAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Borrar))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BORRAR_U].ReadOnly == false)
                                    {
                                        Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BORRAR_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                    }
                                }
                                //SELECCIONAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Seleccionar))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_SELECCIONAR_U].ReadOnly == false)
                                    {
                                        Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_SELECCIONAR_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                    }
                                }
                                //OCULTAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Ocultar))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_OCULTAR_U].ReadOnly == false)
                                    {
                                        Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_OCULTAR_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                    }
                                }
                                //BLOQUEAR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Bloquear))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BLOQUEAR_U].ReadOnly == false)
                                    {
                                        Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_BLOQUEAR_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                    }
                                }
                                //EXPORTAR A EXCEL
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.ExportarAExcel))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_EXPORTAREXCEL_U].ReadOnly == false)
                                    {
                                        Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_EXPORTAREXCEL_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                    }
                                }
                                //IMPRIMIR
                                else if (mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso.idPermiso.Equals((int)G_ENUM_PERMISOS.Imprimir))
                                {
                                    if (dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_IMPRIMIR_U].ReadOnly == false)
                                    {
                                        Cambio_Texto_Celda_Permiso_Perfil(dgvr_Fila.Cells[g_int_PosicionCampo_DataGridView_PerfilesPermisos_IMPRIMIR_U], G_ENUM_ESTADOCELDA.SINPERMISO, false, false);
                                    }
                                }
                            }
                        }
                    }

                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(Cargar_Permisos_PerfilSeleccionado) + "/" + nameof(P_Permisos_Controladora));
            }
        }
        private int Devolver_idPermiso_Segun_Columna_Perfiles(int _int_ColumnaAModificar)
        {
            int int_idPermiso = 0;

            //AÑADIR
            if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_PerfilesPermisos_ADD_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Anadir;
            }
            //MODIFICAR
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_PerfilesPermisos_MODIFICAR_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Modificar;
            }
            //VER
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_PerfilesPermisos_VER_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Ver;
            }
            //BORRAR
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_PerfilesPermisos_BORRAR_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Borrar;
            }
            //SELECCIONAR
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_PerfilesPermisos_SELECCIONAR_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Seleccionar;
            }
            //OCULTAR
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_PerfilesPermisos_OCULTAR_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Ocultar;
            }
            //BLOQUEAR
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_PerfilesPermisos_BLOQUEAR_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Bloquear;
            }
            //EXPORTAR A EXCEL
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_PerfilesPermisos_EXPORTAREXCEL_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.ExportarAExcel;
            }
            //IMPRIMIR
            else if (_int_ColumnaAModificar.Equals(g_int_PosicionCampo_DataGridView_PerfilesPermisos_IMPRIMIR_U))
            {
                int_idPermiso = (int)G_ENUM_PERMISOS.Imprimir;
            }
            return int_idPermiso;
        }

        #region Grabar Permiso de Perfil
        public void Grabar_Perfiles_Permisos(long _lng_idPerfil, string _str_Opcion, long? _lng_idObjeto, int _int_ColumnaAModificar, string _str_OpcionPadre)
        {
            try
            {
                g_frm_P_Permisos.Enabled = false;

                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());
                g_frm_PE_Esperando.Show();

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_Grabar_Perfiles_Permisos != null)
                {
                    while (g_obj_TareaAsincrona_Grabar_Perfiles_Permisos.IsBusy)
                        Application.DoEvents();

                }
                else
                {
                    g_obj_TareaAsincrona_Grabar_Perfiles_Permisos = new BackgroundWorker();
                    g_obj_TareaAsincrona_Grabar_Perfiles_Permisos.DoWork += new DoWorkEventHandler(TareaAsincrona_Grabar_Perfiles_Permisos_DoWork);
                    g_obj_TareaAsincrona_Grabar_Perfiles_Permisos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Grabar_Perfiles_Permisos_Completed);
                }

                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_lng_idPerfil);
                lst_Argumentos.Add(_str_Opcion);
                lst_Argumentos.Add(_lng_idObjeto);
                lst_Argumentos.Add(_int_ColumnaAModificar);
                lst_Argumentos.Add(_str_OpcionPadre);

                g_obj_TareaAsincrona_Grabar_Perfiles_Permisos.RunWorkerAsync(lst_Argumentos);
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                g_frm_P_Permisos.Enabled = true;

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

            try
            {
                List<object> lst_Argumentos = (List<object>)e.Argument;

                long lng_idPerfil = (long)lst_Argumentos[0];
                string str_Opcion = (string)lst_Argumentos[1];
                long? lng_idObjeto = (long?)lst_Argumentos[2];
                int int_ColumnaAModificar = (int)lst_Argumentos[3];
                string str_OpcionPadre = (string)lst_Argumentos[4];

                // Validar Primero
                mdl_ValorDevuelto_Modelo = Grabar_Perfiles_Permisos_Final(lng_idPerfil, str_Opcion, lng_idObjeto, int_ColumnaAModificar, str_OpcionPadre);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_Grabar_Perfiles_Permisos_DoWork));

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_Grabar_Perfiles_Permisos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Permisos.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);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_Grabar_Perfiles_Permisos_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo Grabar_Perfiles_Permisos_Final(long _lng_idPerfil, string _str_Opcion, long? _lng_idObjeto, int _int_ColumnaAModificar, string _str_OpcionPadre)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Buscar el idPermiso
                int int_idPermiso = Devolver_idPermiso_Segun_Columna_Perfiles(_int_ColumnaAModificar);

                //Buscar el idOpciones_Objetos_Permisos que corresponda
                INTERNO_PRV_PermisosOpciones_Modelo mdl_INTERNO_PRV_PermisosOpciones_Modelo = Devolver_INTERNO_PRV_PermisosOpciones_Modelo(_str_Opcion, _lng_idObjeto, _str_OpcionPadre, int_idPermiso);

                if (mdl_INTERNO_PRV_PermisosOpciones_Modelo != null)
                {
                    //Rellenar el Modelo a Grabar
                    USR_Usuarios_Perfiles_Permisos mdl_USR_Usuarios_Perfiles_Permisos = new USR_Usuarios_Perfiles_Permisos();
                    mdl_USR_Usuarios_Perfiles_Permisos.idUsuario = null;
                    mdl_USR_Usuarios_Perfiles_Permisos.idPerfil = _lng_idPerfil;
                    mdl_USR_Usuarios_Perfiles_Permisos.idOpciones_Objetos_Permisos = mdl_INTERNO_PRV_PermisosOpciones_Modelo.idOpcion_Objeto_Permiso;
                    mdl_USR_Usuarios_Perfiles_Permisos.conPermiso = false;

                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_USR_Usuarios_Perfiles_Permisos_Datos.Grabar(mdl_USR_Usuarios_Perfiles_Permisos);

                    //Si eta todo Correcto, actualizo el listado en memoria del usuario seleccionado
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Poner los datos de la tabla de PRV_Opcion_Objeto_Permiso
                        PRV_Opcion_Objeto_Permiso mdl_PRV_Opcion_Objeto_Permiso = new PRV_Opcion_Objeto_Permiso();
                        mdl_PRV_Opcion_Objeto_Permiso.id = mdl_INTERNO_PRV_PermisosOpciones_Modelo.idOpcion_Objeto_Permiso;
                        mdl_PRV_Opcion_Objeto_Permiso.opcion = mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcion;
                        mdl_PRV_Opcion_Objeto_Permiso.idPermiso = mdl_INTERNO_PRV_PermisosOpciones_Modelo.idPermiso;
                        mdl_PRV_Opcion_Objeto_Permiso.idObjeto = mdl_INTERNO_PRV_PermisosOpciones_Modelo.idObjeto;
                        mdl_PRV_Opcion_Objeto_Permiso.opcionPadre = mdl_INTERNO_PRV_PermisosOpciones_Modelo.opcionPadre;
                        mdl_USR_Usuarios_Perfiles_Permisos.PRV_Opcion_Objeto_Permiso = mdl_PRV_Opcion_Objeto_Permiso;

                        //Valores del Perfil
                        if (g_lst_USR_Perfiles[g_lst_USR_Perfiles.IndexOf(g_lst_USR_Perfiles.Where(m => m.id.Equals(_lng_idPerfil)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos != null)
                        {
                            var obj_Buscado = g_lst_USR_Perfiles[g_lst_USR_Perfiles.IndexOf(g_lst_USR_Perfiles.Where(m => m.id.Equals(_lng_idPerfil)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos
                                                                                    .Where(m =>
                                                                                        (mdl_USR_Usuarios_Perfiles_Permisos.idUsuario != null ? (m.idUsuario != null && m.idUsuario.Value.Equals(mdl_USR_Usuarios_Perfiles_Permisos.idUsuario.Value)) : 1 == 1) &&
                                                                                        (mdl_USR_Usuarios_Perfiles_Permisos.idPerfil != null ? (m.idPerfil != null && m.idPerfil.Value.Equals(mdl_USR_Usuarios_Perfiles_Permisos.idPerfil.Value)) : 1 == 1) &&
                                                                                        (m.idOpciones_Objetos_Permisos.Equals(mdl_USR_Usuarios_Perfiles_Permisos.idOpciones_Objetos_Permisos))
                                                                                    ).FirstOrDefault();
                            if (obj_Buscado == null)
                            {
                                g_lst_USR_Perfiles[g_lst_USR_Perfiles.IndexOf(g_lst_USR_Perfiles.Where(m => m.id.Equals(_lng_idPerfil)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos.Add(mdl_USR_Usuarios_Perfiles_Permisos);
                            }
                        }
                        else
                        {
                            List<USR_Usuarios_Perfiles_Permisos> lst_Auxiliar = new List<USR_Usuarios_Perfiles_Permisos>();
                            lst_Auxiliar.Add(mdl_USR_Usuarios_Perfiles_Permisos);
                            g_lst_USR_Perfiles[g_lst_USR_Perfiles.IndexOf(g_lst_USR_Perfiles.Where(m => m.id.Equals(_lng_idPerfil)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos = lst_Auxiliar;
                        }

                        //Actualizar los datos del perfil de los usuarios que lo tengan
                        Actualizar_DataGridView_Usuarios_SegunPerfil(_lng_idPerfil);
                    }
                }
                else
                {
                    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.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(Grabar_Perfiles_Permisos));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar Permiso de Perfil
        public void Borrar_Perfiles_Permisos(long _lng_idPerfil, string _str_Opcion, long? _lng_idObjeto, int _int_ColumnaAModificar, string _str_OpcionPadre)
        {
            try
            {
                g_frm_P_Permisos.Enabled = false;

                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());//Se pone grabando aunque se borre de base de datos, para el usuario es grabar
                g_frm_PE_Esperando.Show();

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_Borrar_Perfiles_Permisos != null)
                {
                    while (g_obj_TareaAsincrona_Borrar_Perfiles_Permisos.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_Borrar_Perfiles_Permisos = new BackgroundWorker();
                    g_obj_TareaAsincrona_Borrar_Perfiles_Permisos.DoWork += new DoWorkEventHandler(TareaAsincrona_Borrar_Perfiles_Permisos_DoWork);
                    g_obj_TareaAsincrona_Borrar_Perfiles_Permisos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Borrar_Perfiles_Permisos_Completed);
                }

                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_lng_idPerfil);
                lst_Argumentos.Add(_str_Opcion);
                lst_Argumentos.Add(_lng_idObjeto);
                lst_Argumentos.Add(_int_ColumnaAModificar);
                lst_Argumentos.Add(_str_OpcionPadre);

                g_obj_TareaAsincrona_Borrar_Perfiles_Permisos.RunWorkerAsync(lst_Argumentos);
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                g_frm_P_Permisos.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(Borrar_Perfiles_Permisos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());//Se pone grabando aunque se borre de base de datos, para el usuario es grabar
            }
        }
        private void TareaAsincrona_Borrar_Perfiles_Permisos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                List<object> lst_Argumentos = (List<object>)e.Argument;

                long lng_idPerfil = (long)lst_Argumentos[0];
                string str_Opcion = (string)lst_Argumentos[1];
                long? lng_idObjeto = (long?)lst_Argumentos[2];
                int int_ColumnaAModificar = (int)lst_Argumentos[3];
                string str_OpcionPadre = (string)lst_Argumentos[4];

                // Validar Primero
                mdl_ValorDevuelto_Modelo = Borrar_Perfiles_Permisos_Final(lng_idPerfil, str_Opcion, lng_idObjeto, int_ColumnaAModificar, str_OpcionPadre);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Perfiles_Permisos_DoWork));

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_Borrar_Perfiles_Permisos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Permisos.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);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Perfiles_Permisos_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo Borrar_Perfiles_Permisos_Final(long _lng_idPerfil, string _str_Opcion, long? _lng_idObjeto, int _int_ColumnaAModificar, string _str_OpcionPadre)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Buscar el idPermiso
                int int_idPermiso = Devolver_idPermiso_Segun_Columna_Perfiles(_int_ColumnaAModificar);

                //Buscar el idOpciones_Objetos_Permisos que corresponda
                INTERNO_PRV_PermisosOpciones_Modelo mdl_INTERNO_PRV_PermisosOpciones_Modelo = Devolver_INTERNO_PRV_PermisosOpciones_Modelo(_str_Opcion, _lng_idObjeto, _str_OpcionPadre, int_idPermiso);

                if (mdl_INTERNO_PRV_PermisosOpciones_Modelo != null)
                {
                    //Borrar
                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_USR_Usuarios_Perfiles_Permisos_Datos.Borrar(null, _lng_idPerfil, mdl_INTERNO_PRV_PermisosOpciones_Modelo.idOpcion_Objeto_Permiso);

                    //Si eta todo Correcto, actualizo el listado en memoria del Perfil seleccionado
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Valores del Perfiles
                        if (g_lst_USR_Perfiles[g_lst_USR_Perfiles.IndexOf(g_lst_USR_Perfiles.Where(m => m.id.Equals(_lng_idPerfil)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos != null)
                        {
                            var obj_Buscado = g_lst_USR_Perfiles[g_lst_USR_Perfiles.IndexOf(g_lst_USR_Perfiles.Where(m => m.id.Equals(_lng_idPerfil)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos
                                                                                    .Where(m =>
                                                                                        (m.idPerfil != null) &&
                                                                                        (m.idPerfil.Value.Equals(_lng_idPerfil)) &&
                                                                                        (m.idOpciones_Objetos_Permisos.Equals(mdl_INTERNO_PRV_PermisosOpciones_Modelo.idOpcion_Objeto_Permiso))
                                                                                    ).FirstOrDefault();
                            if (obj_Buscado != null)
                            {
                                g_lst_USR_Perfiles[g_lst_USR_Perfiles.IndexOf(g_lst_USR_Perfiles.Where(m => m.id.Equals(_lng_idPerfil)).FirstOrDefault())].USR_Usuarios_Perfiles_Permisos.Remove(obj_Buscado);

                                //Actualizar los datos del perfil de los usuarios que lo tengan
                                Actualizar_DataGridView_Usuarios_SegunPerfil(_lng_idPerfil);
                            }
                        }
                    }
                }
                else
                {
                    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.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(Borrar_Perfiles_Permisos));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        private void Actualizar_DataGridView_Usuarios_SegunPerfil(long _lng_idPerfil)
        {
            //Usuario Seleccionado Actualmente
            long lng_idUsuarioSeleccionado = -1;
            if (g_frm_P_Permisos.Exferia_DataGridView_Usuarios.SelectedRows.Count > 0)
            {
                //Cargar los Datos del nuevo registro seleccionado
                lng_idUsuarioSeleccionado = long.Parse(g_frm_P_Permisos.Exferia_DataGridView_Usuarios.SelectedRows[0].Cells[0].Value.ToString());
            }

            foreach (USR_Usuarios mdl_USR_Usuarios in g_lst_USR_Usuarios.Where(m => m.idPerfil != null && m.idPerfil.Equals(_lng_idPerfil)).ToList())
            {
                g_lst_USR_Usuarios[g_lst_USR_Usuarios.IndexOf(g_lst_USR_Usuarios.Where(m => m.id.Equals(mdl_USR_Usuarios.id)).FirstOrDefault())].USR_Perfiles = g_lst_USR_Perfiles[g_lst_USR_Perfiles.IndexOf(g_lst_USR_Perfiles.Where(m => m.id.Equals(_lng_idPerfil)).FirstOrDefault())];

                if (lng_idUsuarioSeleccionado == mdl_USR_Usuarios.id)
                {
                    //Bloquear
                    g_bol_CargandoDatos_Usuarios_Permisos = true;

                    //Cargar los Datos del nuevo registro seleccionado
                    Cargar_Permisos_UsuarioSeleccionado(lng_idUsuarioSeleccionado);

                    //Desbloquear
                    g_bol_CargandoDatos_Usuarios_Permisos = false;
                }

                //Usuario Actual se han cambiado los permisos
                if (Variables.G_MDL_USUARIOVALIDADO_MODELO.id.Equals(mdl_USR_Usuarios.id))
                {
                    g_bol_UsuarioActual_PermisosCambiados = true;
                }
            }
        }

        #endregion

        #region Borrar Perfil
        public void Borrar_Perfil(long _lng_idPerfil)
        {
            try
            {
                g_frm_P_Permisos.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());
                g_frm_PE_Esperando.Show();

                g_obj_TareaAsincrona_Borrar_Perfiles = new BackgroundWorker();
                g_obj_TareaAsincrona_Borrar_Perfiles.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarPerfiles_DoWork);
                g_obj_TareaAsincrona_Borrar_Perfiles.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarPerfiles_Completed);
                g_obj_TareaAsincrona_Borrar_Perfiles.RunWorkerAsync(_lng_idPerfil);
            }
            catch (Exception ex)
            {
                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }

                g_frm_P_Permisos.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(Borrar_Perfil));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarPerfiles_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                long lng_idPerfil = (long)e.Argument;

                // Borrar 
                mdl_ValorDevuelto_Modelo = BorrarPerfiles_Final(lng_idPerfil);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_BorrarPerfiles_DoWork));

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_BorrarPerfiles_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!g_frm_PE_Esperando.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }
            g_frm_P_Permisos.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_Permisos.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion, Variables.G_STR_OPCION_GEN_PERFIL);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Permisos_Controladora) + "/" + nameof(TareaAsincrona_BorrarPerfiles_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarPerfiles_Final(long _lng_idPerfil)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {

                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_USR_Perfiles_Datos.Borrar(_lng_idPerfil);

                //Usuario Actual se han cambiado los permisos
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    if (Variables.G_MDL_USUARIOVALIDADO_MODELO.idPerfil != null && Variables.G_MDL_USUARIOVALIDADO_MODELO.idPerfil.Value.Equals(_lng_idPerfil))
                    {
                        g_bol_UsuarioActual_PermisosCambiados = true;
                    }
                }

                return mdl_INTERNO_ValorDevuelto_Modelo;
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Permisos_Controladora) + "/" + nameof(BorrarPerfiles_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #endregion

        public void Cambio_Texto_Celda_Permiso_Perfil(DataGridViewCell _dgvc_Celda, G_ENUM_ESTADOCELDA _enum_EstadoCelda, bool _bol_Bloquear, bool _bol_ColumnaperfilEnUsuario)
        {
            //Tiene permiso
            if (_enum_EstadoCelda.Equals(G_ENUM_ESTADOCELDA.CONPERMISO))
            {
                _dgvc_Celda.Value = g_str_ValorCelda_CONPERMISO;

                if (_bol_ColumnaperfilEnUsuario)
                {
                    _dgvc_Celda.Style.BackColor = Colores.G_COLOR_FONDO_PERMISOS_PERFILES;
                    _dgvc_Celda.Style.SelectionBackColor = Colores.G_COLOR_FONDO_PERMISOS_PERFILES;
                }
                else
                {
                    _dgvc_Celda.Style.BackColor = Colores.G_COLOR_FONDO_PERMISOS_NORMAL;
                    _dgvc_Celda.Style.SelectionBackColor = Colores.G_COLOR_FONDO_PERMISOS_NORMAL;
                }

                _dgvc_Celda.Style.ForeColor = Colores.G_COLOR_LETRA_PERMISOS_CON;
                _dgvc_Celda.Style.SelectionForeColor = Colores.G_COLOR_LETRA_PERMISOS_CON;
            }
            //No tiene Permiso
            else if (_enum_EstadoCelda.Equals(G_ENUM_ESTADOCELDA.SINPERMISO))
            {
                _dgvc_Celda.Value = g_str_ValorCelda_SINPERMISO;
                if (_bol_ColumnaperfilEnUsuario)
                {
                    _dgvc_Celda.Style.BackColor = Colores.G_COLOR_FONDO_PERMISOS_PERFILES;
                    _dgvc_Celda.Style.SelectionBackColor = Colores.G_COLOR_FONDO_PERMISOS_PERFILES;
                }
                else
                {
                    _dgvc_Celda.Style.BackColor = Colores.G_COLOR_FONDO_PERMISOS_NORMAL;
                    _dgvc_Celda.Style.SelectionBackColor = Colores.G_COLOR_FONDO_PERMISOS_NORMAL;
                }

                _dgvc_Celda.Style.ForeColor = Colores.G_COLOR_LETRA_PERMISOS_SIN;
                _dgvc_Celda.Style.SelectionForeColor = Colores.G_COLOR_LETRA_PERMISOS_SIN;
            }
            //Vacio
            else
            {
                _dgvc_Celda.Value = g_str_ValorCelda_VACIO;

                if (_bol_ColumnaperfilEnUsuario)
                {
                    _dgvc_Celda.Style.BackColor = Colores.G_COLOR_FONDO_PERMISOS_PERFILES;
                    _dgvc_Celda.Style.SelectionBackColor = Colores.G_COLOR_FONDO_PERMISOS_PERFILES;
                }
                else
                {
                    _dgvc_Celda.Style.BackColor = Colores.G_COLOR_FONDO_PERMISOS_NORMAL;
                    _dgvc_Celda.Style.SelectionBackColor = Colores.G_COLOR_FONDO_PERMISOS_NORMAL;
                }
            }
            _dgvc_Celda.Tag = "0";

            //Bloquear
            if (_bol_Bloquear)
            {
                _dgvc_Celda.ReadOnly = true;
                _dgvc_Celda.Style.BackColor = Colores.G_COLOR_FONDO_BLOQUEADO;
                _dgvc_Celda.Style.SelectionBackColor = Colores.G_COLOR_FONDO_BLOQUEADO;
                _dgvc_Celda.Tag = "1";
            }
        }

    }
}
