using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Exferia_Aplicacion.Visualizacion;
using System.Reflection;
using Exferia_Aplicacion.General;
using System.Threading;
using Exferia_Formularios;
using static Exferia_Aplicacion.General.Enumerados;
using Exferia_EntityFramework;
using Exferia_General;

namespace Exferia_Controles
{
    public partial class Exferia_F3_SoloSeleccion_Simple : UserControl
    {
        //Se utiliza para entrar en el codigo desde otra libreria
        public void Prueba()
        {}

        #region Variables Privadas
        private BackgroundWorker g_TareaAsincrona_Buscar;
        private BackgroundWorker g_TareaAsincrona_Buscar_RegistroPorId;

        private string g_str_Filtro = "";
        private string g_str_CampoBusqueda = "";

        private ABS_F3 g_obj_ABS_F3 = null;
        private INTERNO_OpcionesDetalle_Modelo g_mdl_INTERNO_OpcionesDetalle_Modelo = null;

        internal List<INTERNO_Permisos_Modelo> g_lst_INTERNO_Permisos_Modelo = null;

        private bool g_bol_Cambio_Codigo = false;

        private PE_Esperando g_frm_PE_Esperando;
        #endregion

        #region Propiedades Publicas

        private long g_lng_TEMPORAL = -1;
        public long Exferia_F3_SoloSeleccion_Simple_PRINCIPAL_TEMPORAL_LONG
        {
            set
            {
                g_lng_TEMPORAL = value;
            }
            get
            {
                return g_lng_TEMPORAL;
            }
        }

        public void Colores_Inciales()
        {
            if (g_bol_Obligatorio)
            {
                ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_OBLIGATORIO;
            }
            else
            {
                ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_BASE;
            }
        }

        internal P_Base g_P_Base_Contenedor = null;
        public P_Base Exferia_F3_SoloSeleccion_Simple_PantallaContenedora
        {
            set
            {
                g_P_Base_Contenedor = value;
            }
        }

        private ABS_Listado g_obj_ABS_Listado = null;
        public ABS_Listado Exferia_F3_SoloSeleccion_Simple_ABS_Listado
        {
            set
            {
                g_obj_ABS_Listado = value;
            }
        }

        internal object g_obj_Filtro_Auxiliar = null;
        public object Exferia_F3_SoloSeleccion_Simple_Filtro_Auxiliar
        {
            set
            {
                g_obj_Filtro_Auxiliar = value;
            }
        }

        internal string g_str_NombreOpcion_BuscarDatos = "";
        public string Exferia_F3_SoloSeleccion_Simple_PRINCIPAL_Opcion_BuscarDatos
        {
            set
            {
                g_str_NombreOpcion_BuscarDatos = value;

                //Buscar los Permisos
                if (value != null && value.Trim().Length >0)
                { 
                    g_lst_INTERNO_Permisos_Modelo = Datos_Generales.Permisos_Buscar(value);
                }
            }
            get
            {
                return g_str_NombreOpcion_BuscarDatos;
            }
        }

        internal G_ENUM_F3_TITULO g_enum_F3_AnchoTitulo = G_ENUM_F3_TITULO.Normal;
        public G_ENUM_F3_TITULO Exferia_F3_Auxiliar_Ancho_Titulo
        {
            set
            {
                g_enum_F3_AnchoTitulo = value;

                //Normal
                int int_AnchoTitulo = 100;

                if (g_enum_F3_AnchoTitulo.Equals(G_ENUM_F3_TITULO.Grande))
                {
                    int_AnchoTitulo = 250;
                }
                //SuperGrande
                else if (g_enum_F3_AnchoTitulo.Equals(G_ENUM_F3_TITULO.SuperGrande))
                {
                    int_AnchoTitulo = 350;
                }
                //Pequeno
                else if (g_enum_F3_AnchoTitulo.Equals(G_ENUM_F3_TITULO.Pequeno))
                {
                    int_AnchoTitulo = 60;
                }
                //SuperPequeno
                else if (g_enum_F3_AnchoTitulo.Equals(G_ENUM_F3_TITULO.SuperPequeno))
                {
                    int_AnchoTitulo = 40;
                }
                //MedioPequeno
                else if (g_enum_F3_AnchoTitulo.Equals(G_ENUM_F3_TITULO.MedioPequeno))
                {
                    int_AnchoTitulo = 130;
                }

                ex_lbl_Titulo.Size = new Size(int_AnchoTitulo, ex_lbl_Titulo.Size.Height);

                ex_txt_Codigo.Location = new Point((int_AnchoTitulo + 6), ex_txt_Codigo.Location.Y);
                ex_txt_Codigo.Size = new Size(((ex_btn_F3_Codigo.Location.X - ex_txt_Codigo.Location.X) - 3), ex_txt_Codigo.Size.Height);

                //Mover el Boton F3
                ex_btn_F3_Codigo.Location = new Point(ex_txt_Codigo.Size.Width + ex_txt_Codigo.Location.X + 6, ex_btn_F3_Codigo.Location.Y);

                //Mover dato Auxiliar
                ex_lbl_DatoAuxiliar.Location = new Point(ex_btn_F3_Codigo.Size.Width + ex_btn_F3_Codigo.Location.X + 6, ex_lbl_DatoAuxiliar.Location.Y);
                ex_lbl_DatoAuxiliar.Size = new Size(((this.Width - ex_lbl_DatoAuxiliar.Location.X) - ex_lbl_DatoAuxiliar.Size.Width) - 3, ex_lbl_DatoAuxiliar.Size.Height);
            }
            get
            {
                return g_enum_F3_AnchoTitulo;
            }
        }

        internal bool g_bol_MostrarDatoAuxiliar = false;
        public bool Exferia_F3_SoloSeleccion_Simple_DATOAUXILIAR_MOSTRAR
        {
            get
            {
                return g_bol_MostrarDatoAuxiliar;
            }
            set
            {
                g_bol_MostrarDatoAuxiliar = value;

                //Mostrarlo
                if (g_bol_MostrarDatoAuxiliar)
                {
                    ex_btn_F3_Codigo.Anchor = AnchorStyles.Top | AnchorStyles.Left;
                    ex_txt_Codigo.Anchor = AnchorStyles.Top | AnchorStyles.Left;

                    //Tamaño el TextBox
                    ex_txt_Codigo.Size = new Size(130, ex_txt_Codigo.Size.Height);

                    //Mover el Boton F3
                    ex_btn_F3_Codigo.Location = new Point(ex_txt_Codigo.Size.Width + ex_txt_Codigo.Location.X + 6, ex_btn_F3_Codigo.Location.Y);

                    //Mover dato Auxiliar
                    ex_lbl_DatoAuxiliar.Location = new Point(ex_btn_F3_Codigo.Size.Width + ex_btn_F3_Codigo.Location.X + 6, ex_lbl_DatoAuxiliar.Location.Y);
                    ex_lbl_DatoAuxiliar.Size = new Size(((this.Width - ex_lbl_DatoAuxiliar.Location.X) - ex_lbl_DatoAuxiliar.Size.Width)-3, ex_lbl_DatoAuxiliar.Size.Height);

                    //Mostrar dato Auxiliar
                    ex_lbl_DatoAuxiliar.Visible = true;
                }
                //Ocultarlo
                else
                {
                    ex_btn_F3_Codigo.Anchor = AnchorStyles.Top | AnchorStyles.Right ;
                    ex_txt_Codigo.Anchor = AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left;

                    //Ocultar datos Auxiliar
                    ex_lbl_DatoAuxiliar.Visible = false;

                    //Mover el Boton F3
                    ex_btn_F3_Codigo.Location = new Point(this.Width-25, ex_btn_F3_Codigo.Location.Y);

                    //Tamaño el TextBox
                    ex_txt_Codigo.Size = new Size(((ex_btn_F3_Codigo.Location.X - ex_txt_Codigo.Location.X) - 3), ex_txt_Codigo.Size.Height);

                }
            }
        }

        internal bool g_bol_BuscarTitulo_OpcionesDetalle = true;
        public bool Exferia_F3_SoloSeleccion_Simple_PRINCIPAL_BUSCARTITULO
        {
            set
            {
                g_bol_BuscarTitulo_OpcionesDetalle = value;
            }
        }

        internal bool g_bol_Obligatorio = false;
        public bool Exferia_F3_SoloSeleccion_Simple_PRINCIPAL_Obligatorio
        {
            set
            {
                g_bol_Obligatorio = value;
                if (g_bol_Obligatorio)
                {
                    ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_OBLIGATORIO;
                }
                else
                {
                    ex_txt_Codigo.Exferia_TextBox_Fondo = Color.White;
                }
            }
            get
            {
                return g_bol_Obligatorio;
            }
        }

        //Mayor
        internal bool g_bol_AutoCompletadoMayor = false;
        public bool Exferia_F3_SoloSeleccion_Simple_PRINCIPAL_AutoCompletado_Mayor
        {
            set
            {
                g_bol_AutoCompletadoMayor = value;
                if (g_bol_AutoCompletadoMayor)
                {
                    if (g_P_Base_Contenedor != null)
                    {
                        ex_txt_Codigo.Exferia_TextBox_Tipos = G_ENUM_TEXTBOX_TIPODATO.AutoCompletado_Mayor;
                        ex_txt_Codigo.Exferia_TextBox_AutoCompletar_Mayor(g_P_Base_Contenedor.P_Base_ValoresGenerales);
                    }
                }
                else
                {
                    ex_txt_Codigo.Exferia_TextBox_Tipos = G_ENUM_TEXTBOX_TIPODATO.Textos;
                    ex_txt_Codigo.Exferia_TextBox_AutoCompletar_Mayor(null);
                }
            }
        }

        #region Objeto Relacionado
        internal List<INTERNO_Filtro_OpcionPadre_Modelo> g_lst_INTERNO_Filtro_OpcionPadre_Modelo = null;
        public List<INTERNO_Filtro_OpcionPadre_Modelo> Exferia_F3_SoloSeleccion_Simple_RELACIONADOS
        {
            set
            {
                g_lst_INTERNO_Filtro_OpcionPadre_Modelo = value;
            }
        }
        #endregion

        public void Exferia_F3_Auxiliar_Foco()
        {
            ex_txt_Codigo.Exferia_TextBox_Foco();
        }

        // Objetos hijos Exferia_F3_Auxiliar Relacionados
        internal Exferia_F3_Auxiliar g_Exferia_F3_Auxiliar_Objeto_CopiarInformacion;
        public Exferia_F3_Auxiliar Exferia_F3_Auxiliar_Objeto_CopiarInformacion
        {
            set
            {
                g_Exferia_F3_Auxiliar_Objeto_CopiarInformacion = value;
            }
        }

        internal Dictionary<string, object> g_dct_ListadoFiltros = null;
        public Dictionary<string, object> Exferia_F3_SoloSeleccion_FiltrosAvanzados
        {
            set
            {
                g_dct_ListadoFiltros = value;
            }
        }

        #region Objetos codigo

        public Exferia_TextBox Exferia_F3_SoloSeleccion_Simple_PRINCIPAL_TextBox_Codigo
        {
            get
            {
                return ex_txt_Codigo;
            }
        }
        #endregion

        public string Exferia_F3_SoloSeleccion_Simple_Titulo
        {
            set
            {
                ex_lbl_Titulo.Text = value;
            }
            get
            {
                return ex_lbl_Titulo.Text;
            }
        }

        internal long g_lng_id = -1;
        public long Exferia_F3_SoloSeleccion_Simple_Id
        {
            set
            {
                g_lng_id = value;
            }
            get
            {
                return g_lng_id;
            }
        }

        public string Exferia_F3_SoloSeleccion_Simple_Codigo
        {
            set
            {
                ex_txt_Codigo.Text = value;
            }
            get
            {
                return ex_txt_Codigo.Text;
            }
        }
        public string Exferia_F3_SoloSeleccion_Simple_Auxiliar
        {
            set
            {
                ex_lbl_DatoAuxiliar.Text = value;
            }
            get
            {
                return ex_lbl_DatoAuxiliar.Text;
            }
        }

        internal DateTime? g_dtt_FechaBorrado = null;
        public DateTime? Exferia_F3_SoloSeleccion_Simple_FechaBorrado
        {
            set
            {
                g_dtt_FechaBorrado = value;

                if (g_dtt_FechaBorrado!= null)
                {
                    ex_txt_Codigo.Exferia_TextBox_FuenteTexto(Fuentes.G_FONT_TEXTOS_TACHADA);
                    ex_txt_Codigo.Exferia_TextBox_ColorTexto(Colores.G_COLOR_ATENCION);
                }
                else
                {
                    ex_txt_Codigo.Exferia_TextBox_FuenteTexto(Fuentes.G_FONT_TEXTOS);
                    ex_txt_Codigo.Exferia_TextBox_ColorTexto(Colores.G_COLOR_TEXTO_ESCRITO);
                }
            }
            get
            {
                return g_dtt_FechaBorrado;
            }
        }

        internal long? g_lng_idEjercicio_baja = null;
        public long? Exferia_F3_SoloSeleccion_Simple_IdEjercicio_Baja
        {
            set
            {
                g_lng_idEjercicio_baja = value;

                if (g_lng_idEjercicio_baja != null && g_lng_idEjercicio_baja.Value > -1)
                {
                    //Comparar fecha temporadafin del ejericio de baja si lo tuviera con la fecha de trabajo actual
                    if (Datos_Generales.GEN_EjerciciosActivos_Empresa_Registro_DadoDeBaja_Por_EjercicioFecha(g_lng_idEjercicio_baja.Value, g_P_Base_Contenedor.P_Base_FechaTrabajo))
                    {
                        ex_txt_Codigo.Exferia_TextBox_FuenteTexto(Fuentes.G_FONT_TEXTOS_TACHADA);
                        ex_txt_Codigo.Exferia_TextBox_ColorTexto(Colores.G_COLOR_DADODEBAJA);
                    }
                    else
                    {
                        if (g_dtt_FechaBorrado != null)
                        {
                            ex_txt_Codigo.Exferia_TextBox_FuenteTexto(Fuentes.G_FONT_TEXTOS_TACHADA);
                            ex_txt_Codigo.Exferia_TextBox_ColorTexto(Colores.G_COLOR_ATENCION);
                        }
                        else
                        {
                            ex_txt_Codigo.Exferia_TextBox_FuenteTexto(Fuentes.G_FONT_TEXTOS);
                            ex_txt_Codigo.Exferia_TextBox_ColorTexto(Colores.G_COLOR_TEXTO_ESCRITO);
                        }
                    }
                }
                else
                {
                    if (g_dtt_FechaBorrado != null)
                    {
                        ex_txt_Codigo.Exferia_TextBox_FuenteTexto(Fuentes.G_FONT_TEXTOS_TACHADA);
                        ex_txt_Codigo.Exferia_TextBox_ColorTexto(Colores.G_COLOR_ATENCION);
                    }
                    else
                    {
                        ex_txt_Codigo.Exferia_TextBox_FuenteTexto(Fuentes.G_FONT_TEXTOS);
                        ex_txt_Codigo.Exferia_TextBox_ColorTexto(Colores.G_COLOR_TEXTO_ESCRITO);
                    }
                }   
            }
            get
            {
                return g_lng_idEjercicio_baja;
            }
        }

        public void Exferia_F3_SoloSeleccion_Simple_Foco ()
        {
            ex_txt_Codigo.Exferia_TextBox_Foco();
        }

        internal object g_obj_DatosAuxiliares_1 = null;
        public object Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_1
        {
            set
            {
                g_obj_DatosAuxiliares_1 = value;
            }
            get
            {
                return g_obj_DatosAuxiliares_1;
            }
        }
        internal object g_obj_DatosAuxiliares_2 = null;
        public object Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_2
        {
            set
            {
                g_obj_DatosAuxiliares_2 = value;
            }
            get
            {
                return g_obj_DatosAuxiliares_2;
            }
        }
        internal object g_obj_DatosAuxiliares_3 = null;
        public object Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_3
        {
            set
            {
                g_obj_DatosAuxiliares_3 = value;
            }
            get
            {
                return g_obj_DatosAuxiliares_3;
            }
        }

        #endregion

        #region Eventos publicos
        public event EventHandler Exferia_F3_SoloSeleccion_Simple_Evento_TextChanged;

        public event EventHandler Exferia_F3_SoloSeleccion_Simple_Evento_TerminoBusqueda;

        #endregion

        public Exferia_F3_SoloSeleccion_Simple()
        {
            InitializeComponent();

            // (Tarea Asincrona) Buscar ###############################################################
            g_TareaAsincrona_Buscar = new BackgroundWorker();
            g_TareaAsincrona_Buscar.DoWork += new DoWorkEventHandler(TareaAsincrona_Buscar_DoWork);
            g_TareaAsincrona_Buscar.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Buscar_Completed);
            g_TareaAsincrona_Buscar.WorkerReportsProgress = false;
            g_TareaAsincrona_Buscar.WorkerSupportsCancellation = true;
            // ##############################################################################################

            // (Tarea Asincrona) BuscarPorId ###############################################################
            g_TareaAsincrona_Buscar_RegistroPorId = new BackgroundWorker();
            g_TareaAsincrona_Buscar_RegistroPorId.DoWork += new DoWorkEventHandler(TareaAsincrona_Buscar_RegistroPorId_DoWork);
            g_TareaAsincrona_Buscar_RegistroPorId.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Buscar_RegistroPorId_Completed);
            g_TareaAsincrona_Buscar_RegistroPorId.WorkerReportsProgress = false;
            g_TareaAsincrona_Buscar_RegistroPorId.WorkerSupportsCancellation = true;
            // ##############################################################################################
        }

        private void Exferia_F3_SoloSeleccion_Simple_Load(object sender, EventArgs e)
        {
            CargaInicial();
        }       
        public void CargaInicial()
        {
            try
            {
               //Buscar los datos del Arbol
               g_mdl_INTERNO_OpcionesDetalle_Modelo = Datos_Generales.PRV_Opciones_Buscar_Detalles(g_str_NombreOpcion_BuscarDatos);

               //Buscar el Titulo en el Arbol
               if (g_bol_BuscarTitulo_OpcionesDetalle && g_mdl_INTERNO_OpcionesDetalle_Modelo != null)
               {
                   Exferia_F3_SoloSeleccion_Simple_Titulo = g_mdl_INTERNO_OpcionesDetalle_Modelo.descripcion_Singular;
               }

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

               //Obtener valores
               object[] arr_Parametros = { g_str_NombreOpcion_BuscarDatos };
               //Pasamos los parametros al metodo y lo ejecutamos
               g_obj_ABS_F3 = (ABS_F3)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(g_str_NombreOpcion_BuscarDatos, ex, nameof(Exferia_F3_SoloSeleccion_Simple) + "/" + nameof(Exferia_F3_SoloSeleccion_Simple_Load));
            }
        }

        #region Poner el Foco en TextBox
        public void Foco_Codigo()
        {
            ex_txt_Codigo.Exferia_TextBox_Foco();
        }
        #endregion

        #region Codigo
        private void ex_btn_F3_Codigo_Click(object sender, EventArgs e)
        {
            F3_Pulsado(ex_txt_Codigo);
        }
        private void ex_txt_Codigo_Exferia_TextBox_Evento_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.F3:
                    {
                        F3_Pulsado(sender as Exferia_TextBox);
                        break;
                    }
                default:
                    {
                        g_bol_Cambio_Codigo = true;
                        break;
                    }
            }
        }
        private void ex_txt_Codigo_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            ex_txt_Codigo.Tag = ex_txt_Codigo.Text;
        }
        private void ex_txt_Codigo_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            try
            {
                if (g_bol_Cambio_Codigo)
                {
                    g_bol_Cambio_Codigo = false;
                    if (!ex_txt_Codigo.Tag.ToString().Equals(ex_txt_Codigo.Text))
                    {
                        g_str_Filtro = ex_txt_Codigo.Text;
                        g_str_CampoBusqueda = g_obj_ABS_F3.NOMBRE_CAMPO_CODIGO();

                        Buscar(g_str_Filtro, g_str_CampoBusqueda);
                    }
                }
                g_bol_Cambio_Codigo = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Exferia_F3_SoloSeleccion_Simple) + "/" + nameof(ex_txt_Codigo_Exferia_TextBox_Evento_LostFocus));
            }
        }
        private void ex_txt_Codigo_Exferia_TextBox_Evento_TextChanged(object sender, EventArgs e)
        {
            if (g_P_Base_Contenedor.Enabled)
            {
                g_P_Base_Contenedor.P_Base_SeModificoDatosPantalla = true;
            }

            //Salta el Evento de TextChange
            Exferia_F3_SoloSeleccion_Simple_Evento_TextChanged?.Invoke(this, e);
        }
        #endregion

        private void F3_Pulsado(Exferia_TextBox _ex_txt_Actual)
        {
            if (Datos_Generales.Permisos_Comprobar(g_str_NombreOpcion_BuscarDatos, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Seleccionar, true))
            {
                string str_NombreCampo_Seleccionado = g_obj_ABS_F3.NOMBRE_CAMPO_CODIGO();
                string str_Valor_Seleccionado = ex_txt_Codigo.Text;

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

                //Evento Registro Seleccionado .........................................
                MethodInfo obj_EventoAlqueSeRedirige_RegistroSeleccionado = typeof(Exferia_F3_SoloSeleccion_Simple).GetMethod("Evento_RegistroSeleccionado", BindingFlags.NonPublic | BindingFlags.Instance);
                EventInfo obj_Evento_Publico_RegistroSeleccionado = obj_Clase.GetType().GetEvent(Variables.G_STR_LIBRERIA_OPCIONES_EVENTO_REGISTROSELECCIONADO);
                Type obj_TipoEventoPublico_RegistroSeleccionado = obj_Evento_Publico_RegistroSeleccionado.EventHandlerType;
                Delegate obj_Delegado_RegistroSeleccionado = Delegate.CreateDelegate(obj_TipoEventoPublico_RegistroSeleccionado, this, obj_EventoAlqueSeRedirige_RegistroSeleccionado);
                obj_Evento_Publico_RegistroSeleccionado.AddEventHandler(obj_Clase, obj_Delegado_RegistroSeleccionado);
                //..................................................................

                List<INTERNO_Filtro_OpcionPadre_Modelo> lst_INTERNO_Filtro_OpcionPadre_Modelo_Aux = null;
                if (g_lst_INTERNO_Filtro_OpcionPadre_Modelo!=null && g_lst_INTERNO_Filtro_OpcionPadre_Modelo.Count>0)
                {
                    lst_INTERNO_Filtro_OpcionPadre_Modelo_Aux = new List<INTERNO_Filtro_OpcionPadre_Modelo>(g_lst_INTERNO_Filtro_OpcionPadre_Modelo);
                }

                //Obtener valores
                object[] arr_Parametros = { g_str_NombreOpcion_BuscarDatos,
                                            true,
                                            111,
                                            g_P_Base_Contenedor,
                                            g_P_Base_Contenedor.P_Base_ValoresGenerales,
                                            g_P_Base_Contenedor.P_Base_FechaTrabajo,
                                            str_NombreCampo_Seleccionado,
                                            str_Valor_Seleccionado,
                                            false,
                                            false,
                                            lst_INTERNO_Filtro_OpcionPadre_Modelo_Aux,
                                            null,
                                            g_dct_ListadoFiltros,
                                            null,
                                            g_obj_Filtro_Auxiliar,
                                            g_obj_ABS_Listado};

                //Pasamos los parametros al metodo y lo ejecutamos
                obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
        }
        
        #region Eventos del Listado llamado

        void Evento_RegistroSeleccionado(object sender, INTERNO_EventArgs_Listado e)
        {
            if (e.REGISTRO_SELECCIONADO != null)
            {
                var obj_id = e.REGISTRO_SELECCIONADO.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_ID()).GetValue(e.REGISTRO_SELECCIONADO, null);
                if (obj_id != null)
                {
                    long lng_id_Antiguo = g_lng_id;

                    //Poner los colores inciales
                    if (g_bol_Obligatorio)
                    {
                        ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_OBLIGATORIO;
                    }
                    else
                    {
                        ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_BASE;
                    }

                    g_lng_id = obj_id;

                    var obj_Codigo = e.REGISTRO_SELECCIONADO.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_CODIGO()).GetValue(e.REGISTRO_SELECCIONADO, null);
                    if (obj_Codigo != null)
                    {
                        ex_txt_Codigo.Text = Convert.ToString(obj_Codigo);
                    }

                    //fecha Borrado
                    if (g_obj_ABS_F3.NOMBRE_CAMPO_FECHABORRADO() != null && g_obj_ABS_F3.NOMBRE_CAMPO_FECHABORRADO().Trim().Length > 0)
                    {
                        DateTime? dtt_FechaBorrado = null;
                        var obj_FechaBorrado = e.REGISTRO_SELECCIONADO.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_FECHABORRADO()).GetValue(e.REGISTRO_SELECCIONADO, null);
                        if (obj_FechaBorrado != null)
                        {
                            dtt_FechaBorrado = obj_FechaBorrado;
                        }
                        Exferia_F3_SoloSeleccion_Simple_FechaBorrado = dtt_FechaBorrado;
                    }

                    //Si tuviera el nombre del Ejercicio_Baja se pone el valor
                    if (g_obj_ABS_F3.NOMBRE_CAMPO_IDEJERCICIO_BAJA() != null && g_obj_ABS_F3.NOMBRE_CAMPO_IDEJERCICIO_BAJA().Trim().Length > 0)
                    {
                        long? lng_idEjercicio_Baja = null;
                        var obj_idEjercicio_Baja = e.REGISTRO_SELECCIONADO.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_IDEJERCICIO_BAJA()).GetValue(e.REGISTRO_SELECCIONADO, null);
                        if (obj_idEjercicio_Baja != null)
                        {
                            lng_idEjercicio_Baja = obj_idEjercicio_Baja;
                        }
                        Exferia_F3_SoloSeleccion_Simple_IdEjercicio_Baja = lng_idEjercicio_Baja;
                    }

                    //Dato Auxiliar
                    if (g_bol_MostrarDatoAuxiliar && g_obj_ABS_F3.NOMBRE_CAMPO_DESCRIPCION() != null && g_obj_ABS_F3.NOMBRE_CAMPO_DESCRIPCION().Trim().Length > 0)
                    {
                        var obj_DatoAuxiliar = e.REGISTRO_SELECCIONADO.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_DESCRIPCION()).GetValue(e.REGISTRO_SELECCIONADO, null);
                        if (obj_DatoAuxiliar != null)
                        {
                            ex_lbl_DatoAuxiliar.Text = Convert.ToString(obj_DatoAuxiliar);
                        }
                        else
                        {
                            ex_lbl_DatoAuxiliar.Text = "";
                        }
                    }
                    else
                    {
                        ex_lbl_DatoAuxiliar.Text = "";
                    }

                    //Si tuviera el nombre CAMPO DatosAuxiliares 1
                    if (g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_1() != null && g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_1().Trim().Length > 0)
                    {
                        Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_1 = e.REGISTRO_SELECCIONADO.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_1()).GetValue(e.REGISTRO_SELECCIONADO, null);
                    }

                    //Si tuviera el nombre CAMPO DatosAuxiliares 2
                    if (g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_2() != null && g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_2().Trim().Length > 0)
                    {
                        Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_2 = e.REGISTRO_SELECCIONADO.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_2()).GetValue(e.REGISTRO_SELECCIONADO, null);
                    }

                    //Si tuviera el nombre CAMPO DatosAuxiliares 3
                    if (g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_3() != null && g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_3().Trim().Length > 0)
                    {
                        Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_3 = e.REGISTRO_SELECCIONADO.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_3()).GetValue(e.REGISTRO_SELECCIONADO, null);
                    }


                    if (g_lng_id!=lng_id_Antiguo)
                    {
                        //Salta el Evento de TerminoBusqueda
                        Exferia_F3_SoloSeleccion_Simple_Evento_TerminoBusqueda?.Invoke(this, new EventArgs());
                    }

                }
                else
                {
                    //Salta el Evento de TerminoBusqueda
                    Exferia_F3_SoloSeleccion_Simple_Evento_TerminoBusqueda?.Invoke(this, new EventArgs());
                }
                
            }

            //Poner Foco
            ex_txt_Codigo.Exferia_TextBox_Foco();
        }

        #endregion

        #region Actualiza los registros cuando se abre el mantenimiento directo y se graba o borra
        public void Exferia_F3_SoloSeleccion_Simple_ActualizarRegistro(long _lng_id, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Eliminar
                if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_ELIMINAR))
                {
                    //Poner los colores inciales
                    if (g_bol_Obligatorio)
                    {
                        ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_OBLIGATORIO;
                    }
                    else
                    {
                        ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_BASE;
                    }

                    g_lng_id = -1;
                    //Descripcion
                    ex_txt_Codigo.Text = "";

                    //Poner Foco
                    ex_txt_Codigo.Exferia_TextBox_Foco();
                }
                else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_NADA))
                {
                    //Poner Foco
                    ex_txt_Codigo.Exferia_TextBox_Foco();

                    //Salta el Evento de TerminoBusqueda
                    Exferia_F3_SoloSeleccion_Simple_Evento_TerminoBusqueda?.Invoke(this, new EventArgs());
                }
                //Actualizar e Insertar
                else
                {
                    g_TareaAsincrona_Buscar_RegistroPorId.RunWorkerAsync(_lng_id);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(Exferia_F3_SoloSeleccion_Simple) +"/" + nameof(Exferia_F3_SoloSeleccion_Simple_ActualizarRegistro));
                Mensajes.MostrarMensaje(Mensajes.G_EXFERIA_F3_ERROR_BUSCAR());
            }
        }

        private void TareaAsincrona_Buscar_RegistroPorId_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                // Parametros ######################################################
                long lng_id = (long)e.Argument ;
                // #################################################################

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

                List<INTERNO_Filtro_OpcionPadre_Modelo> lst_INTERNO_Filtro_OpcionPadre_Modelo_Aux = null;
                if (g_lst_INTERNO_Filtro_OpcionPadre_Modelo != null && g_lst_INTERNO_Filtro_OpcionPadre_Modelo.Count > 0)
                {
                    lst_INTERNO_Filtro_OpcionPadre_Modelo_Aux = new List<INTERNO_Filtro_OpcionPadre_Modelo>(g_lst_INTERNO_Filtro_OpcionPadre_Modelo);
                }

                //Obtener valores
                object[] arr_Parametros = {
                    g_str_NombreOpcion_BuscarDatos,
                    lng_id,
                    g_P_Base_Contenedor.P_Base_ValoresGenerales.lng_idEmpresa,
                    g_P_Base_Contenedor.P_Base_ValoresGenerales.EjercicioActivo.id,
                    lst_INTERNO_Filtro_OpcionPadre_Modelo_Aux,
                    null};

                //Pasamos los parametros al metodo y lo ejecutamos
                e.Result = obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
                Thread.ResetAbort();
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }

        private void TareaAsincrona_Buscar_RegistroPorId_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                if (e.Cancelled == false)
                {
                    if (e.Result != null)
                    {
                        dynamic dnm_Valor = e.Result;
                        if (dnm_Valor != null)
                        {
                            var obj_id = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_ID()).GetValue(dnm_Valor, null);
                            if (obj_id != null)
                            {
                                long lng_id_Antiguo = g_lng_id;

                                //Poner los colores inciales
                                if (g_bol_Obligatorio)
                                {
                                    ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_OBLIGATORIO;
                                }
                                else
                                {
                                    ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_BASE;
                                }

                                g_lng_id = obj_id;

                                var obj_Codigo = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_CODIGO()).GetValue(dnm_Valor, null);
                                if (obj_Codigo != null)
                                {
                                    ex_txt_Codigo.Text = Convert.ToString(obj_Codigo);
                                }

                                //Dato Auxiliar
                                if (g_bol_MostrarDatoAuxiliar && g_obj_ABS_F3.NOMBRE_CAMPO_DESCRIPCION()!=null && g_obj_ABS_F3.NOMBRE_CAMPO_DESCRIPCION().Trim().Length>0)
                                {
                                    var obj_DatoAuxiliar = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_DESCRIPCION()).GetValue(dnm_Valor, null);
                                    if (obj_DatoAuxiliar != null)
                                    {
                                        ex_lbl_DatoAuxiliar.Text = Convert.ToString(obj_DatoAuxiliar);
                                    }
                                }

                                //fecha boorado
                                DateTime? dtt_FechaBorrado = null;
                                var obj_FechaBorrado = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_FECHABORRADO()).GetValue(dnm_Valor, null);
                                if (obj_FechaBorrado != null)
                                {
                                    dtt_FechaBorrado = obj_FechaBorrado;
                                }
                                Exferia_F3_SoloSeleccion_Simple_FechaBorrado = dtt_FechaBorrado;

                                //Si tuviera el nombre CAMPO DatosAuxiliares 1
                                if (g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_1() != null && g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_1().Trim().Length > 0)
                                {
                                    Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_1 = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_1()).GetValue(dnm_Valor, null);
                                }

                                //Si tuviera el nombre CAMPO DatosAuxiliares 2
                                if (g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_2() != null && g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_2().Trim().Length > 0)
                                {
                                    Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_2 = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_2()).GetValue(dnm_Valor, null);
                                }

                                //Si tuviera el nombre CAMPO DatosAuxiliares 3
                                if (g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_3() != null && g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_3().Trim().Length > 0)
                                {
                                    Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_3 = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_3()).GetValue(dnm_Valor, null);
                                }

                                if (g_lng_id != lng_id_Antiguo)
                                {
                                    //Salta el Evento de TerminoBusqueda
                                    Exferia_F3_SoloSeleccion_Simple_Evento_TerminoBusqueda?.Invoke(this, new EventArgs());
                                }

                            }
                            else
                            {
                                //Salta el Evento de TerminoBusqueda
                                Exferia_F3_SoloSeleccion_Simple_Evento_TerminoBusqueda?.Invoke(this, new EventArgs());
                            }
                           

                        }

                        //Poner Foco
                        ex_txt_Codigo.Exferia_TextBox_Foco();
                    }
                }
            }
            catch (Exception)
            { }
        }
        #endregion

        #region Tarea asíncrona para buscar en la base de datos

        private void Buscar(string _str_filtro, string _str_CampoBusqueda)
        {
            try
            { 
                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                // Si la tarea asincrona esta en marcha la paro
                g_TareaAsincrona_Buscar.CancelAsync();
                while (g_TareaAsincrona_Buscar.IsBusy)
                    Application.DoEvents();

                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_str_filtro);
                lst_Argumentos.Add(_str_CampoBusqueda);
                //Llamar a la tarea asincrona
                g_TareaAsincrona_Buscar.RunWorkerAsync(lst_Argumentos);

                //Mostrar pantalla de espera
                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                Control_Errores.Errores_Log(ex.Message, nameof(Exferia_F3_SoloSeleccion_Simple) + "/" + nameof(Buscar));
                Mensajes.MostrarMensaje(Mensajes.G_EXFERIA_F3_ERROR_BUSCAR());
            }
        }

        private void TareaAsincrona_Buscar_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                // Parametros ######################################################
                List<object> lst_Argumentos = e.Argument as List<object>;
                string str_filtro = lst_Argumentos[0].ToString();
                string str_CampoBusqueda = lst_Argumentos[1].ToString();
                // #################################################################

                dynamic dnm_RegistroF3 = null;
                if (str_filtro.Trim().Length > 0)
                {
                    //Cargamos el ensamblado
                    Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_mdl_INTERNO_OpcionesDetalle_Modelo.nombreLibreria + ".dll");
                    //Obtenemos el tipo de la clase
                    Type m_type = m_assembly.GetType("" + g_mdl_INTERNO_OpcionesDetalle_Modelo.nombreLibreria + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                    //creamos la instancia
                    var obj_Clase = Activator.CreateInstance(m_type);
                    //Cargamos el metodo solicitado
                    MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_OBTENER_REGISTRO_F3, BindingFlags.Instance | BindingFlags.NonPublic);

                    List<INTERNO_Filtro_OpcionPadre_Modelo> lst_INTERNO_Filtro_OpcionPadre_Modelo_Aux = null;
                    if (g_lst_INTERNO_Filtro_OpcionPadre_Modelo != null && g_lst_INTERNO_Filtro_OpcionPadre_Modelo.Count > 0)
                    {
                        lst_INTERNO_Filtro_OpcionPadre_Modelo_Aux = new List<INTERNO_Filtro_OpcionPadre_Modelo>(g_lst_INTERNO_Filtro_OpcionPadre_Modelo);
                    }

                    //Obtener valores
                    object[] arr_Parametros = { g_str_NombreOpcion_BuscarDatos,
                                            str_filtro,
                                            str_CampoBusqueda,
                                            (g_P_Base_Contenedor.P_Base_ValoresGenerales!=null ? g_P_Base_Contenedor.P_Base_ValoresGenerales.lng_idEmpresa : -1),
                                             ((g_P_Base_Contenedor.P_Base_ValoresGenerales!=null && g_P_Base_Contenedor.P_Base_ValoresGenerales.EjercicioActivo!=null) ? g_P_Base_Contenedor.P_Base_ValoresGenerales.EjercicioActivo.id: -1),
                                            lst_INTERNO_Filtro_OpcionPadre_Modelo_Aux,
                                            null,
                                            g_obj_Filtro_Auxiliar};

                    //Pasamos los parametros al metodo y lo ejecutamos
                    dnm_RegistroF3 = obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
                }

                // Valores a Devolver
                List<object> lst_ValoresADevolver = new List<object>();
                lst_ValoresADevolver.Add(dnm_RegistroF3);
                lst_ValoresADevolver.Add(str_CampoBusqueda);
                e.Result = lst_ValoresADevolver;
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Buscar_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                //Quitar Pantala de espera
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                Thread.Sleep(10);

                if (e.Cancelled == false)
                {
                    if (e.Result != null)
                    {
                        List<object> lst_ValoresADevolver = e.Result as List<object>;
                        string str_CampoBusqueda = lst_ValoresADevolver[1].ToString();
                        if (lst_ValoresADevolver[0] != null)
                        {
                            dynamic dnm_Valor = lst_ValoresADevolver[0] as dynamic;
                            if (dnm_Valor != null)
                            {
                                var obj_id = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_ID()).GetValue(dnm_Valor, null);
                                if (obj_id != null)
                                {
                                    //Poner los colores inciales
                                    if (g_bol_Obligatorio)
                                    {
                                        ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_OBLIGATORIO;
                                    }
                                    else
                                    {
                                        ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_BASE;
                                    }

                                    g_lng_id = obj_id;

                                    //Busqueda por Descripcion
                                    if (str_CampoBusqueda.Equals(g_obj_ABS_F3.NOMBRE_CAMPO_DESCRIPCION()))
                                    {
                                        var obj_Codigo = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_CODIGO()).GetValue(dnm_Valor, null);
                                        if (obj_Codigo != null)
                                        {
                                            ex_txt_Codigo.Text = Convert.ToString(obj_Codigo);
                                        }
                                    }

                                    //Dato Auxiliar
                                    if (g_bol_MostrarDatoAuxiliar && g_obj_ABS_F3.NOMBRE_CAMPO_DESCRIPCION()!=null && g_obj_ABS_F3.NOMBRE_CAMPO_DESCRIPCION().Trim().Length > 0)
                                    {
                                        var obj_DatoAuxiliar = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_DESCRIPCION()).GetValue(dnm_Valor, null);
                                        if (obj_DatoAuxiliar != null)
                                        {
                                            ex_lbl_DatoAuxiliar.Text = Convert.ToString(obj_DatoAuxiliar);
                                        }
                                        else
                                        {
                                            ex_lbl_DatoAuxiliar.Text = "";
                                        }
                                    }
                                    else
                                    {
                                        ex_lbl_DatoAuxiliar.Text = "";
                                    }

                                    //fecha Borrado
                                    if (g_obj_ABS_F3.NOMBRE_CAMPO_FECHABORRADO() != null && g_obj_ABS_F3.NOMBRE_CAMPO_FECHABORRADO().Trim().Length > 0)
                                    {
                                        DateTime? dtt_FechaBorrado = null;
                                        var obj_FechaBorrado = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_FECHABORRADO()).GetValue(dnm_Valor, null);
                                        if (obj_FechaBorrado != null)
                                        {
                                            dtt_FechaBorrado = obj_FechaBorrado;
                                        }
                                        Exferia_F3_SoloSeleccion_Simple_FechaBorrado = dtt_FechaBorrado;
                                    }

                                    //Si tuviera el nombre del Ejercicio_Baja se pone el valor
                                    if (g_obj_ABS_F3.NOMBRE_CAMPO_IDEJERCICIO_BAJA()!=null && g_obj_ABS_F3.NOMBRE_CAMPO_IDEJERCICIO_BAJA().Trim().Length>0)
                                    {
                                        long? lng_idEjercicio_Baja = null;
                                        var obj_idEjercicio_Baja = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_IDEJERCICIO_BAJA()).GetValue(dnm_Valor, null);
                                        if (obj_idEjercicio_Baja != null)
                                        {
                                            lng_idEjercicio_Baja = obj_idEjercicio_Baja;
                                        }
                                        Exferia_F3_SoloSeleccion_Simple_IdEjercicio_Baja = lng_idEjercicio_Baja;
                                    }

                                    //Si tuviera el nombre CAMPO DatosAuxiliares 1
                                    if (g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_1() != null && g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_1().Trim().Length > 0)
                                    {
                                        Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_1 = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_1()).GetValue(dnm_Valor, null);
                                    }

                                    //Si tuviera el nombre CAMPO DatosAuxiliares 2
                                    if (g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_2() != null && g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_2().Trim().Length > 0)
                                    {
                                        Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_2 = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_2()).GetValue(dnm_Valor, null);
                                    }

                                    //Si tuviera el nombre CAMPO DatosAuxiliares 3
                                    if (g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_3() != null && g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_3().Trim().Length > 0)
                                    {
                                        Exferia_F3_SoloSeleccion_Simple_DatosAuxiliares_3 = dnm_Valor.GetType().GetProperty(g_obj_ABS_F3.NOMBRE_CAMPO_DATOSAUXILIARES_3()).GetValue(dnm_Valor, null);
                                    }
                                }
                                else
                                {
                                    
                                    //Si el codigo esta vacio, se pinta del color que tiene que ir
                                    if (ex_txt_Codigo.Text.Trim() == "")
                                    {
                                        if (g_bol_Obligatorio)
                                        {
                                            ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_OBLIGATORIO;
                                        }
                                        else
                                        {
                                            ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_BASE;
                                        }

                                        ex_lbl_DatoAuxiliar.Text = "";
                                    }
                                }
                            }
                            else
                            {
                                g_lng_id = -1;
                               
                                //Si el codigo esta vacio, se pinta del color que tiene que ir
                                if (ex_txt_Codigo.Text.Trim() == "")
                                {
                                    if (g_bol_Obligatorio)
                                    {
                                        ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_OBLIGATORIO;
                                    }
                                    else
                                    {
                                        ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_BASE;
                                    }

                                    ex_lbl_DatoAuxiliar.Text = "";
                                }
                            }
                        }
                        else
                        {
                            g_lng_id = -1;

                            //Si el codigo esta vacio, se pinta del color que tiene que ir
                            if (ex_txt_Codigo.Text.Trim() == "")
                            {
                                if (g_bol_Obligatorio)
                                {
                                    ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_OBLIGATORIO;
                                }
                                else
                                {
                                    ex_txt_Codigo.Exferia_TextBox_Fondo = Colores.G_COLOR_FONDO_BASE;
                                }

                                ex_lbl_DatoAuxiliar.Text = "";
                            }
                        }

                        //Salta el Evento de TerminoBusqueda
                        Exferia_F3_SoloSeleccion_Simple_Evento_TerminoBusqueda?.Invoke(this, new EventArgs());
                    }
                }
            }
            catch (Exception)
            { }
            finally
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
            }
        }

        #endregion

        
    }
}
