martes, enero 30, 2007

AutoCompleteExtender en VB y usando Access

He estado trabajando con la ultima version liberada de ASP.Net Ajax 1.0 (ajax1), y despues de una noche de desvelo y un enlace de menos de 56kbps, encontré una manera de migrar el ejemplo que trae el  ASP.Net Ajax Control Toolkit (ANACT), en particicular el que se refiere al autocompleteextender.

Algo importante, es eliminar todas las versiones que se hayan instalado con anterioridad a la version liberada, no haber hecho esto ultimo desde un inicio me ocasiono un par de jalones de cabello.

Lo primero es el servicio web desde donde se obtendra la informacion para el control:

------------------------------------------------------------------------------

<%@ WebService Language="VB" Class="WebService" %>

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Web.Script.Services

<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ScriptService()> _
Public Class WebService
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function obtenNombres( _
ByVal prefixText As String, _
ByVal count As Integer) _
As String()
If count = 0 Then
count = 10
End If

Dim resultado() As String
Dim listaNombres As String = String.Empty

Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Inetpub\Webs\MIWEB\App_Data\Access.mdb"
Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)

Dim queryString As String = "SELECT DISTINCT TOP " & count & " ([Pacientes].Nombre) & ' ' & ([Pacientes].ApellidoPaterno) AS NombreCompleto " & _
"FROM(Pacientes) WHERE(((Pacientes.Nombre) Like '" & prefixText & "%'))"
Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
dbCommand.CommandText = queryString
dbCommand.Connection = dbConnection

dbConnection.Open()
Dim dataReader As System.Data.IDataReader = dbCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection)

While dataReader.Read()
listaNombres += dataReader("NombreCompleto") & vbLf
End While

resultado = listaNombres.Split(vbLf)
Return resultado
End Function

End Class

------------------------------------------------------------------------

El webservice busca en el archivo de acceso los datos correspondientes en la tabla de usuarios (pacientes para este caso), y da como resultado solo los que se parecen al valor de prefixText.

Algo que se tiene que modificar de un webservice normal es agregar un atributo para que pueda ser usado por los componente de Ajax "<ScriptService()> ", que en el ejemplo esta con negritas. Antes de colocar el atributo de debe llamar al namespace "Imports System.Web.Script.Services".

Estas dos lineas anteriores hacen la diferencia para que el control funcione correctamente. A continuacion la webform:

--------------------------------------------------------------------------

<%@ Page Language="VB" %>
<%@ Register
Assembly="AjaxControlToolkit"
Namespace="AjaxControlToolkit"
TagPrefix="ajaxToolkit" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div class="demoarea">
<div class="demoheading">
<h2>
<span style="color: #990000; font-family: Calibri">Demostracion de AutoComplete</span></h2>
<p/>
<span style="font-family: Calibri">Escribe algunos caracteres en este campo de texto.
El servicio web respondera con algunos registros de la base de datos.
<br />
</span>
<br />
<asp:TextBox runat="server" ID="myTextBox" Width="300" autocomplete="off" />
<ajaxToolkit:AutoCompleteExtender
runat="server"
ID="autoComplete1"
TargetControlID="myTextBox"
ServicePath="webservice.asmx"
ServiceMethod="obtenNombres"
MinimumPrefixLength="2"
CompletionInterval="1000"
EnableCaching="true"
CompletionSetCount="12" />

<script type="text/javascript">
// Work around browser behavior of "auto-submitting" simple forms
var frm = document.getElementById("aspnetForm");
if (frm) {
frm.onsubmit = function() { return false; };
}
</script>
</div>
</div>
</form>
</body>
</html>

-----------------------------------------------------------------------

Notese que se agregar el dll del ANACT como un registro de assembly, para poder usar la extension AutoCompleteExtender.

Listo!

2 comentarios:

Anónimo dijo...

Copie y pege, ademas cree la base datos de access, pero no funciono, alguna idea?? o si tienes el fuente.

Saludos.

jdm dijo...

¿Alguien sabe de alguna pagina donde poder controlar las api de PDF para poder elegir el nombre del archivo y su ubicacion (archivo o e-mail) al imprimir? Thanks!! :)