ASP .NET - GridView - Procurando e destacando texto com Ajax (C#)
Hoje vou mostrar como realizar uma busca em um controle GridView destacando o resultado obtido usando os recursos do Ajax.
Como exemplo eu vou criar uma aplicação ASP .NET usando controle GridView vinculado à tabela Employee do banco de dados Northwind.mdf.
Abra o Visual Web Developer 2010 Express Edition e crie um novo projeto usando a linguagem C# e o template ASP .NET Empty Web Application com o nome GridView_Procurar;
No menu Project-> Add New Item vamos incluir um novo Web Form com o nome Procura.aspx;
Vamos incluir também uma pasta no projeto clicando com o botão do mouse sobre o nome do projeto e selecionando Add-> New Folder e a seguir informando o nome Images;
Vamos incluir uma imagem existente nesta pasta clicando com o botão direito do mouse sobre ela e selecionando Add Existing Item e selecionando a imagem ajax.gif;
Vamos incluir também um arquivo de configuração ao projeto via menu Project-> Add New Item e selecionando o modelo Web Configuration File, aceitando o nome Web.Config;
A seguir vamos incluir no arquivo Web.Config a string de conexão que vamos usar no projeto:
<configuration> <connectionStrings> <add name="Northwind" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=Northwind;Integrated Security=SSPI;" providerName="System.Data.SqlClient" /> </connectionStrings> |
No formulário web Procura.aspx inclua os seguintes controles a partir da ToolBox:
1- ScriptManager - no início do
formulário;
2- UpdatePanel - logo após o ScriptManager;
3- GridView - No interior do controle UpdatePanel e defina duas
colunas no controle GridView:
3-1 - A coluna
Nome do tipo TemplateField com um ItemTemplate vinculado ao campo
FirstName da tabela Employee;
3-2 - A coluna
Sobrenome do tipo BoundField vinculada ao campo
LastName da
tabela Employee
3-3 - Defina
também um FooterTemplate contendo um controle TextBox
(ID=txtProcura) e um controle Button (ID=btnProcura e
CommandName=Search)
4- UpdateProgress - Defina um ProgressTemplate contendo um
controle Image que deverá usar a imagem ajax.gif;
O leiaute do formulário Procura.aspx é mostrado a seguir:
O código fonte exibido pela guia Source é o seguinte:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Procura.aspx.cs" Inherits="GridView_Procurar.Procura" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title>Procurando texto e destacando</title> <style type="text/css"> .highlight {text-decoration:none; font-weight:bold; color:black; background:yellow;} </style> </head> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <div> <asp:GridView ID="grdProcurar" runat="server" BackColor="white" BorderColor="Aqua" AutoGenerateColumns="false" ShowFooter="true" OnRowCommand="grdProcurar_RowCommand" Height="133px" Width="397px"> <FooterStyle BackColor="Cyan" ForeColor="AntiqueWhite" /> <PagerStyle BackColor="#99CCCC" ForeColor="#002299" HorizontalAlign="Left" /> <HeaderStyle BackColor="#002299" Font-Bold="True" ForeColor="#CBBCFF" /> <Columns> <asp:TemplateField HeaderText="Nome"> <ItemTemplate> <asp:Label ID="lblFIrstName" runat="server" Text='<%# Highlight(Eval("FirstName").ToString()) %>'></asp:Label> </ItemTemplate> <FooterTemplate> <asp:TextBox ID="txtProcura" runat="server" Width="100px"></asp:TextBox> <asp:Button ID="btnProcura" CommandName="Search" runat="server" Text="Procurar" Width="60px" /> </FooterTemplate> </asp:TemplateField> <asp:BoundField DataField="LastName" HeaderText="Sobrenome" /> </Columns> </asp:GridView> </div> </ContentTemplate> </asp:UpdatePanel> <asp:UpdateProgress ID="UpdateProgress1" runat="server"> <ProgressTemplate> <img src="Images/ajax.gif" alt="Procuraig" style="height: 12px; width: 13px" /> </ProgressTemplate> </asp:UpdateProgress> </form> </body> </html> |
Definindo o código do arquivo Procura.aspx.cs
Vamos iniciar declarando os namespaces usados:
using System;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Text.RegularExpressions;
No início do formulário web vamos definir a string de conexão obtida a partir do arquivo web.config:
string conString = ConfigurationManager.ConnectionStrings["Northwind"].ToString();
No evento Load do formulário web digite:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindGrid(); } } |
Defina a rotina BindGrid() com seguinte código:
private void BindGrid() { DataTable dt = getRegistros(); if (dt.Rows.Count > 0) { grdProcurar.DataSource = dt; grdProcurar.DataBind(); } } |
A rotina getRegistros deverá acessar o banco de dados Northwind e obter os registros da tabela Employee com o código abaixo:
private DataTable getRegistros() { SqlConnection conn = new SqlConnection(conString); conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.CommandText = "Select * from Employees"; SqlDataAdapter dAdapter = new SqlDataAdapter(); dAdapter.SelectCommand = cmd; DataSet objDs = new DataSet(); dAdapter.Fill(objDs); return objDs.Tables[0]; } |
No evento RowCommand vamos definir o código que vai realizar a busca quando o usuário informar o nome e clicar no botão de comando;
Estamos incluindo um delay de 2 segundos para que a imagem exibida no controle UpdateProgress possa ser vista pelo usuário:
protected void grdProcurar_RowCommand(object sender, GridViewCommandEventArgs e) { System.Threading.Thread.Sleep(2000); if (e.CommandName == "Search") { TextBox txtGrid = (TextBox)grdProcurar.FooterRow.FindControl("txtProcura"); ProcuraTexto(txtGrid.Text); } } |
O código da rotina ProcuraTexto() é dado abaixo:
private void ProcuraTexto(string strProcuraTexto) { DataTable dt = getRegistros(); DataView dv = new DataView(dt); string expressaoBusca = null; if (strProcuraTexto == string.Empty) { } else { if (!String.IsNullOrEmpty(strProcuraTexto)) { expressaoBusca = string.Format("{0} '%{1}%'", grdProcurar.SortExpression, strProcuraTexto); } dv.RowFilter = "FirstName like" + expressaoBusca; } grdProcurar.DataSource = dv; grdProcurar.DataBind(); } |
Finalmente temos o código da rotina Destacar que destaca o texto localizado no GridView e que foi definido no ItemTemplate:
<ItemTemplate> <asp:Label ID="lblFIrstName" runat="server" Text='<%# Destacar(Eval("FirstName").ToString()) %>'></asp:Label> </ItemTemplate> |
O Código da rotina Destacar é o seguinte:
public string Destacar(string textoProcura) { GridViewRow gvrRodape = grdProcurar.FooterRow; if (gvrRodape != null) { TextBox txtExemplo = (TextBox)grdProcurar.FooterRow.FindControl("txtProcura"); if (txtExemplo.Text != null) { string strBusca = txtExemplo.Text; Regex RegExp = new Regex(strBusca.Replace(" ", "|").Trim(), RegexOptions.IgnoreCase); return RegExp.Replace(textoProcura, new MatchEvaluator(SubstituirPalavras)); } else { return textoProcura; } } else { return textoProcura; } } |
A rotina SubstituirPalavras tem o código abaixo:
public string SubstituirPalavras(Match m) { return "<span class=highlight>" + m.Value + "</span>"; } |
Executando o projeto teremos o seguinte resultado:
1- Após informar o nome e clicar em Procurar teremos o Nome encontrado destacado conforme abaixo:
Pegue o projeto completo aqui : GridView_Procurar.zip
João 6:47
Em verdade, em verdade vos digo: Aquele que crê tem a vida eterna.Referências: