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