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 DataSet daProdutos.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ão lblFiltroActual.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 chave If 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ção Dim 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 String vCadeiaFiltro = "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
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 Twitter
Referências: