lunes, 26 de noviembre de 2012

Cargar un Treeview con Noticias/Posts automáticamente desde una Base de Datos

  En esta oportunidad les voy a mostrar una forma sencilla de cargar un Treeview, discriminando los nodos por año y mes de alta de la noticia o post guardados en una Base de Datos.
  De más está decir que en la tabla contenedora de esta info. debe aparecer un campo DateTime Fecha_Alta que vaya guardando la fecha en la que se crea ese registro.
  En mi caso, deseo que el Treeview se cargue en cualquier webForm de mi pág. Para esto, comienzo la carga desde el Load de mi MasterPage:



-C#-

protected void Page_Load(object sender, EventArgs e)
    {
     
        if (!Page.IsPostBack) //Pregunto si se no se invoca un PostBack para que sólo se cargue una //vez.
        {
            LoadTreeView();
        }

    }


 private void LoadTreeView()
    {
        NClase nObj = new NClase(); //Declaro una instancia de mi clase de negocio
        DateTime fecha = Convert.ToDateTime("01/01/1900"); //Declaro una variable bandera para el año
        TreeNode tnYear; // Declaro una variable para el nodo del año (Padre de los demás)
        List<CLASE> listaObj = new List<CLASE>(); //Creo una lista de mi tabla 
        listaObj = nObj.GetAll(); //Le asigno todos los registros de esa tabla. PREVIAMENTE //ordenados por  fecha de alta de forma Descendiente
        foreach (var item in listaObj) //Por cada registro/fila/item de esa lista
        {
            if (fecha.Year != item.FECHA_ALTA.Year) //Pregunto si es el año de la bandera es distinto al //del registro
            {
                tnYear = new TreeNode(); //Declaro una nueva instancia del nodo
                tnYear.Text = item.FECHA_ALTA.Year.ToString(); //Asigno a su texto el año a mostrar
                tnYear.SelectAction = TreeNodeSelectAction.Expand; //Expando cuando se selecciona
                TreeView1.Nodes.Add(tnYear); //Agrego el nodo al TreeView
                AddChildNodeMonth(tnYear,listaObj); //Llamo a una función que agregue el nodo mes a //ese año
                fecha = item.FECHA_ALTA; //Asigno el nuevo año a la bandera
            }
         
        }
    }


private void AddChildNodeMonth(TreeNode tnYear, List<CLASE> listaObj)
    {
        DateTime fecha = Convert.ToDateTime("01/01/1900"); //Declaro bandera mes
        TreeNode tnMonth; //Declaro el nodo hijo que va a contener el mes
        foreach (var item in listaObj) //Por cada registro/fila/item de esa lista
        {
            if (fecha.Month != item.FECHA_ALTA.Month) //Pregunto si es el mes de la bandera es //distinto al del registro
            {
                tnMonth = new TreeNode(); //Nueva instancia del nodo mes
                tnMonth.Text = String.Format("{0:MMMM}", item.FECHA_ALTA); //Asigno a su texto el //mes a mostrar. (En este caso uso el String.Format para que aparezca el nombre del mes)
                tnMonth.SelectAction = TreeNodeSelectAction.Expand; //Expando cuando se selecciona
                tnYear.ChildNodes.Add(tnMonth); //Agrego el nodo mes al nodo padre año
                fecha = item.FECHA_ALTA; //Asigno el nuevo mes a la bandera
                AddChildNode(tnMonth, listaObj);  //Llamo a una función que agregue los nodos //Noticias/Posts a ese mes
            }

        }
    }


private void AddChildNode(TreeNode tnMonth, List<CLASE> listaObj)
    {
        foreach (var item in listaObj) //Por cada registro/fila/item de esa lista
        {
            TreeNode tn = new TreeNode(); //Declaro una nueva instancia del nodo
            tn.Text = item.TITULO_NOTICIA; //Asigno a su texto el titulo de la Noticia o Post
            tn.NavigateUrl = "Noticias/NoticiaShow.aspx?ID=" + item.ID.ToString(); //Asigno a su Url, el //webForm que muestra la Noticia + más su ID para utilizarlo luego con el GET
            tnMonth.ChildNodes.Add(tn); //Agrego el nodo Noticia al mes correspondiente
        }
     
    }

-VB.NET-

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        If  Not Page.IsPostBack //Pregunto si se no se invoca un PostBack para que sólo se cargue //una vez.
            LoadTreeView()
        End If
    End Sub


 Private Sub LoadTreeView()
        Dim nObj As New NClase() //Declaro una instancia de mi clase de negocio
        Dim  fecha As DateTime = Convert.ToDateTime("01/01/1900") //Declaro una variable bandera //para el año
        Dim tnYear As TreeNode // Declaro una variable para el nodo del año (Padre de los demás)
        Dim listaObj As New List(Of CLASE) //Creo una lista de mi tabla 
        listaObj = nObj.GetAll() //Le asigno todos los registros de esa tabla. PREVIAMENTE //ordenados por  fecha de alta de forma Descendiente
        For Each item In listaObj //Por cada registro/fila/item de esa lista
            If  fecha.Year <> item.FECHA_ALTA.Year Then//Pregunto si es el año de la bandera es //distinto al del registro
                tnYear = New TreeNode() //Declaro una nueva instancia del nodo
                tnYear.Text = item.FECHA_ALTA.Year.ToString() //Asigno a su texto el año a mostrar
                tnYear.SelectAction = TreeNodeSelectAction.Expand //Expando cuando se selecciona
                TreeView1.Nodes.Add(tnYear) //Agrego el nodo al TreeView
                AddChildNodeMonth(tnYear,listaObj) //Llamo a una función que agregue el nodo mes a //ese año
                fecha = item.FECHA_ALTA //Asigno el nuevo año a la bandera
            End If
        Next
    End Sub


Private Sub AddChildNodeMonth(ByVal tnYear As TreeNode, ByVal listaObj As List(Of CLASE))
        Dim fecha As DateTime = Convert.ToDateTime("01/01/1900") //Declaro bandera mes
        tnMonth As TreeNode //Declaro el nodo hijo que va a contener el mes
        For Each  item In listaObj //Por cada registro/fila/item de esa lista
            If fecha.Month <> item.FECHA_ALTA.Month Then//Pregunto si es el mes de la bandera es //distinto al del registro
         
                tnMonth = New TreeNode() //Nueva instancia del nodo mes
                tnMonth.Text = String.Format("{0:MMMM}", item.FECHA_ALTA) //Asigno a su texto el //mes a mostrar. (En este caso uso el String.Format para que aparezca el nombre del mes)
                tnMonth.SelectAction = TreeNodeSelectAction.Expand  //Expando cuando se selecciona
                tnYear.ChildNodes.Add(tnMonth) //Agrego el nodo mes al nodo padre año
                fecha = item.FECHA_ALTA //Asigno el nuevo mes a la bandera
                AddChildNode(tnMonth, listaObj) //Llamo a una función que agregue los nodos //Noticias/Posts a ese mes
            End If
        Next
    End Sub


Private Sub AddChildNode(ByVal tnMonth As TreeNode, ByVal listaObj As List(Of CLASE))
        For Each item In listaObj //Por cada registro/fila/item de esa lista
            TreeNode tn = New TreeNode() //Declaro una nueva instancia del nodo
            tn.Text = item.TITULO_NOTICIA //Asigno a su texto el titulo de la Noticia o Post
            tn.NavigateUrl = "Noticias/NoticiaShow.aspx?ID=" + item.ID.ToString() //Asigno a su Url, el //webForm que muestra la Noticia + más su ID para utilizarlo luego con el GET
            tnMonth.ChildNodes.Add(tn) //Agrego el nodo Noticia al mes correspondiente
        Next
     
    End Sub






No hay comentarios:

Publicar un comentario