Ordenar y Filtrar un DataView

Uso de Sort y RowFilter 

Fecha: 05/Jul/2005 (05 de Julio de 2005)
Autor: Ing. Fernando Luque Sánchez -  DCE 4 Estrellas

fls2307@hotmail.com


Sres. Desarrolladores, en esta oportunidad quiero mostrar en una aplicación sencilla el uso de Vistas. Usando la base de datos Northwind y la tabla productos muestro opciones para ordenar y para filtrar un DataView.

UN POCO DE TEORIA

Un DataView permite crear diferentes Vistas de los datos almacenados en una DataTable asignandole diferentes criterios de ordenación y filtrado. El DataView presenta una vista dinámica de los datos contenidos en un  DataTable, en importante anotar que el DataView no se puede tratar como una Tabla y no puede proporcionar vista de tablas combinadas.

El DataView tampoco puede Excluir o Incliur columnas que no existen en la tabla original como por ejemplo las columnas o campos calculados.

Crear un DataView

Para crear un DataView existen dos formas:

1. Crear una referencia a la propiedad DefultView de la Tabla origen, como la siguiente orden

Dim dvProductos As DataView = dsDatos.Tables("Productos").DefaultView

2. Utilizando el Constructor del  DataView, para esto debe asignarse los parámetros necesarios como: el DataTable de Origen, la cadena de Filtrado (Propiedad RowFilter), la cadena de Ordenamiento (Sort) y el estado de las filas o registros que muestre (RowState). En nuestro ejemplo utilizamos la siguente instrucción:

dvProductos = New DataView(dsDatos.Tables("Productos"), "ProductName like '%'", "ProductName ASC", DataViewRowState.OriginalRows)

Donde:

Ordenar y Filtrar un control DataView

La propiedad Sort permite establecer criterios simple y múltiples de ordenación de columnas, donde se puede incluir los parametros ASC para orden ascendente y DESC para orden descendente. Se puede utilizar la propiedad ApplyDefaultSort para crear un criterio de ordenación por defecto de acuerdo a la clave principal del DataTable, este ordenamiento aplica cuando la propiedad Sort es una cadena vacia.

Para nuestro ejemplo la cadena de conexión la armamos con las opciones seleccionadas previamente:

'Armar la cadena de Orden
Dim vCadenaDos As String = "UnitsInStock " & IIf(optAscStock.Checked, "ASC", "DESC")
vCadenaDos &= ", UnitsOnOrder " & IIf(optAscOrden.Checked, "ASC", "DESC")
'Ordenar la Vista
dvProductos.Sort = vCadenaDos

Las opciones de ordenación de la porción de código anterior se extraen teniendo en cuenta el estado de los botones de opción optAscStock y optASCOrden.

También podemos utilizar los métodos Find o FindRows para filtrar los datos de un DataView, consiguiendo un máximo rendimiento de nuestra aplicación.

Las opciones del estado de los registros DataViewRowState en la creación de la vista utilizando el constructor son las siguentes:

DataViewRowState Descripción
CurrentRows La versión de fila Current de todas las filas Unchanged, Added y Modified. Éste es el valor predeterminado.
Added La versión de fila Current de todas las filas Added.
Deleted La versión de fila Original de todas las filas Deleted.
ModifiedCurrent La versión de fila Current de todas las filas Modified.
ModifiedOriginal La versión de fila Original de todas las filas Modified.
None Ninguna fila.
OriginalRows La versión de fila Original de todas las filas Unchanged, Modified y Deleted.
Unchanged La versión de fila Current de todas las filas Unchanged.

En otro aporte enviare un código para poder modificar los datos mediante DataView, les adelanto que se puede controlar esto con  las propiedades AllowNew, AllowEdit y AllowDelete. Tenga en cuenta que los cambios definitivos en la base de datos se efectuan con los métodos AcceptChanges o RejectChanges de DataTable de origen. Una cosa muy importante, sabemos que las aplicaciones constan siempre de varios DataTables relacionados, para sincronizar las vistas de todas las tablas del DataSet es ideal utilizar un DatAViewManager.

A continuación sigue código en Visual Basic:

    Private Sub CargarFormulario(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load

        'Combo con las letras 
       Dim aLetras() As String = {"<ALL>", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "Ñ", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
        cboLetraInicial.Items.AddRange(aLetras)
        cboLetraInicial.SelectedIndex = 0

        'Combo con los Operadores
        Dim aOperadores() As String = {"<", "<=", "=", ">=", ">"}
        cboOperador.Items.AddRange(aOperadores)
        cboOperador.SelectedIndex = 0

        'Combo con los nombres de campo
        Dim aCampos As String() = {"ProductId", "ProductName", "UnitPrice", "UnitsInStock", "UnitsOnOrder"}
        cboCampos.Items.AddRange(aCampos)

          'Conectar a la Base de datos: Conexión, Adaptador y DataSet
        Dim cn As New SqlConnection("workstation id=HOME;packet size=4096;user id=fernnado;integrated security=SSPI;data source=(local);persist security info=False;initial catalog=Northwind")
        Dim daProductos As New SqlDataAdapter("Select ProductId, ProductName, UnitPrice, UnitsInStock, UnitsOnOrder from Products", cn)
        Dim dsDatos As New DataSet
        daProductos.Fill(dsDatos, "Productos")
        With drgProductos
            .CaptionText = "Productos Registrados"
            .CaptionForeColor = Color.Red
            .ReadOnly = True
        End With

        'Etiquetas por defecto
        'El ordenamiento de los Productos por defecto tiene el siguiente orden
        lblFiltroActual.Text = "Todos"
        lblOrdenActual.Text = "ProductName ASC"  

        'No olvidemos que para filtrar necesitamos la vista
        dvProductos = New DataView(dsDatos.Tables("Productos"), "ProductName like '%'", "ProductName ASC", DataViewRowState.OriginalRows)

        'Origen del Grid
        drgProductos.DataSource = dvProductos
    End Sub

 

    Private Sub OrdenarUnica(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdOrdenCampos.Click
        'PROCEDIMIENTO QUE ORDENA LA VISTA CON UNA SOLA CLAVE
        If cboCampos.SelectedIndex = -1 Then
            MessageBox.Show("Seleccione el campo para ordenar...", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Sub
        End If

        'Cadena de ordenamiento
        Dim vCadenaOrden As String = cboCampos.SelectedItem & " " & IIf(optASCcampos.Checked, "ASC", "DESC")
        dvProductos.Sort = vCadenaOrden
        drgProductos.DataSource = dvProductos
        lblOrdenActual.Text = vCadenaOrden
    End Sub

 

El código completo se encuentra en el archivo adjunto al final del artículo, suerte a todos y A SEGUIR DESARROLLANDO, cualquier consulta al correo que se encuentra al inicio.

Ing. Fernando Luque Sánchez
CIP 61806
Trujillo - Perú


Espacios de nombres usados en el código de este artículo:

System.Data
System.Data.SQLClient


Fichero con el código de ejemplo: FernandoLuque_FiltrosOrdenamientos.zip - Tamaño 10 KB


ir al índice