WPF - Simulando o recurso AutoCompletar e usando o controle AutoCompleteBox
Neste artigo vou mostrar como simular o recurso AutoCompletar em uma aplicação WPF e também como usar o controle AutoCompleteBox da WPF ToolKit.
Vamos iniciar simulando o recurso auto-completar usando um controle TextBox e um controle ListBox, de forma que ao digitar cada caractere no controle TextBox os valores serão obtidos da fonte de dados, filtrados e exibidos no controle ListBox. Selecionando um item do ListBox o mesmo será exibido no controle DataGrid.
Vamos usar como fonte de dados o banco de dados Northwind.mdf e a tabela Customers de forma a exibir o nome do contato (ContactName).
Inicie o Visual Basic 2010 Express Edition e no menu File -> New Poject selecione o template WPF Application e informe o nome Wpf_AutoComplete;
A seguir no arquivo MainWindow.xaml vamos incluir 1 controle TextBox , 1 controle ListBox e 1 controle DataGrid conforme o leiaute abaixo:
<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPF - AutoCompletar" Height="253" Width="467"> <Grid Height="191" Width="421" Background="White"> <TextBox Height="23" HorizontalAlignment="Left" Margin="36,23,0,0" Name="txtAutoCompletar" VerticalAlignment="Top" Width="120" /> <ListBox Height="100" HorizontalAlignment="Left" Margin="35,48,0,0" Name="lstAutoCompletar" VerticalAlignment="Top" Width="120" BorderBrush="White" /> <DataGrid AutoGenerateColumns="True" Height="147" HorizontalAlignment="Left" Margin="190,23,0,0" Name="MacorattiGrid" VerticalAlignment="Top" Width="200" SelectionMode="Single" BorderBrush="#FF00DAF8" /> </Grid> </Window> |
O controle DataGrid tem a sua propriedade SelectionMode configurada para Single, e, o controle ListBox tem sua propriedade BorderBrush definida como White.
Vamos criar o data source usando o banco de dados Northwind.mdf.
Vamos agora definir o código no arquivo MainWindow.xaml.vb referente aos eventos TextChanged do controle TextBox e SelectionChanged do controle ListBox.
Abra o arquivo MaindWindow.xaml.vb e defina os namespaces que iremos usar:
Imports System.Data
Imports System.Data.SqlClient
A seguir vamos definir a string de conexão (podemos obtê-la do arquivo App.Config também) conforme a seguir:
Dim conn As New
SqlConnection("Data
Source=.\SQLEXPRESS;AttachDbFilename=C:\NORTHWND.MDF;Integrated
Security=True;Connect Timeout=30;User Instance=True")
Dim dr As SqlDataReader
A seguir no evento TextChanged do controle TextBox vamos incluir o código a seguir:
Private Sub txtAutoCompletar_TextChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.TextChangedEventArgs) Handles txtAutoCompletar.TextChanged lstAutoCompletar.Items.Clear() Try conn.Open() Dim comm As New SqlCommand("SELECT ContactName FROM Customers WHERE ContactName like '" + txtAutoCompletar.Text + "%'", conn) dr = comm.ExecuteReader() While dr.Read() lstAutoCompletar.Items.Add(dr.GetValue(0).ToString()) End While Catch ex As Exception MessageBox.Show(ex.Message.ToString()) Finally conn.Close() End Try End Sub |
Neste código abrimos uma conexão com o banco de dados e executamos a seguinte instrução SQL :
SELECT ContactName FROM Customers WHERE ContactName like '" + txtAutoCompletar.Text + "%'"
Essa instrução utiliza a palavra reservada Like e também o caractere % que permite realizar um filtro a cada caractere digitado na caixa de texto visto que o código será executado sempre que algo mudar no controle TextBox.
Os resultados são exibidos no controle ListBox através do datareader:
While dr.Read()
lstAutoCompletar.Items.Add(dr.GetValue(0).ToString())
End While
No evento SelectionChange do controle ListBox temos o seguinte código:
Private Sub lstAutoCompletar_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles lstAutoCompletar.SelectionChanged Try conn.Open() Dim comm As New SqlCommand("SELECT ContactName FROM Customers Where ContactName='" + lstAutoCompletar.SelectedItem.ToString() + "'", conn) Dim ds As New DataSet() Dim da As New SqlDataAdapter(comm) da.Fill(ds) MacorattiGrid.ItemsSource = ds.Tables(0).DefaultView Catch ex As Exception MessageBox.Show(ex.Message.ToString()) Finally conn.Close() End Try End Sub |
Este código obtém o valor do item selecionado no ListBox e o exibe no controle DataGrid.
Executando o projeto e digitando os caracteres Jo na caixa de texto, após selecionar o item Jonas Bergulfsen iremos obter o resultado a seguir:
Dessa forma estamos simulando o recurso AutoCompletar usando um TextBox e um Listbox.
Mas existe uma maneira mais fácil de fazer isso usando o controle AutoCompleteBox da WPF ToolKit.
Usando o controle AutoCompleteBox
Para poder usar o controle AutoCompleteBox devemos referenciar a WPF ToolKit em nosso projeto.
Se você ainda não tem a WPF ToolKit instalada faça o download aqui: http://wpf.codeplex.com/releases/view/40535
Após isso inicie o Visual Basic 2010 Express Edition e no menu File -> New Poject selecione o template WPF Application e informe o nome Wpf_AutoCompleteBox;
Em seguida vamos referenciar a WPF ToolKit no nosso projeto.
No menu Project selecione Add Reference e a seguir localize o arquivo WPFToolKit.dll selecionando e clicando em OK;
Obs:O namespace System.Windows.Controls.Input usa a WPFToolkit.dll.
A seguir defina o seguinte leiaute no arquivo MainWindow.xaml :
<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit" Title="MainWindow" Height="350" Width="525"> <Grid> <Grid.Background> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="Black" Offset="0" /> <GradientStop Color="#00FFFF00" Offset="1" /> </LinearGradientBrush> </Grid.Background> <Controls:AutoCompleteBox x:Name="macComplete" VerticalAlignment="Top" Margin="78,21,37,0" Height="39" /> </Grid> </Window> |
Para encerrar vamos definir no evento Loaded da janela MainWindow o seguinte código:
Imports System.Collections.Generic Imports System.Windows Class MainWindow Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded Dim listaNomes As New List(Of String)() From {"Albert Fernando", _ "Antonio Banderas", _ "Alexandre Pires", _ "Barbara Moore", _ "Brad Pit", _ "Bob Dylan", _ "Cameron Diaz", _ "Catherina Biel", _ "Christopher Ben", _ "Jose Carlos Macoratti", _ "Janice Rachel", _ "Jefferson Andre", _ "Jessica Naara", _ "Miriam Estela", _ "Mario Fernandes" _ } macComplete.ItemsSource = listaNomes End Sub End Class |
Neste código definimos uma coleção de nomes de artistas (conhece todos ???) e em seguida atribuímos a lista a propriedade ItemsSource do controle AutoCompleteBox.
Executando o projeto iremos e digitando um caractere J iremos obter:
Usar o controle AutoCompleBox é muito mais simples não é mesmo ???
Pegue os dois projetos completos aqui: Wpf_AutoCompletar e Wpf_AutoCompleteBox
Eu sei é apenas WPF, mas eu gosto...
"Passará o céu e a terra, mas as minhas palavras jamais passarão." (Mateus 24:35)
Referências: