VB.NET - DataView : Ordenação e filtragem de dados
Um DataView permite criar diferentes visões dos dados armazenados em um DataTable permitindo diversos critérios para ordenação e filtragem de dados. Apesar disto tenha em mente que um DataView não pode ser tratado com uma tabela e não permite visões de tabelas combinadas. Não permite também que se inclua o exclua colunas que não existam na tabela original.
Em meu artigo - VB .NET - ADO.NET - Uma visão geral III : DataView. - já tratei das principais propriedades do objeto DataView e a forma como podemos criar um DataView. Nas vamos recordar:
Obs: Leia também os artigos que abordam o DataView :
VB.NET - Filtrando valores NULL 
em um DataView.
VB .NET - Preenchendo uma combobox. 
Criando um DataView
Existem duas maneiras de se criar um DataView:
1- Criar uma referência a propriedade DefaultView da tabela de origem :
Dim dvProdutos As DataView = ds.Tables("Produtos").DefaultView
2- Usando o construtor do DataView atribuindo os parâmetros necessários que são :
DataTable de Origem
A cadeia com o filtro (propriedade RowFilter)
A cadeia de ordenação (Sort)
O estado dos registros que exibam (RowState)
Ex:
dvTeste = New DataView(ds.Tables("Produtos"), "ProductName like '%'", "ProductName ASC", DataViewRowState.OriginalRows)
Onde temos:
| ds.Tables.("Productos") | é a o DataTable de origem | 
| "ProductName Like '%'" | é a string com o filtro | 
| "ProductName ASC" | é o critério de Ordenação | 
| DataViewRowState | é o estado dos registros a ser exibidos | 
Ordenando e filtrando dados com o DataView
A propriedade Sort do DataView permite definir critérios simples e critérios múltiplos de ordenação de colunas onde se pode incluir os parâmetros ASC para ordenação Ascendente ou DESC para ordenação Descendente.
A propriedade ApplyDefaultSort pode ser usada para criar um critério de ordenação padrão de acordo com a chave principal do DataTable que será aplicado quando a propriedade Sort é uma cadeia vazia. Ela obtêm ou define um valor que indica se a ordenação padrão.
Para o exemplo que vamos mostrar a cadeia de ordenação é feita assim:
'Cria 
a cadeia de ordenação
Dim vCadeia As String = "UnitsInStock " & IIf(optAscStock.Checked, 
"ASC", "DESC") 
vCadeias &= ", UnitsOnOrder " & IIf(optAscOrden.Checked, "ASC", "DESC") 
'Ordenar o DataView
dvProdutos.Sort = vCadeia
Podemos usar também os métodos Find ou FindRows para filtrar os dados de um DataView.
As opções do estado dos registros DataViewRowState na criação da visão usando o construtor são as seguintes:
Para que você compreenda melhor como usar a teoria e trabalhar com objetos DataView vou usar o exemplo da colaboração de Fernando Luque Sánchez.
Trata-se de um projeto VB.NET no qual estaremos acessando a tabela Products do banco de dados Northwind.mdb e realizando diversas ordenações e filtragens dinâmicas criadas em tempo de execução pela opção do usuário.
O formulário principal abaixo mostra as opções de ordenação e filtro que o usuário poderá selecionar.
|  | 
O código da carga do formulário , evento Load , é o seguinte :
| Private Sub CargaFormulario(ByVal sender As System.Object, _         ByVal e As System.EventArgs) Handles MyBase.Load
        'Define um array e preenche a Combo con las letras         Dim aLetras() As String = {"<TODOS>", "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 
        'Define um array e preenche a Combo com operadores        Dim aOperadores() As String = {"<", "<=", "=", ">=", ">"}cboOperador.Items.AddRange(aOperadores) cboOperador.SelectedIndex = 0 'Define um array e preenche a Combo com os nomes dos campos da tabela Products         Dim aCampos As String() = {"ProductId", "ProductName", "UnitPrice", "UnitsInStock", "UnitsOnOrder"}cboCampos.Items.AddRange(aCampos) 'Conexão com a base de dados         Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\teste\Northwind.mdb")        Dim daProdutos As New OleDbDataAdapter("Select ProductId, ProductName, UnitPrice, UnitsInStock, UnitsOnOrder from Products", cn)
        'define o dataset
        Dim ds As New DataSetdaProdutos.Fill(ds, "Produtos")         'define o titulo e cor do titulo 
        With drgProductos.CaptionText = "Produtos Registrados" .CaptionForeColor = Color.Red .ReadOnly = True         End With
        'O ordenamento dos produtos tem a seguinte ordem padrãolblFiltroActual.Text = "Todos"         lblOrdenActual.Text = "ProductName ASC"
        'Para filtrar precisamos do dataview        dvProdutos = New DataView(ds.Tables("Produtos"), "ProductName like '%'", "ProductName ASC", DataViewRowState.OriginalRows)
'Origem do Grid drgProductos.DataSource = dvProdutos End Sub | 
A rotina para fazer a ordenação usando uma única chave é a seguinte:
| Private Sub OrdenarUnica(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOrdenCampos.Click 
        'ORDENA o dataview com uma chaveIf cboCampos.SelectedIndex = -1 Then             MessageBox.Show("Selecione o campo para ordenar...", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)Exit Sub End If 'Cadeia de ordenamento Dim vOrdemCadeia As String = cboCampos.SelectedItem & " " & IIf(optASCcampos.Checked, "ASC", "DESC") dvProdutos.Sort = vOrdemCadeia drgProductos.DataSource = dvProdutos lblOrdenActual.Text = vOrdemCadeia End Sub 
 | 
A rotina para fazer a ordenação usando duas chaves é a seguinte:
| Private Sub OrdenarDois(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOrdenar.Click 
        'ORDENA o dataview com duas chaves'vamos usar ...UnitsInStock y UnitsOnOrder 'Comprovar se há registros... If dvProdutos.Count = 0 Then             MessageBox.Show("Sem registros para ordenar...", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)Exit Sub End If 
        'criar a cadeia de OrdenaçãoDim vCadeiaDados As String = "UnitsInStock " & IIf(optAscStock.Checked, "ASC", "DESC") vCadeiaDados &= ", UnitsOnOrder " & IIf(optAscOrden.Checked, "ASC", "DESC") 'Ordenar a visão dvProdutos.Sort = vCadeiaDados drgProductos.DataSource = dvProdutos lblOrdenActual.Text = vCadeiaDados 
    End Sub | 
Efetua a filtragem de dados pela letra selecionada:
| Private Sub FiltrarLetraInicial(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdFiltroLetra.Click Dim vCadeiaFiltro As String If cboLetraInicial.Text = "<TODOS>" Then vCadeiaFiltro = "ProductName like '%'" Else vCadeiaFiltro = "ProductName like '" & cboLetraInicial.Text & "%'" End If 'Aplicar o Filtro dvProdutos.RowFilter = vCadeiaFiltro drgProductos.DataSource = dvProdutos lblFiltroActual.Text = vCadeiaFiltro End Sub 
 | 
Efetua o filtro pelas unidades:
|  Private Sub FiltroUnidades(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFiltroUnidad.Click
        Dim vCadeiaFiltro As StringvCadeiaFiltro = "UnitsInStock " & cboOperador.SelectedItem & " " & txtUnidades.Text.ToString 'Aplicar o Filtro dvProdutos.RowFilter = vCadeiaFiltro drgProductos.DataSource = dvProdutos lblFiltroActual.Text = vCadeiaFiltro 
    End Sub | 
Abaixo um exemplo de uma tela com o resultado de um processamento do projeto:
|  | 
Pegue o código completo aqui:
 dataviewFiltro.zip
 dataviewFiltro.zip
Por hoje é só isto... Até
mais 
| Veja os 
    Destaques e novidades do SUPER DVD Visual Basic 
(sempre atualizado) : clique e confira ! Quer migrar para o VB .NET ? 
 Quer aprender C# ?? 
 | 
             Gostou ?
  Compartilhe no Facebook
Compartilhe no Facebook
  
 Compartilhe no Twitter
 
Compartilhe no Twitter
 
Referências: