miércoles, 10 de febrero de 2016

Mantener Menú TreeView Expandido

Cuando empezamos nuestro sistema utilizábamos este Menú:

 
A nuestro usuario no le gustó y nos pidió que utilizáramos un menú parecido al explorador de Windows, TreeView. El cambio realmente fue fácil, solo se cambio un poco el código y ya teníamos el menú de Árbol, parecía que todo estaba resuelto con eso. Así se veía
 
 
El cliente estaba satisfecho con ese menú, pero había un problema, cada vez que entraban a una WebForm seleccionada desde el menú, este se contraía y quedaba así
 
 
Realmente nunca nos hizo algún comentario el cliente acerca de este comportamiento, el comentario acerca de esta situación fu por parte de personal de la misma empresa.
 
Decidimos buscar alguna solución pero no encontrábamos nada en la red, por lo que lo mas fácil fue decir que no se podía, y ahí quedó todo. A mi, esa respuesta no me convenció, todos los que nos dedicamos a esto sabemos que tenemos las herramientas para hacer casi todo, nosotros trabajamos con Visual Studio, y Microsoft nos da la facilidad para hacer lo que se nos ocurra.
 
Lo primero que se me ocurrió fue poner el menú en  un UpdatePanel, pero no funcionó, pasaba exactamente lo mismo, el menú se contraía, luego pensé en dividir en paneles la Masterpage para que así solo moviera el panel central, donde se ubican las paginas, pues nada, seguía sin funcionar.
 
Entonces decidí ver el funcionamiento del TreeView, y como es que respondía al  click para mandar a llamar la WebForm.
 
 
Opté por obtener el nombre de la pantalla para poder localizarla en el menú, lo hice así:

    public string NombrePagina()
    {
     string direccion = System.Web.HttpContext.Current.Request.Url.AbsolutePath;
     System.IO.FileInfo info = new System.IO.FileInfo(direccion);
     string valor = info.Name;
     return valor;
    }

 
Con esto ya obtenía el nombre de la WebForm
 
 
Al tener ya el nombre de la WebForm lo demás fue un poco de sentido común, tenía que recuperar el título con el que aparecía en el menú, y ya obteniéndolo solo quedaba ubicarlo en el menú y expandir el TreeView, el código fue el siguiente:

     private void expandirMenu(object sender, string nombre)
    {
     TreeView1.CollapseAll();
     var tree = (TreeView)sender;
     int i = 0, rea = 0, apl = 0;

     foreach (TreeNode node in tree.Nodes)
     {
      int nodo = TreeView1.Nodes.Count - 1;
      i = node.ChildNodes.Count - 1;
      node.DataPath.ToString();
       for (int aplicaciones = 0; aplicaciones <= i; )
       {
         rea = node.ChildNodes[aplicaciones].ChildNodes.Count - 1;
            for (int modulos = 0; modulos <= rea; )
            {
             apl = node.ChildNodes[aplicaciones].ChildNodes[modulos].ChildNodes.Count - 1;
               for (int submodulos = 0; submodulos <= apl; )
               {
                if (nombre.Trim() == node.ChildNodes[aplicaciones].ChildNodes
                [modulos].ChildNodes[submodulos].Value.ToString().Trim())
                 {
                    node.Expanded = true;
                    node.ChildNodes[aplicaciones].Expanded = true;
                    node.ChildNodes[aplicaciones].ChildNodes[modulos].Expanded = true;
                    node.ChildNodes[aplicaciones].ChildNodes[modulos].ChildNodes
                    [submodulos].ImageUrl = "~//Pictures//RArrow.gif";
                 }
                 submodulos++;
              }
               modulos++;
          }
            aplicaciones++;
       }

     }

 }
 
"sender": Es el nombre de nuestro TreeView, en mi caso: TreeView1.
"nombre": Es el nombre que se muestra en el menú y que nosotros recuperamos de la base de datos.
 
Y el resultado fue el siguiente:
 
Ya mantenía el menú extendido. Es la manera en que yo solucione esto, quizá exista alguna otra manera o mas fácil o "correcta", pero como un amigo dice, "La manera correcta es como lo haces, siempre y cuando no afecte el rendimiento".
 
Saludos
Dejo a su disposición mi correo: ricegamo@hotmail.com.
 
 


jueves, 4 de febrero de 2016

Al intentar generar un reporte aparece el mensaje : Error: 'bobj' no está definido



Una vez al empezar mi día laboral hice una pequeña revisión del sistema en el que trabajamos, y me lleve la sorpresa que al intentar ver un reporte en modo de ejecución me aparecía el mensaje :

Error: 'bobj' no está definido
 
No sabía que es lo que había pasado o cual era la razón por la cual me aparecía ese mensaje, obviamente quise solucionarlo rápido y lo mas "fácil" era buscar en google alguna respuesta que me lo solucionara, perdí mas de medio día y lo único que encontraba era lo siguiente
 
"para resolver este problema copia la carpeta aspnet_client que esta en C:\inetpub\wwwroot a la carpeta donde esta tu solución"
 
Buscaba en mi proyecto y allí estaba
 
 
La borraba, la ponía otra vez y nada pasaba, seguía sin mostrar el reporte, decidí hacer lo que tenía que hacer desde el principio, revisar el error dándole click al SI!!!!
 

Obviamente tuve que checar la página de depuración para ver donde estaba el error, algo que normalmente me da mucha flojera, y lo encontré!!!!, si, había que copiar la carpeta a la aplicación, pero como no dicen para que y yo no me tome la molestia de investigar para que se hacia, me tuve que dar cuenta a la mala, teniendo el error presente, cabe mencionar que un día antes había instalado una actualización y era ahí donde estaba el error.



La aplicación buscaba la carpeta "4_6_1055" que debía estar dentro de la carpeta "aspnet_client". Entonces lo único que hice fue crear una carpeta con ese nombre y copiar el contenido de la carpeta "4_0_30319" a la que había creado e hice la prueba.

La prueba fue satisfactoria, funciono!!!
Espero les sirva mi experiencia con este errorcito que se me presentó!!

Saludos