Cómo utilizar un control DataPager con ListView para crear páginas de registros

Supongamos que tenemos el siguiente ListView que toma datos de una tabla de la base de datos:

  1. <asp:ListView ID="LVRegistros" runat="server" DataKeyNames="IdRegistro"
  2.        ItemPlaceholderID="AquiVanLosItems">
  3.     <LayoutTemplate>
  4.         <table width="100%" border="0" cellpadding="5" cellspacing="0">
  5.             <tr>
  6.                 <td class="tdDatosTitulo">
  7.                     Nombre
  8.                 </td>
  9.             </tr>
  10.             <asp:PlaceHolder ID="AquiVanLosItems" runat="server"></asp:PlaceHolder>
  11.         </table>
  12.     </LayoutTemplate>
  13.     <ItemTemplate>
  14.         <tr>
  15.             <td>
  16.                 <%#Eval("IdRegistro")%>
  17.             </td>                              
  18.         </tr>
  19.     </ItemTemplate>
  20.     <EmptyDataTemplate>
  21.         No existen registros.
  22.     </EmptyDataTemplate>
  23. </asp:ListView>

Como puedes ver el primer renglón de la tabla contendrá el texto “Nombre” y los siguientes renglones se llenarán a partir de la información que exista en la base de datos.

Ahora bien, si existieran 50,000 registros, todos ellos aparecerían en la página, lo cual está lejos de ser óptimo.

Lo ideal es mostrar los primeros “n” registros y que después exista un paginador (o pager en inglés) tipo Google, que nos permita ir desplazándonos a través de las diferentes páginas de registros.

Con ASP.NET esto es muy sencillo. Basta incluir un control llamado DataPager dentro del LayoutTemplate del ListView.

El código quedarí­a así­:

  1. <asp:ListView ID="LVRegistros" runat="server" DataKeyNames="IdRegistro"
  2.        ItemPlaceholderID="AquiVanLosItems">
  3.     <LayoutTemplate>
  4.         <table width="100%" border="0" cellpadding="5" cellspacing="0">
  5.             <tr>
  6.                 <td class="tdDatosTitulo">
  7.                     Nombre
  8.                 </td>
  9.             </tr>
  10.             <asp:PlaceHolder ID="AquiVanLosItems" runat="server"></asp:PlaceHolder>
  11.             <tr>
  12.                 <td colspan="7" class="TdPie">Páginas:
  13.                     <asp:DataPager ID="Pager1" runat="server" PageSize="30">
  14.                         <Fields>
  15.                             <asp:NumericPagerField ButtonCount="50" />
  16.                         </Fields>
  17.                     </asp:DataPager>
  18.                 </td>
  19.             </tr>
  20.         </table>
  21.     </LayoutTemplate>
  22.     <ItemTemplate>
  23.         <tr>
  24.             <td>
  25.                 <%#Eval("IdCarpeta")%>
  26.             </td>                              
  27.         </tr>
  28.     </ItemTemplate>
  29.     <EmptyDataTemplate>
  30.         No existen registros.
  31.     </EmptyDataTemplate>
  32. </asp:ListView>

El código anterior coloca una lista de números del 1 en adelante que se pueden cliquear para moverse a las diferentes páginas de registros. Si quieres, por ejemplo, que el paginador aparezca arriba y abajo de los registros, simplemente coloca otro DataPager donde lo necesites.

En este caso utilicé dentro de Fields un control llamado NumericPagerField, pero también puedes utilizar NextPreviousPagerField y TemplatePagerField.

Aquí­ encontrarás la referencia a toda la clase DataPager con la explicación completa de cada uno de sus componentes:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.datapager.aspx

¡Suerte!

Herramienta tipo Photoshop en lí­nea

Esta aplicación ofrece una funcionalidad similar a la de Photoshop. Es una aplicación web, lo que significa que para su uso solamente necesitas un navegador de Internet.

Es impresionante la variedad y calidad de las herramientas que lograron. Aquí­ pongo una imagen, pero te recomiendo entrar para que lo veas por ti mismo.
http://pixlr.com/app

pix

Para ver más opciones, entra a http://pixlr.com/

Cómo remplazar un string en una tabla de MySql

Recientemente cambió el dominio de mi blog de WordPress (antes era recursosweb.com.mx y ahora es viale.com.mx), por lo que muchas de las imágenes ahora no abren, mostrando una “x” roja. Las ligas también están rotas por esta misma razón.

Tengo que entrar a cada post y modificar el dominio viejo por el dominio actual. Como son muchas, hacerlo manualmente no es una opción.

Existe una función de MySql que permite hacer esto, esta función se llama Replace y se usa de la siguiente forma:

UPDATE NombreDeLaTabla SET NombreDelCampo = REPLACE(NombreDelCampo,"TextoOriginal","TextoNuevo")

Así­ que para resolver mi problema utilice la siguiente sentencia:

UPDATE wp_posts SET post_content = REPLACE(post_content,"http://www.recursosweb.com.mx","https://www.viale.mx")

Y después esta otra:

UPDATE wp_posts SET guid = REPLACE(guid,"http://www.recursosweb.com.mx","https://www.viale.mx")

Y listo, problema solucionado.

Cómo generar automáticamente un archivo ZIP con ASP.NET

En un proyecto en el que estoy trabajando tenía la necesidad de crear un archivo zip que tuviera varios archivos que estaban en un directorio en el servidor. Para no estar generando el zip manualmente cada vez que se pusiera un archivo nuevo y subirlo por FTP, pensé que serí­a bueno crearlo dinámicamente con código ASP.NET.

Buscando en Google, encontré esta excelente librería:

DotNetZip

Es muy sencilla de usar y los archivos generados se abren correctamente con la herramienta de carpetas comprimidas integrada en Windows y con Winzip.

Instrucciones para generar un archivo zip dinámicamente:

En la página antes mencionada haz clic en Releases y descarga el archivo llamado DotNetZipLib-Runtime-v1.7.zip. Cuando lo descargues, busca una carpeta llamada DotNetZip-v1.7 y dentro de ella encontrarás un archivo llamado Ionic.Zip.dll.

Copia ese archivo a la carpeta Bin de tu aplicación.

Para crear un archivo zip, usa el siguiente código que coloqué en el evento Click de un Button, pero que puedes usar donde te convenga.

Primero especifica que vas a utilizar la librería:

  1. Imports Ionic.Zip

Después úsalo así:

  1. Protected Sub CrearZip_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CrearZip.Click
  2.     Response.Clear()
  3.     Dim ElZip As ZipFile = New ZipFile()
  4.     Using ElZip
  5.     ElZip.AddDirectory("C:ArchivosAComprimir", "Documentos")
  6.     ElZip.AddFile("C:OtrosArchivosMiArchivo.pdf", "Documentos")
  7.     ElZip.Save(Response.OutputStream)
  8.     End Using
  9.     Response.AddHeader("Content-Disposition", "attachment; filename=MisDocumentos.zip")
  10.     Response.ContentType = "application/octet-stream"
  11.     Response.End()
  12. End Sub

Como podrás deducir, AddDirectory añade un directorio completo, incluyendo todos los archivos y carpetas que contenga, recursivamente. AddFile añade un archivo específico.

El segundo parámetro de ambas funciones define el directorio raíz propio del archivo zip generado. No tiene que coincidir con la ruta fí­sica donde están ubicados los archivos, este valor lo puedes definir tú. En mi ejemplo, el directorio raíz del archivo zip tendrá un único directorio llamado “Documentos”, y bajo él estará MiArchivo.pdf y toda la carpeta ArchivosAComprimir.

Cabe mencionar que en mi ejemplo el archivo será enviado al navegador como si se tratara de una descarga, pero también lo podrí­as almacenar en el disco duro.

Esta librería permite muchas más funciones, como:

  • Crear archivo zip y agregarle archivos o directorios
  • Listar los archivos dentro de un zip, y extraerlos
  • Modificar un archivo zip existente, con la capacidad de renombrar, remover o agregar nuevos elementos
  • Crear, guardar (como en mi ejemplo), extraer y leer de un stream

Se puede usar con cualquier lenguaje de .NET y cuenta, incluso, con una GUI que puedes usar en Windows.

Ni la librería ni la GUI tienen costo.

Para descargar la librería, la GUI, y el manual de usuario, ve a la página que puse al principio.

Cómo terminar la sesión de un usuario del Membership provider de asp.net

Para terminar la sesión de un usuario logueado mediante el Membership provider de asp.net, utiliza el siguiente código:

  1. FormsAuthentication.SignOut()
  2. Response.Redirect(FormsAuthentication.LoginUrl)

La segunda lí­nea simplemente redirige a la página establecida como inicio de sesión en el archivo web.config de la aplicación.

Otra manera simple de hacerlo es simplemente colocar el tag LoginStatus que automáticamente añade un ví­nculo para cerrar la sesión.

¡Suerte!