domingo, 23 de diciembre de 2007

(Treeview - DataTable) Como cargar data en un Treeview desde una DataTable

Hola a todos nuevamente, lo prometido es deuda así que me estoy haciendo un tiempito para poder ampliar un poco más mi blog, estuve bastante complicado estos últimos meses, y es por eso por lo que no me han visto hacer nuevas entradas, ademas del hecho de que he estado trabajando más que nada con DotNetNuke y no estoy teniendo nuevas experiencias en ASP puro. En fin.. vayamos a lo nuestro.
Lo que les voy a dar ahora es una sencilla función que les permitirá mostrar datos a partir de un DataTable en un TreeView; la razón de este post es que recorrí muuuuuchas páginas buscando una solución sencilla a un dilema sencillo, pero fuí incapaz de encontrar una, asi que decidí hacer la propia. Cabe aclarar que esta solución corresponde a un arbol de solo 2 niveles (En su momento no necesité mas, pero no debería ser demasiado dificil extenderlo), y en mi caso, los nodos padres no son seleccionables, es decir, de ser clickados, no causarán un postback.
Aca les dejo el codigo:

private void PopulateNodes(DataTable dt, TreeNodeCollection tree)
{
string backup = " ";
int counter = dt.Rows.Count;
for (int i = 0; i <= dt.Rows.Count - 1; i++)
{
TreeNode tn = new TreeNode();
tn.Text = dt.Rows[i].ItemArray[0].ToString();
tn.Value = "Root";
tn.SelectAction = TreeNodeSelectAction.None;
tree.Add(tn);
backup = dt.Rows[i].ItemArray[0].ToString();

while ((i < counter) && (dt.Rows[i].ItemArray[0].ToString() == backup))
{
TreeNode child = new TreeNode();
child.Text = dt.Rows[i].ItemArray[3].ToString();
child.Value = dt.Rows[i].ItemArray[1].ToString();
tn.ChildNodes.Add(child);
i++;
}
i--;//debido a que en el for lo primero que se hace luego del while es volver a incrementar

}

}
En realidad el código como que se explica solo, pero les voy a comentar un poco como funciona:
Con el For, lo que hago recorrer la totalidad del DataTable, y lo que puede ser dificil de entender es que tengo dos loops dentro de uno, tanto con el For, como con el While recorro el mismo DataTable, utilizando EL MISMO INDICE, y esta es la parte mas complicada. Lo demás es sencillo, primero creo 2 variables, una va a tener la cantidad de rows, otra va a contener una copia del nodo padre que estoy tratando. Dentro del for, creo un nodo, le asigno el valor correspondiente desde el DataTable, me aseguro de que los nodos padres("tn") no sean seleccionables (Optativo), luego agrego ese nodo al arbol corresponiente (TreeView), y guardo una copia de su contenido en "backup".
Ahora entro en el while, y cargo todos los nodos hijos("child") correspondientes a ese nodo padre, de manera similar a la anterior, creo el nodo, le asigno su valor correspondiente, y luego lo pongo como nodo hijo (ChildNode) de "tn". Fuera del while, solo resta incrementar el contador.
Aclaracion, la ultima linea (i--) está porque, debido a la combinacion que hice de for y while, necesariamente al finalizar el ultimo loop del while, se incrementaba el contador "i", y luego de eso, el for volvia a realizar el incremento, intentando hacer referencia a un valor inexistente.
Respecto a los "values" de cada nodo, es medio que optativo (si mal no recuerdo) el ponerles un valor o no, pero (si mal no recuerdo) era una manera de identificar a cada tipo de nodo, de una forma u otra, les dejo a ustedes la tarea de investigarlo.
La forma de llamar a esta funcion es sencilla, simplemente agreguen el control TreeView correspondiente a la pagina, llenen el DataTable con la info que necesiten tratar, y listo, están hechos.
Otra aclaración, mucha gente probablemente llegue aqui buscando formas de usar un Dataset, en lugar de un DataTable, y un gran porcentaje de ellos, solo tendrá una tabla única en el DataSet. Acostúmbrense a usar solo lo que necesitan, no más ni menos. El DataSet es una estructura que puede contener varias tablas, no solamente una. Si solo tienen una, usen un DataTable.
Bueno, me voy desipiendo por ahora, ya saben que cualquier consulta/critica constructiva, siempre es bienvenida. Hasta pronto.

Saludos y Happy Programming