VB.NET - Localizando e selecionando registros em um DataGrid
Neste artigo vou mostrar uma das muitas maneiras de estar localizando e exibindo registros selecionados em um DataGrid. Se você não sabe como localizar registros em um banco de dados no VB.NET e como exibir os registros encontrados no DataGrid acompanhe o artigo pois iremos estar fazendo a seleção do primeiro registro que atenda o critério informado e em uma outra opção exibindo todos os registros que atendam ao critério da seleção.
Eu pretendo utilizar a tabela clientes do banco de dados Northwind.mdb pois ela esta em português ; como eu quero utilizar o acesso a uma base de dados SQL Server e o meu SQL Server não possui um banco de dados Northwind em português vou ter que criar um novo banco de dados no SQL Server e importar as tabelas da base de dados Northwind.mdb em português.
A importação é muito simples e é feita pela ferramenta Data Transformation Services do menu Tools do Enterprise Manager.
Usando o Data Transformation Services : Importando tabelas do Access para o SQL Server 2000
A primeira coisa a fazer é abrir o Enterprise Manager e expandir o seu grupo SQL Server , selecionar DataBases e clicando com o botão direito do mouse selecionar a opção New DataBase. Agora basta informar o nome do novo banco de dados para o qual iremos importar as tabelas. O nome que eu vou utilizar para o banco de dados neste exemplo será : TesteWind (conforme abaixo)
Agora já podemos selecionar no menu Tools | Data Transformation Services | Import Data.
Na primeira janela iremos informar os dados sobre a fonte de dados , ou seja , o banco de dados Access de onde eu vou importar as tabelas. Para isto selecione o Data Source e informe o nome do arquivo conforme abaixo:
Na próxima janela temos os dados do destino. Aqui você informa o nome do seu servidor SQL , o modo de autenticação e o banco de dados que irá receber as tabelas . (No nosso caso o banco de dados TesteWind).
Defina agora o que deseja copiar selecionando todas as tabelas (não selecione as consultas).
Clique a seguir em avançar até encerrar a operação. Para verificar abra no Enterprise Manager o banco de dados TesteWind e veja as tabelas importadas:
Criando a aplicação exemplo
Agora podemos criar um novo projeto VB.NET do tipo Windows Application e inserir no formulário padrão um DataGrid , um ListBox , um TextBox e três botões de comando , conforme figura abaixo:
Nome dos controles usados no projeto: - Listbox - lstCampos - TextBox - txtCriterio - DataGrid1 - button1 - (Encontrar Primeiro) - button2 - (Encontrar Todos) - label2 - lblRegistrosEncontrados - button3 - (Sair) |
Como irei acessar uma base de dados SQL Server a primeira linha de código deve indicar a referência ao Namespace : System.Data.SqlClient
Imports System.Data.SqlClient
A seguir vou definir as variáveis visíveis no projeto:
Dim ds As DataSet
Dim tabela As New DataTable
Dim nregistros, i As Integer
No evento Load do formulário o código abaixo chama as rotinas:
Private
Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load iniciaconexao() EncheLista() lstCampos.SelectedIndex = 0 End Sub |
A rotina iniciaconexao() possui o seguinte código :
Private
Sub iniciaconexao() Try Dim strConexaoSQL = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=TesteWind" Dim sqlConexaoTesteWin As New SqlConnection(strConexaoSQL) Dim da As SqlDataAdapter = New SqlDataAdapter
sqlConexaoTesteWin.Open() |
A rotina EncheLista é dada abaixo:
Private
Sub EncheLista() Dim nomeColuna As String Dim nColunas As Integer nColunas = ds.Tables("Clientes").Columns.Count For i = 0 To (nColunas - 1) nomeColuna = ds.Tables("Clientes").Columns.Item(i).Caption lstCampos.Items.Add(nomeColuna) Next End Sub |
Até agora preenchemos o DataGrid e o ListBox com dados referentes a tabela Clientes.
Quando a aplicação for executada os dados serão exibidos e o cliente deverá indicar um nome de campo como critério para localizar o registro. A seguir deverá informar na caixa de texto o critério que deverá coincidir com o nome do campo. Ex: Pais = Mexico.
Código do botão - Encontrar Primeiro - é o seguinte :
Private
Sub Button1_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button1.Click If txtCriterio.Text = "" Then MsgBox("Informe o critério para localizar os dados.", MsgBoxStyle.Information) txtCriterio.Focus() Exit Sub End If DataGrid1.DataSource = ds.Tables("Clientes") tabela = ds.Tables("Clientes") nregistros = tabela.Rows.Count lblRegistrosEncontrados.Text = "" For i = 0 To (nregistros - 1) If (txtCriterio.Text.Equals(tabela.Rows.Item(i).Item(lstCampos.SelectedIndex))) Then DataGrid1.CurrentCell = New DataGridCell(i, lstCampos.SelectedIndex) End If Next End Sub |
A linha de código - txtCriterio.Text.Equals(tabela.Rows.Item(i).Item(lstCampos.SelectedIndex))) - merece um comentário.
Estou usando o método Equals
para verificar se o conteúdo de duas strings são o mesmo. O
método retorna True ou False.
Se o método retornar True então a célula
referente ao critério informado é selecionada:
DataGrid1.CurrentCell
= New DataGridCell(i, lstCampos.SelectedIndex)
Código do botão - Encontrar Todos - é dado a seguir :
Private
Sub Button2_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button2.Click Dim n As Integer = 0 If txtCriterio.Text = "" Then MsgBox("Informe o critério para localizar os dados.", MsgBoxStyle.Information) txtCriterio.Focus() Exit Sub End If Dim ds2 As New DataSet tabela = ds.Tables("Clientes") nregistros = tabela.Rows.Count n = nregistros For i = 0 To (nregistros - 1) If Not (txtCriterio.Text.Equals(tabela.Rows.Item(i).Item(lstCampos.SelectedIndex))) Then tabela.Rows.Item(i).Delete() n = n - 1 End If Next ds2.Tables.Add(tabela.Copy) tabela.RejectChanges() lblRegistrosEncontrados.Text = " Foram localizados : " & n & " registros para : " & lstCampos.SelectedItem & " = " & txtCriterio.Text DataGrid1.DataSource = ds2.Tables("Clientes") End Sub |
Neste código também usamos o método Equals para efetuar a comparação do critério informado com o campo indicado.
A seguir estou excluindo as linhas (registros) quando a comparação NÃO for verdadeira e decrementando o valor de n que é igual ao numero de registros da tabela. Assim terei o número de registros que será exibido.
Após isto perceba que foi criado outro DataSet com o nome ds2 sendo feita uma cópia da tabela : sua estrutura e dados para o novo DataSet.
Nota: O método Copy do objeto Datatable copia a estrutura e os dados para um novo objeto DataTable. Eu estou copiando a tabela com os registros excluidos via método Delete().
Obs: Talvez esta não seja a melhor maneira de obter este resultado. Eu apenas quis mostrar que ela existe.
A seguir estou usando o método RejectChanges para a tabela. Quando o método RejectChanges é chamado qualquer o objeto DataRow que estiver em modo de edição terá sua edição cancelada. Novas linhas serão removidas e linhas com a propriedade DataRowState definidas como Modified ou Deleted retornam ao seu estado original. Desta forma a tabela volta ao seu estado original antes das exclusões.
Abaixo temos a exibição do formulário com o resultado da busca para Cidade igual a London.
Até breve , e bons códigos .net para você...
José Carlos Macoratti