lunes, 9 de agosto de 2010

Leer pdf desde windows form

Hola a todos, bueno hoy quiero mostrarles como de una manera rápida podemos tener un lector de archivos pdf en nuestra aplicación windows, asi no necesitamos tener que lanzar un acrobat reader o algo parecido.

Bien, lo que vamos a hacer es acceder al componente COM del adobe reader y asi crear una instancia de el en nuestra aplicación...

Bueno manos a la obra, lo primero será crear un nuevo proyecto de tipo windows, asi el visual no generá un formulario por defecto... vamos a trabajar con este formulario, si desean pueden setear las propiedas como el tamaño, el título y demás características que deseen.

Ahora lo que vamos a hacer es en nuestro toolbox damos click derecho y luego seleccionamos elegir elementos...o en choose items si lo tienen en inglés...



luego se abrirá una ventana en la cual disponemos de varias pestañas, pero en este casp la que nos interesa en al pestaña que dice componentes COM (COM Components), y alli seleccionamos Adobe PDF Reader...



al seleccionar este componenete y dar clic en ok, debe aparecer en nuestro toolbox un objeto llamado Adobe Pdf Reader...



ahora solo debemos arrastrar nuestro nuevo objeto al formulario. Ahora lo que haremos sera darle la opción al usuario qiue pueda buscar un archivo y este sea cargado en el formulario, asi que ya han visto la interfaz (básica) que he diseñado, lo que voy a explicar será el code behind... como siempre en vb..

Primero instanciamos un nuevo objeto de tipo OpenFileDialog, este objeto nos permite hacer una búsqueda de archivos en nuestro equipo:

Dim oOpenFileDialog As New OpenFileDialog

Ahora en el load del formulario, vamos a limitar los tipos de archivo que podemos buscar estableciendo un valor para la propiedad filter de nuestro cuadro de diálogo, basicamente establecemos un nombre y le asociamos una extensión, en este caso .pdf:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
oOpenFileDialog.Filter = "Archivos PDF (*.pdf) | *.pdf"
End Sub

Ahora en el boton de buscar archivo, lo que hacemos es establecer la propiedad filtername a vacio, abrir el cuadro de diálogo y si el usuario selecciona archivo y presiona ok entonces mostrar la ruta del archivo en el cuadro de texto:

Private Sub ButtonArchivo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonArchivo.Click
oOpenFileDialog.FileName = String.Empty
If oOpenFileDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
TextBoxFile.Text = oOpenFileDialog.FileName
End If
End Sub

Bueno, ahora que ya tenemos la ruta del archivo, por fin vamos a cargar el archivo pdf en el formulario, lo único que debemos hacer el al componente COM asignarle el archivo pdf con la función LoadFile, la cual retorna un true si el cargue ha sido exitoso y false en caso contrario, en esta caso simplemente mostramos un mensaje informando si ocurrio un error o si no:

Private Sub ButtonCargar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonCargar.Click
If ComPDF.LoadFile(TextBoxFile.Text) Then
MsgBox("Archivo cargado con éxito", MsgBoxStyle.Information, "Sistema")
Else
MsgBox("Ocurrió un error al cargar el archivo", MsgBoxStyle.Information, "Sistema")
End If
End Sub

Bueno y eso es todo, ya podemos ver nuestros pdf sin salir de nuestra aplicación.

Descarga el código de ejemplo !!

Nos vemos proximamente...

jueves, 5 de agosto de 2010

Autocomplete con Jquery

Hola a todos, el dia de hoy quiero mostrarles como gracias a JQuery podemos hacer un autocompletar en u textbox de una manera rápida y sencilla, y así poder ofrecer al usuario una mejor experiencia y nuestro webform será un poco más profesional.

En el ejemplo se hara una búsqueda de nombres en una lista genérica, la cual contiene unos nombres preestablecidos, la idea aquí sería llenar la lista con datos desde una base de datos, en esta caso lo único que cambiaría sería el llenado de la lista, lo demás será pracricamente igual, pero veamos como quedaría nuestro campo de texto cuando se encuentran coincidencias...



Ahora q vimos como se verá la función de autocomplete pues manos a la obra..

Lo primero será diseñar la interfaz de usuario, en este caso solo necesitamos un label y un textbox, luego referenciamos los scripts de jquery y jquery ui a nuestra página, es decir:


<script src="Scripts/jquery-1.4.2.js" type="text/javascript"></script>

<script src="Scripts/jquery-ui-1.8rc3.custom.min.js" type="text/javascript"></script>


Para nuestro ejemplo, como tenemos q hacer todo en codebehind, porque las conicidencias se deberián cargar de una base de datos (en el ejemplo usaremos una lista), entonces agregamos un scriptmanager a la página, y le establecemos la propiedad EnablePageMethods en true para poder acceder a la función que retorna las conicidencias ya que debemos comunicar el cliente con el servidor una forma de hacerlo es usando un WebMethod. Es decir, el control scriptmanager quedaria:


<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"></asp:ScriptManager>


Ahora, en nuestro codebehind vamos a declarar una función la cual hará la consulta a la lista de nombres y retornará solo aquellos q sean coincidentes con lo que el usuario va escribiendo en el textbox. Lo importante a tener en cuenta es que el método debe ser declarado como public shared y debe tener el atributo WebMethod(). Es decir, la función quedaria:


<WebMethod()> _

    Public Shared Function ObtieneNombres(ByVal sNombre As String) As Object

        Dim oListNombres As List(Of String) = New List(Of String)()

        oListNombres.Add("Julio Avellaneda")

        oListNombres.Add("Javier Alfredo")

        oListNombres.Add("Juan Manuel")

        oListNombres.Add("Jesus Alfredo")

        oListNombres.Add("Jose Manuel")

        oListNombres.Add("Luis Carlos")

        oListNombres.Add("Julieta")



        sNombre = sNombre.ToLower()

        If Not oListNombres Is Nothing Then

            Dim oNombres As Object

            oNombres = From nombre In oListNombres _

                        Where nombre = sNombre OrElse nombre.ToLower.StartsWith(sNombre) _

                        Select nombre



            Return oNombres

        Else

            Return Nothing

        End If

    End Function


Vamos a explicar la función:La funciñon recibe un parámetro de tipo String, este parámetro es lo que el usuario va tecleando en el textbox, ahora se crea una lista genérica de tipo string para almacenar los nombres de los usuarios, luego simplemente llenamos la lista (aquí sería el lugar en donde se llena la lista desde la base de datos), luego verificamos que la lista no este vacía para poder hacer la comparación y así mostrar los datos coincidentes.
Ahora, se declara una variable de tipo object, y a esa variable le asignamos el resultado de una consulta con linq hecha sobre la lista para poder consultar los items relacionados, la consulta de linq lo que hace es en la primera linea es especificar en donde vamos a realizar la búsqueda (en este caso en la lista creada), en la segunda línea especificamos las condiciones de búsqueda, en este caso donde almacenado en la lista sea igual a lo tecleado por el usuario o los items que comienzen por lo tecleado por el usuario, en la tercera línea le especificamos lo que deseamos mostrar, finalmente retornamos las coincidencias.

Ahora que vimos la lógica para traer las coincidencias, vamos a revisar como debemos trabajar en el cliente con jquery, nuestro script de jquery sería:


<script type="text/javascript">

         jQuery(document).ready(function () {

             $("#<%= TextBoxNombre.ClientID  %>").autocomplete({

                delay: 0,

                source: function (request, response) {

                    PageMethods.ObtieneNombres(request.term,

                            function (data) {

                                var nombres = (typeof data) == 'string' ? eval('(' + data + ')') : data;

                                response(nombres);

                            },

                            fnLlamadaError);

                },

                minLength: 1

            });

        });



        function fnLlamadaError(excepcion) {

            alert('Ha ocurrido un error al traer los nombres: ' + excepcion.get_message());

        }


Pero como funciona este código:
Lo primero es relacionar el plugin de autocomplete jquery con el textbox, luego comenzamos a definir las propiedades del plugin, delay hace referencia al tiempo en que tarde en aparecer las coincidencias, minLength especifica el número de caracteres minimos para poder comenzar a usar el autocomplete, source hace referencia a la fuente de valores en la cual se va a hacer la comparación, en nuestro caso hacemos un llamado al webmethod creado, para llamarlo usamos PageMethods., por último especificamos una función para informar al usuario mediante un mensaje sise produjo algún error al llamar a la función.

Bueno y eso es todo lo que debemos hacer para poder usar un autocomplete de jquery, en el ejemplo encuentran la hoja de estilo y los scripts de jquery... hasta un próximo post que espero no se tarde más de dos semanas !!

Descarga del ejemplo !!