Cómo evitar que los caracteres acentuados se lean mal en una aplicacion ASP.NET

Si programas en ASP.NET, no te salvarás de que te pase esto alguna vez.

Tení­a unas páginas que habí­a hecho una diseñadora en Dreamweaver. Cuando las integré a mi aplicación, me di cuenta de que los caracteres acentuados (á, é, í, ó, ú) se leí­an mal al abrir la página en un navegador. Se veí­an así­:

letreromal.png

Después de un buen rato, me di cuenta de que el problema estaba en la codificación con la que fue guardada el archivo. Basta con guardarlo como Western European (Windows) - Codepage 1252 y el asunto se resuelve.

En Visual Studio abre tu archivo, y selecciona Guardar como... y en la ventana de diálogo en la que seleccionas el nombre, haz clic en la pequeña flecha al lado del botón Save y selecciona Save with encoding:

menu2.png

Después selecciona el encoding antes mencionado:

menu31.png

Y listo, problema solucionado:

letrerobien.png

Cómo modificar el lenguaje de los controles del Ajax Control Toolkit

Los controles del Ajax Control Toolkit para ASP.NET son muy útiles. Si los has usado, habrás notado que por default aparecen en idioma inglés, sin embargo cuando los descargas de Codeplex notarás que se descargan también varias carpetas, con nombres como “ar”, “cs”, “de”, etc. Estas carpetas contienen archivos de idioma que te permiten modificar el lenguaje de los controles.

Si por ejemplo, utilizas un CalendarExtender, por default te saldrá en inglés:

calendarextender_en.gif

Si quieres usar el idioma español, tienes que hacer dos cambios en tu página.

En Page agrega el atributo Culture indicando el código de tu cultura, que en mi caso, al ser español de México, es es-MX:

  1. <%@ Page Culture="es-MX" %>

En el ScriptManager tienes que indicar que quieres que se utilice el idioma que especificaste, de esta manera:

  1. <asp:ScriptManager ID="ScriptManager1" runat="server" EnableScriptGlobalization="true"></asp:ScriptManager>

Y listo, ahora podrás ver el CalendarExtender y los demás controles en tu idioma:

calendarextender_es.gif

Eliminación múltiple de registros de un GridView mediante CheckBoxes

Este ejemplo funciona como cualquier interfaz de correo electrónico, tipo Hotmail.
La idea es que cuentas con un GridView que muestra muchos registros. El usuario tiene la opción de seleccionar uno o varios de esos registros marcando un CheckBox que aparece en cada renglón. Después oprime un botón etiquetado con algún texto como “Eliminar los registros marcados” y todos los registros que marcó se borran.

Se le ahorra tiempo al usuario al permitirle eliminar varios registros de un solo paso.

Primero necesitas añadir a tu GridView un CheckBox para cada renglón:

  1. <asp:GridView ID="GVComparativos" runat="server" AutoGenerateColumns="False"
  2.        DataSourceID="ODSComparativos" AllowPaging="True" CellPadding="5"
  3.        GridLines="None" PageSize="30" DataKeyNames="identificadorCoti">
  4.     <Columns>
  5.         <asp:BoundField DataField="PersNombre" HeaderText="Nombre"
  6.            SortExpression="PersNombre" ReadOnly="true" />
  7.         <asp:BoundField DataField="PersEmail" HeaderText="E-mail"
  8.            SortExpression="PersEmail" ReadOnly="true" />
  9.         <asp:TemplateField HeaderText="Eliminar">
  10.             <ItemTemplate>
  11.                 <asp:CheckBox ID="chkEliminar" runat="server" />
  12.             </ItemTemplate>
  13.         </asp:TemplateField>
  14.         <asp:CommandField ShowEditButton="True" EditText="Editar" CancelText="Cancelar" UpdateText="Aceptar" />
  15.     </Columns>
  16. </asp:GridView>
  17. <br/>
  18. <asp:LinkButton ID="EliminarMarcados" runat="server" CausesValidation="False"> Eliminar los registros seleccionados</asp:LinkButton>

Toma nota del TemplateField que contiene un CheckBox llamado chkEliminar. Lo usaremos en el siguiente código, que va en el evento Click del LinkButton llamado EliminarMarcados:

  1. Protected Sub EliminarMarcados_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles EliminarMarcados.Click
  2.     Dim ListaDeIdsMarcados As String = ""
  3.     'Recorrer los renglones del GridView
  4.     Dim i As Integer
  5.     For i = 0 To GVComparativos.Rows.Count - 1
  6.         Dim ElCheckBox As CheckBox = CType(GVComparativos.Rows(i).FindControl("chkEliminar"), CheckBox)
  7.         If ElCheckBox.Checked Then
  8.             'Aqui encontramos cada CheckBox marcado
  9.             'En este ejemplo los pongo en un string y los despliego
  10.             'Pero en un caso de la vida real, llamarias a una funcion que los
  11.             'eliminaria utilizando el ID, que se guarda en DataKeys
  12.             ListaDeIdsMarcados = ListaDeIdsMarcados & GVComparativos.DataKeys(i).Value & "<br/>"
  13.         End If
  14.     Next
  15.     Response.Write(ListaDeIdsMarcados)
  16. End Sub

Listo, parece algo muy avanzado pero se logra de una forma relativamente sencilla.

Cómo enviar un formulario cuando se oprima ENTER

Para que un formulario se enví­e cuando el visitante oprima la tecla ENTER, coloca esta lí­nea en el evento Load de tu página:

  1. BusquedaTextBox.Attributes.Add("onKeyPress", "javascript:if (event.keyCode == 13) __doPostBack('" & BusquedaBoton.UniqueID & "','')")

En mi ejemplo, BusquedaTextBox es una caja de texto y BusquedaBoton es un LinkButton.

Incluso yo tengo un buscador en un MasterPage y otro buscador distinto en una página heredada de él. Puse el código tanto en el MasterPage como en la página, y ambos funcionan bien.

Cómo instalar una DLL en el GAC (Global Assembly Cache)

En ocasiones, cuando estás trabajando en Visual Web Developer 2008 con componentes ASP.NET de terceros (third party), notarás que no funciona el Intellisense y además el diseñador marca que tu componente no está definido. Este es un ejemplo de este problema con el componente FreeTextBox:

Component Not Declared

Noté que esto me pasaba por la siguiente razón: Los archivos de mi aplicación están hosteados en un servidor (no en mi PC de desarrollo), por lo que creé una conexión a una unidad de red, asignándola a una letra. Es decir, habí­a mapeado servidorinetpubwwwrootproyecto a w:proyecto. Al parecer si tienes tu servidor web de desarrollo corriendo en tu misma PC, lo anterior no ocurre, pero me parece que es muy probable que trabajes en una PC de desarrollo y accedas a un servidor de desarrollo mediante la red local donde están (y corren) los archivos de tu aplicación. Al menos es mi caso.

Para corregir esta situación tienes que agregar los DLLs del control en el GAC.

Deberás usar la utilidad gacutil.exe que viene en el SDK del .Net Framework 2. Si no lo tienes, descarga el SDK de aquí­: http://www.asp.net/Downloads/essential/

Coloca el componente (el DLL) en un fólder de la PC en la que usas Visual Web Developer 2008:
explorer.gif

Ahora abre una ventana de MS-DOS, cámbiate a la carpeta en la que tienes instalado el gacutil.exe y corre el comando:

gacutil -i nombredeldll.dll

Algo como esto:
Registrando el DLL en el GAC

Ahora reinicia Visual Web Developer, abre tu aplicación de nueva cuenta y mira como ya funciona el Intellisense y no aparece el error de que tu control no está declarado:
Intellisense funcionando

Espero que te sea de utilidad. 🙂

Actualización
Si necesitaras desinstalar la libreria del GAC, utiliza esta instrucción:
gacutil -u NombreDeLaLibreria
No escribas .dll
Por ejemplo:
gacutil -u FreeTextBox