el Guille, la Web del Visual Basic, C#, .NET y más... Lo+ - WinFX - .NET - ADO.NET - ASP.NET - Cómo... - Colabora - VB6 - API - HTML - Vista - Links - Foros
Llenar un TreeView desde un DataSet usando un método recurrente Utilizar la jerarquía definida en los datos de una tabla para llenar el TreeView con un método recurrente sencillo. Fecha: 13/Ene/2005 (12/Ene/05) Autor: Serge Valsse (
[email protected])
En muchas oportunidades he necesitado llenar un TreeView con los datos contenidos en una tabla de mi base de datos. Normalmente se tiene bien clara la jerarquía de los datos que se desean mostrar en la misma estructura de la tabla y esto se puede aprovechar para evitar estar definiendo nodo por nodo en el TreeView. De igual manera si los datos que llenarán el TreeView no están en una tabla se puede generar un DataSet con los diferentes modos que existen y obtener la estructura que se requiere para este método que describiré en este artículo. Supongamos que tenemos una tabla en nuestra base de datos con la siguiente estructura y datos:
Figura 1. Estructura de Tabla de origen de datos para llenar TreeView.
Obviamente los nombres pueden ser diferentes, pero para el ejemplo se necesitan que se llamen así. NombreNodo: Deberá contener el texto que se desea desplegar en el TreeView como nodo. IdentificadorNodo: Un número único que identifica a cada nodo. Puede ser el valor de la llave primaria de la tabla o algún otro campo calculado pero que sea único. Para este ejemplo es númerico pero puede ser string si así se requiere haciendo los cambios respectivos en el código desde luego. IdentificadorPadre: Este campo debe contener el IdentificadorNodo del Nodo del cual depende es Nodo representado en el registro. Para el ejemplo vamos a utilizar los siguientes datos:
Figura 2. Ejemplo de datos con jerarquía definida para llenar TreeView.
Si observamos el IdentificadorNodo del "Nodo 1" (que es 1), está en el campo IdentificadorPadre del "Nodo 1.1" y "Nodo 1.2", esto indica que serán hijos de "Nodo 1", de igual manera "Nodo 1.1.1" y "Nodo 1.1.2" serán hijos de "Nodo 1.1" ya que contienen en IdentificadorPadre el IdentificadorNodo que corresponde a este (2 para este caso). Observe que los Nodos del primer nivel, es decir los que no tienen Padre deben llevar el valor 0 (cero) en el campo IdentificadorPadre ya que no dependen de nadie. Bien, veamos ahora cual es el código del método que hará el trabajo de llenar el TreeView utilizando toda esta estructura de datos.
Creación de un formulario que llene un TreeView desde un DataSet usando un método recurrente Para el ejemplo seguiremos los siguientes pasos: 1. Crear un proyecto de tipo Proyectos de Visual C#, Aplicación para Windows y llámelo EjemploTreeView. 2. En el formulario generado (Form1) agrege dos controles, un TreeView y un Button. Desde la ventana de propiedades del botón asignar la propiedad Text = "Llenar TreeView". 3. Declare un DataSet que pueda ser vista por toda la clase Form1. System.Data.DataSet dataSetArbol; 4. En la ventana de Código agrege el método que se ejecutará recurrentemente llamándolo CrearNodosDelPadre.
private void CrearNodosDelPadre(int indicePadre, TreeNode nodePadre) { // Crear un DataView con los Nodos que dependen del Nodo padre pasado como parámetro. DataView dataViewHijos = new DataView(dataSetArbol.Tables["TablaArbol"]); dataViewHijos.RowFilter = dataSetArbol.Tables["TablaArbol"].Columns["IdentificadorPadre"].ColumnNam e + " = " + indicePadre; // Agregar al TreeView los nodos Hijos que se han obtenido en el DataView. foreach(DataRowView dataRowCurrent in dataViewHijos) { TreeNode nuevoNodo = new TreeNode(); nuevoNodo.Text = dataRowCurrent["NombreNodo"].ToString().Trim(); // si el parámetro nodoPadre es nulo es porque es la primera llamada, son los Nodos // del primer nivel que no dependen de otro nodo. if(nodePadre == null) { treeView1.Nodes.Add(nuevoNodo); } // se añade el nuevo nodo al nodo padre. else { nodePadre.Nodes.Add(nuevoNodo); } // Llamada recurrente al mismo método para agregar los Hijos del Nodo recién agregado. CrearNodosDelPadre(Int32.Parse(dataRowCurrent["IdentificadorNodo"].ToStri ng()), nuevoNodo); } } 5. Para simplificar el ejemplo, adicione los siguientes métodos que simularán los datos obtenidos desde una base de datos. // Los siguientes dos métodos son para el ejemplo, el dataset puede ser llenado desde una tabla // de la base de datos. Lo importante es que contenga un equivalente a los tres campos que se // llenan aqui. private void CrearDataSet() { dataSetArbol = new DataSet("DataSetArbol"); DataTable tablaArbol = dataSetArbol.Tables.Add("TablaArbol"); tablaArbol.Columns.Add("NombreNodo",typeof(string)); tablaArbol.Columns.Add("IdentificadorNodo",typeof(Int32)); tablaArbol.Columns.Add("IdentificadorPadre",typeof(Int32));
InsertarDataRow("Nodo InsertarDataRow("Nodo InsertarDataRow("Nodo InsertarDataRow("Nodo InsertarDataRow("Nodo
1",1,0); 1.1",2,1); 1.1.1",3,2); 1.1.2",4,2); 1.2",5,1);
InsertarDataRow("Nodo 2",6,0); InsertarDataRow("Nodo 2.1",7,6); InsertarDataRow("Nodo 2.2",8,6); InsertarDataRow("Nodo 3",9,0); InsertarDataRow("Nodo 3.1",10,9); InsertarDataRow("Nodo 3.2",11,9); } private void InsertarDataRow(string column1, int column2, int column3) { DataRow nuevaFila = dataSetArbol.Tables["TablaArbol"].NewRow(); nuevaFila["NombreNodo"] = column1; nuevaFila["IdentificadorNodo"] = column2; nuevaFila["IdentificadorPadre"] = column3; dataSetArbol.Tables["TablaArbol"].Rows.Add(nuevaFila); } 6. En el constructor de la clase Form1() ingrese la llamada al método que llenará el DataSet. El código quedará como sigue: public Form1() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // CrearDataSet();
} 7. Finalmente en el evento Click del boton button1 asocie el método siguiente que llamará al método para el llenado del TreeView.
private void button1_Click(object sender, System.EventArgs e) { // Llamar al método por primera vez que llenará el TreeView, este método se llamará luego // a sí mismo recurrentemente. CrearNodosDelPadre(0, null); } 8. Compile y ejecute el proyecto. Lo que obtendremos es lo siguiente:
Figura 3. Resultado después de hacer Click en el botón "Llenar TreeView".
Si necesitas obtener el IdentificadorNode del Nodo que el usuario selecciona se puede utilizar la propiedad Tag del nodo, por supuesto si previamente en la creación del nodo se almacenó dicho valor en esta propiedad. Por favor no olvides calificar el artículo en la caja de PanoramaBox que se muestra al inicio de la página.
EJEMPLO2
Loveless, único en su especie El blog de un informático con una buena ortografía • Inicio • Escriba el texto a buscar
Enviar
Inicio > SQL Server, Tecnologías Microsoft, SQL Server, .NET, Programación, C#, Base de datos > Llenar un TreeView de ASP.NET con datos de SQL Server mediante recursividad
Llenar un TreeView de ASP.NET con datos de SQL Server mediante recursividad Septiembre 17, 2010 lovelessisma Deja un comentario Ir a los comentarios La vez pasa subí un artículo sobre recursividad en SQL Server, ahora sin más preámbulo hay que darle uso a eso. En este primer ejemplo realizaremos una estructura de árbol en ASP.NET y C#, conocida como TreeView. La llenaremos de forma recursiva usando un procedimiento almacenado y con datos de la tabla tm_ubigeo. En este artículo está el código SQL de la base. Primero creamos nuestro TreeView, al que llamaremos treevUbigeo, por supuesto después de haber creado el sitio Web en Visual Studio 2008 y haber agregado una página llamada sample1_TreeViewRecursivo.aspx (o como ustedes quieran que se llame):
Ahora iremos a la base creada en SQL Server 2005 y creamos el siguiente procedimiento almacenado: Código: ver fuente imprimir?
01 alter procedure [dbo].[pa_ubigeo_listar] 02 ( 03
@tipo varchar(10),
04
@param1 int
05 ) 06 as 07 begin 08
if @tipo = 'nodos'
09 10
begin select tm_idubigeo, tm_nomubigeo, dbo.fc_Obtenervalorcomun('tm_tipoubigeo', tm_tipoubigeo) as tipoubigeo
11 12 13
from tm_ubigeo where tm_idubigeosup = @param1 end
14 end
El código anterior nos muestra un procedimiento almacenado que recibe dos parámetros, uno para definir el tipo de consulta y el otro para indicar el id de referencia. Consta de una condición, la cual nos mostrará los registros que coincidan según la id de referencia que enviemos. Ahora procedemos a crear una clase en el App_Code, a la cual llamaremos clsConexion, la cual tendrá este código: Código: ver fuente imprimir?
01 public class clsConexion 02 {
String var_cadenaconexion = (@"server=WINDOWS03 1F39AFE\SQLEXPRESS;database=bd_ejemplo_recursivo;integrated security=true"); 04
SqlConnection var_conexion = new SqlConnection();
05
SqlCommand var_comando = new SqlCommand();
06
SqlDataAdapter var_adaptador = new SqlDataAdapter();
07 08 09
public clsConexion() {
10 11
}
12 13
public void abrirconexion()
14
{
15
var_conexion.ConnectionString = var_cadenaconexion;
16
if (var_conexion.State == ConnectionState.Closed)
17 18
var_conexion.Open(); }
19 20
public void cerrarconexion()
21
{
22 23 24
if (var_conexion.State == ConnectionState.Open) var_conexion.Close(); }
25 26
public DataSet dtsUbigeoListar(string tipo, int idnodo)
27
{
28 29
DataSet var_resultado = new DataSet(); try
30
{
31
var_comando.CommandText = "pa_ubigeo_listar";
32
var_comando.CommandType = CommandType.StoredProcedure;
33
var_comando.Connection = var_conexion;
var_comando.Parameters.Add("@tipo", SqlDbType.VarChar, 10).Value = tipo; var_comando.Parameters.Add("@param1", SqlDbType.Int).Value 35 = idnodo; 34
36
var_adaptador.SelectCommand = var_comando;
37
var_adaptador.Fill(var_resultado, "consulta");
38
var_comando.Parameters.Clear();
39
}
40
catch (Exception ex)
41
{
42
throw ex;
43 44 45
} return var_resultado; }
46 }
Primero están las variables necesarias para la conexión y ejecución de procedimientos. Los primeros dos métodos (aparte del constructor), son para abrir y cerrar la conexión a la base de datos respectivamente (si no lo has notado de seguro escuchas a Chino y Nacho a todo volumen mientras), y la función dtsUbigeoListar nos servirá para llenar el DataSet, teniendo el mismo número de parámetros del procedimiento almacenado pa_ubigeo_listar. Nos dirigimos luego a la página Web, donde en su código programaremos el método mostrarNodos que hará la lógica del llenado recursivo del TreeView: Código: ver fuente imprimir?
01 clsConexion cn = new clsConexion(); 02 private void mostrarNodos(TreeNode pad) 03 { 04
DataSet dts = new DataSet();
05
int i = 0;
06 07
dts = cn.dtsUbigeoListar("nodos", Convert.ToInt32(pad.Value)); for(i = 1; i y < contraseña > de la contraseña con los valores correctos. Asegúrese de que el identificador de usuario tiene los permisos adecuados realizar estas operaciones en la base de datos.
6.
Dim DSNWind As DataSet
7.
Dim CNnwind As New SqlClient.SqlConnection("DATA SOURCE=servername;USER ID=;PASSWORD=;INITIAL CATALOG=northwind;") '