// GENERA EL NODO CON LA INFORMACION EN LA PROPIEDAD TAG OBTENIDA DEL METODO Generar_info_nodo
        private TreeNode Generar_nodo(NodoPanel info_nodo)
        {
            TreeNode nodo = new TreeNode(info_nodo.Nombre);

            nodo.Name = info_nodo.Nombre;
            nodo.Tag  = info_nodo;
            return(nodo);
        }
 private void treeViewProcesos_DoubleClick(object sender, EventArgs e)
 {
     listViewParametros.Clear();
     textBoxNombre.Text      = treeViewProcesos.SelectedNode.Name;           // MOSTRAR NOMBRE DEL PROCESO SELECCIONADO
     seleccionado            = (NodoPanel)treeViewProcesos.SelectedNode.Tag; // SE HACE EL CAST PARA OBTENER INFO SOBRE EL PROCESO SELECCIONADO
     textBoxDescripcion.Text = seleccionado.Descripcion;                     // MOSTRAR DESCRICPCION DEL PROCESO SELECCIONADO
     if (seleccionado.Parametros)                                            // SI NECESITA PARAMETROS PARA EXTRAERLOS DE LA BD
     {
         if (seleccionado.Elemento.Equals("proceso"))                        // SI ES PROCESO SE EXTRAEN LOS PARAMAMETROS CORRESPONDIENTES
         {
             DataTable parametros = control.Obtener_parametros(seleccionado.Id);
             listViewParametros.View = View.Details;              // MOSTRAR INFO SOBRE EL PARAMETRO REQUERIDO
             LLenaListParametros(listViewParametros, parametros); // LLENAR LISTVIEW CON LA INFORMACION DE CADA PARAMETRO
             listViewParametros.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
         }
     }
 }
        // PARA GUARDAR EN LA PROPIEDAD TAG DEL TREENODE Y OBTENER DATOS SOBRE EL PROCESO O CADENA
        // PRINCIPALMENTE SI ES QUE NECESITA PARAMETROS
        private NodoPanel Generar_info_nodo(DataRow datos_nodo, string elemento)
        {
            NodoPanel nuevo = new NodoPanel();

            nuevo.Id       = Int32.Parse(datos_nodo[0].ToString());
            nuevo.Nombre   = datos_nodo[1].ToString();
            nuevo.Elemento = elemento;             // PARA DIFERENCIAR
            if (!elemento.Equals("categoria"))     // PARA CADENAS Y PROCESOS SE REQUIERE DESPLEGAR MAS DETALLE Y SABER SI REQUIEREN PARAMETROS
            {
                nuevo.Descripcion = datos_nodo[2].ToString();
                nuevo.Parametros  = Boolean.Parse(datos_nodo[3].ToString());
                if (datos_nodo[4] != null)
                {
                    nuevo.Id_categoria = Int32.Parse(datos_nodo[4].ToString());
                }
            }
            return(nuevo);
        }
        private void treeViewClasificados_DoubleClick(object sender, EventArgs e)
        {
            if (treeViewClasificados.SelectedNode.Level != 0) //level 0 -> categorias
            {
                listViewParametros.Clear();
                listViewParametros.Controls.Clear();
                textBoxNombre.Text      = treeViewClasificados.SelectedNode.Name;           // MOSTRAR NOMBRE DEL PROCESO SELECCIONADO
                seleccionado            = (NodoPanel)treeViewClasificados.SelectedNode.Tag; // SE HACE EL CAST PARA OBTENER INFO SOBRE EL PROCESO SELECCIONADO
                textBoxDescripcion.Text = seleccionado.Descripcion;                         // MOSTRAR DESCRICPCION DEL PROCESO SELECCIONADO
                if (seleccionado.Parametros)                                                // SI NECESITA PARAMETROS PARA EXTRAERLOS DE LA BD
                {
                    if (seleccionado.Elemento.Equals("proceso"))                            // SI ES PROCESO SE EXTRAEN LOS PARAMAMETROS CORRESPONDIENTES
                    {
                        DataTable parametros = control.Obtener_parametros(seleccionado.Id);
                        listViewParametros.View = View.Details;              // MOSTRAR INFO SOBRE EL PARAMETRO REQUERIDO
                        LLenaListParametros(listViewParametros, parametros); // LLENAR LISTVIEW CON LA INFORMACION DE CADA PARAMETRO
                        listViewParametros.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
                    }
                    else // SI ES CADENA SE BUSCAN LOS PROCESOs QUE LA INTEGRAN Y LUEGO LOS PARAMETROS COREESPONDIENTES A CADA UNO
                    {
                        /* SI LA CADENA CONTIENE CADENAS
                         * // falta agregar bd esta caracteristica
                         * if (seleccionado.contiene_cadenas)
                         * {
                         *
                         * }
                         * else // SI LA CADENA CONTIENE SOLO PROCESOS
                         * {*/
                        // BUSCA CADA PROCESO QUE FORMA PARTE DE LA CADENA
                        DataTable procesos_encadenados = control.Obtener_procesos_encadenados(seleccionado.Id);
                        DataTable parametros           = new DataTable();
                        // EXTRAER LOS PARAMETROS DE CADA PROCESO Y FUCIONARLOS EN UNA TABLA
                        procesos_encadenados.AsEnumerable().ToList().ForEach(row =>
                        {
                            parametros.Merge(control.Obtener_parametros(Int32.Parse(row["id_proceso"].ToString())));
                        });

                        listViewParametros.View = View.Details;
                        LLenaListParametros(listViewParametros, parametros);
                        //}
                    }
                }
            }
        }