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()
   da.SelectCommand = New SqlCommand("Select * from Clientes", sqlConexaoTesteWin)
   ds = New DataSet
   da.Fill(ds, "Clientes")
   DataGrid1.DataSource = ds.Tables("Clientes")
Catch erro As Exception
    MessageBox.Show("Erro durante a conexao : " & erro.Message, "Erro na conexao", MessageBoxButtons.OK,  MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly)
End Try
End Sub

 

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