miércoles, 29 de diciembre de 2010

Ajax: Especificación XMLHttpRequest

Documentación del estandar hecho por la W3C para XMLHttpRequest Level 3. Level 3 es la propuesta final, la propuesta Level 2 la encontramos en XmlHttpRequest Level 2.

XMLHttpRequest es la interfaz para poder realizar peticiones a los servidores web con el protocolo HTTP o HTTPS en forma síncrona o asíncrona. Como bien se sabe, XmlHttpRequest es el objeto principal en los navegadores para implementar la tecnología Ajax.

viernes, 19 de noviembre de 2010

Silverlight: Enlaces de ayuda para Silverlight y SketchFlow

Ahora que tengo que usar Silverlight y Silverlight Sketchflow, me he dado la tarea de investigar un poco y poner como siempre los links de las páginas que me han ayudado a ganar en conocimiento:

1) Ejemplo Online sobre Sketckflow por: Lukas Zdechovan.

2) No hay quite!, en mi segundo día con Silverlight SketchFlow, ya me estaba quejando que no tenemos por lo menos un Grid para poner en las escenas. La solución la tiene Philipp Sumi con su Sketchables Framework que llega a complementar el set de controles entre ellos está el que yo andaba buscando. (En otra entrada explicaré como se instala Sketchables Add-in).

Una alternativa más rápida para diseñar es Balsamiq Mockups o Pencil. Con respecto a los diseños de prototipos de pantalla conocidos también como Wireframes o  Blueprints, se realizan éstos para concentrarse en la estructura del contenido que tendrá el sistema y no en aspectos visuales, considera además, un enfoque en aspectos generales del sistema sin entrar en detalles. De ésta forma los programadores, diseñadores y los clientes pueden entrar en discusión y toma de decisiones más rápido y como resultado beneficioso serán menos cambios a futuro reduciendo costos y tiempo.

3) Controles para mostrar texto, los tipos de fuentes, controles que no permiten seleccionar el texto, etc. en Texto y fuentes

4) Ejemplos donde se demuestra como navegar entre páginas XAML:
- Ejemplo #1
- Ejemplo #2
- Ejemplo #3. La forma correcta de navegar entre páginas. También vale mucho la pena leer The Silverlight Navigation Framework
- Ejemplo #4: Otro ejemplo de la forma correcta para navegar entre páginas XAML

- Ejemplo #5: Y sigo jodiendo con el tema sobre la forma correcta de navegar entre páginas XAML.

sábado, 6 de noviembre de 2010

Ubuntu: Sonido de TvTime no funciona

No podía escuchar sonido en TvTime con Ubuntu 10.10, por suerte encontré una solución en los foros de Ubuntu.

Lo anterior aplica para capturadoras TV Kworld con chip philips SAA7134/SAA7135HL que es la que tengo en mí máquina.

martes, 2 de noviembre de 2010

Ajax .Net: Web Method no se está ejecutando.

Me preguntó un colega de progra si he tenido un error con Ajax cuando ocurre una excepción que dice algo como "Sys.Net.WebServiceFailedException ......".

Resulta que ese error me a ocurrido más de una vez, jeje!, y por suerte me acuerdo que específicamente para ese mensaje, dicho error ocurre porque no se está controlando la respuesta de una llamada de un "Static Web Server". Los Static Web Server o Static Web Method, son algo muy común en Ajax y ni que decir en los Ajax Control Tool Kit.

El problema se da cuando se hace clic sobre un botón el cual llama a una función del objeto WebMethods. Resulta que al dar clic sobre el botón se estaría enviando dos órdenes: 1º Un refresh de la página, 2º una llamada a un Web Method. Los dos puntos anteriores provocan el error. La solución es simplemente cancelar la orden del refresh de la página (o del roundtrip). Al cancelar el refresh, el web method hace el viaje de vuelta en forma exitosa.

Para mayor claridad, recomiendo revisar en el siguiente foro de Ajax .Net, donde de hecho en Agosto del 2010 puse mi comentario al respecto!

domingo, 31 de octubre de 2010

Inglés: Pasado de los verbos regulares

Jeje, ésta entrada nada que ver con la computación, pero lo pongo porque siempre se me olvidan estas reglas del inglés.

¿Cómo se forma el pasado de los verbos regulares?

1) Los verbos que terminan en vocal "e", agregan "d":

     live   ==>  lived
    date  ==>  dated
    hate  ==>  hated

2) Los verbos que terminan en consonante seguida de "y", convierten la "y" en "i" y agregan "ed":

    try      ==>  tried
    dry     ==> dried
    cry     ==> cried

3) Los verbos que terminan en vocal seguida de consonante que no sea "w" o "y", doblan la consonante y agregan "ed":

    plan        ==>  planned
    commit   ==>  committed
    shop       ==>  shopped

4) El resto de verbos incluyendo los que terminan con "w", agregan "ed":

    fill      ==>   filled
    serve  ==>  served
    smell  ==>  smelled
    show  ==>  showed


Pronunciación:

1) Todos los verbos regulares que terminan con: p – k – s – ch – sh – f – x – h, pronuncian ED como “T”. Ejemplos de verbos que suenan con "T" al final: asked, baked, fixed, joked

2) Todos los verbos regulares que terminan con: l – v – n – m – r – b – v – g – w – y – z, y sonido vocal, pronuncian la "ED" como "D".Ejemplos: allowed, agreed, appeared, believed, cried, moved, shared.

3) Todos los verbos regualres que terminan en "T" o "D", pronuncian el "ED" como "ID". Ejemplos: accepted, afforded, ended, invited, painted, planted.


Referencias:
Reglas Verbos Regulares
Pronunciación de verbos regulares
Lista de verbos regulares

sábado, 30 de octubre de 2010

ASP .NET: iTextSharp no funciona en sitios web en producción

iTextSharp es un ensamblado OpenSource para .Net, que permite crear archivos en formato PDF. Muy útil cuando queremos convertir archivos HTML a PDF. Sin embargo existe un problema con la dll en producción.

El problema es que después de instalar en el servidor de producción, obtenemos el sisguiente error: "That assembly does not allow partially trusted callers"

La solución es modificar el código fuente de iTextSharp, para que permita ensamblados en modo "Partially Trusted Callers" en lugar de full trust.

Lo único que se debe hacer es modificar el archivo AssemblyInfo.cs, establecediendo las siguientes líneas de código:

using System.Security;
using System.Security.Permissions;

[assembly: AllowPartiallyTrustedCallers]

Referencia: www.techparadise.gr

jueves, 14 de octubre de 2010

domingo, 26 de septiembre de 2010

Linq: Usar operadores de Linq en lugar de un foreach

Éste es un caso en el que quería llenar un DropDownList utilizando el CascadingDropDown. En el método del WebService, quise usar el método AddRange, y así evitar tener que implementar un foreach para iterar por la colección de filas de un DataTable.

Por ejemplo, tengo un método que se llama Clientes.Listar(), el cual devuelve la lista de filas en un objeto DataTable, entonces para llenar al DropDownList tengo que usar un foreach para recuperar el valor que se va a mostrar en el DropDown y el valor llave que se utilizaría para saber cuál item se seleccionó. Utilizando el método AddRange del tipo List y las técnicas de Linq, tenemos el siguiente código de ejemplo:

--------------------
List valores = new List();
Clientes clientes = new Clientes();

valores.AddRange
(
    from fila in clientes.Listar().AsEnumerable()
    select new CascadingDropDownNameValue(fila["NOMBRE"].ToString(), fila["CODIGO"].ToString())
);
return values.ToArray();

--------------------
Otra alternativa de Linq pero expresada en secuencia de operadores de Linq sería de la siguiente forma:

--------------------
values.AddRange(clientes.Listar().AsEnumerable().Select(
fila => new CascadingDropDownNameValue
(
    fila["NOMBRE"].ToString(),
    fila["CODIGO"].ToString()
)));
--------------------

Cualquiera de los dos casos anteriores sirven para reemplazar el siguiente código:

foreach (DataRow fila in clientes.Listar().Rows)
{
     values.Add(new CascadingDropDownNameValue(fila["NOMBRE"].ToString(),   
     fila["CODIGO"].ToString()));
}

La diferencia, entre éste foreach y el uso de Linq es que Linq me permite hacer muchas cosas en una sola línea de código, en el peor de los casos tengo que agregar otras líneas, pero con las técnicas tradicionales, en lo personal, el código se vuelve para mí muy tedioso y en ocasiones dificil de entender.

Algunos dicen que Linq es más rápido, otros dicen que no siempre es el más rápido, independientemente de la eficiencia con que resuelva Linq el problema, prefiero Linq porque me permite codificar mejor casos difíciles donde tengo que dar tratamiento a por ejemplo muchos campos de una tabla o muchos datos de un arreglo, etc.

domingo, 12 de septiembre de 2010

Asp.Net: Valor enviado desde servidor no se actualiza con Javascript

Existe un caso especial en el que deseamos actualizar un valor, por ejemplo un contador de filas de un GridView, el cual está dentro de un UpdatePanel. Para actualizar el valor, se decide registrar una variable dinámica la cual se asocia al objeto window.document, quedando en la página del cliente de la siguiente forma:

<script type="text/javascript">//<![CDATA[
document.TotalRows='5';//]]>
</script>


Para registrar una variable al objeto document de Javascript desde el Code-Behind con C#, se hace de la siguiente forma:

if (!ClientScript.IsClientScriptBlockRegistered("total"))
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "total",
"document.TotalDeFilas ='" + gridView.Rows.Count + "';", true);

En el caso que estaba resolviendo, el código anterior lo coloqué en el evento Page_Load() de una página *.aspx.

Ahora bien, cada vez que un usuario agregue un registro nuevo o elimine un registro, el valor debe cambiar en la página. Si utilizamos la siguiente línea de código, nos daremos cuenta que no va a funcionar, aunque la línea de código éste buena:

ClientScript.RegisterClientScriptBlock(this.GetType(), "total", "document.TotalDeFilas ='" + gridView.Rows.Count.ToString() + "';", true);

¿Por qué no se actualiza el valor en la página después de por ejemplo eliminar un registro?

Muy simple (aunque me tomo como tres horas darme cuenta, jaja!), eso ocurre porque el GridView está dentro del UpdatePanel. Entonces para solucionarlo; es decir, para actualizar el valor, hay que usar el objeto ScriptManager en lugar del objeto ClientScriptManager. La línea de código sería entonces:

ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "total", "document.TotalDeFilas ='" + GridView.Rows.Count + "';", true);

Lo que vale la pena tener en mente es que si uno desea actualizar valores de objetos que están dentro de un UpdatePanel usando javascript, lo mejor es usar ScriptManager en el CodeBehind.

lunes, 9 de agosto de 2010

LINQ: Excelente plug-in para VS 2008+

Encontré un excelente plug-in para instalar en Visual Studio 2008 el cual permite visualizar de una forma diferente la cadena que se envía a SQL Server una vez ejecutada la expresión o sentencia de LINQ.

Si bien en modo de depuración podemos ver la cadena que se envía al SQL Server, con el plugin es posible visualizar la cadena pero además se puede visualizar los datos que vienen de vuelta desde la base de datos.

Un ejemplo de la nueva ventana de dialogo es la siguiente:

Ventana de Linq Visualizer.

Si hacemos clic en "Execute", veremos el resultado que es devuelto desde la base de datos, por ejemplo:

Ventana con resultados.

El plugin se llama "Linq to Sql Visualizer" y se puede descargar desde la página del creador en linq-to-sql-debug-visualizer.
 

domingo, 4 de julio de 2010

Ubuntu 10.04: ¿Cómo posicionar los botones de la barra de título de la ventana?

Como es sabido, en Ubuntu 10.04, todas las ventanas muestran los botones de configuración de tamaño de la ventana en el lado izquierdo de la barra de título. Este cambio se me hace totalmente incómodo y por suerte la forma para restaurarlo es muy fácil!

Los pasos son los siguientes (forma para expertos):

1- Alt+F2 para abrir el cuadro de diálogo para ejecutar aplicaciones.
2- Digitar gconf-editor
3- Ir a /apps/metacity/general
4- En el lado derecho buscar button_layout
5- Modificar el valor de la cadena button_layout de la siguiente forma

:minimize,maximize,close
Notar que los dos puntos ahora se ponen en el lado izquierdo de la cadena y la palabra close se mueve al final de la cadena.


La otra alternativa pero mucho más fácil es utilizando la herramienta Ubuntu Tweak, y sinceramente es muy buena. Permite configurar infinidad de cosas y preferencias de Linux de forma fácil y que no son visibles para la mayoría de los usuarios. Por consiguiente el uso de comandos queda relegado! Además la aplicación permite la actualización o descarga de nuevos programas.

Para restaurar el posicionamiento de los botones de la barra de título, simplemente, en Ubuntu Tweak, vayan a la sección Escritorio y buscan Configuración de Gestor de Ventanas y en el lado derecho buscan Formato de botones en la barra de título de la ventana. Muestran las opciones Izquierdo - Derecho. Simplemente se escoge derecho y listo.

Ejemplo:

domingo, 16 de mayo de 2010

ASP .Net: No se ven las imágenes en ThunderBird

En las pruebas de envío de correos con ASP.NET y Visual Basic, ocurre que los mensajes se ven como se espera en GMail, Hotmail y Outlook; funciona perfectamente, sin embargo para ThunderBird el resultado es otro. Las imágenes no se observan y no es por configuración de las opciones de la aplicación.

Solución encontrada:
Había que especificar qué tipo de MIME se usa para cada imagen incrustada en el mensaje de correo con la siguiente línea de código:

Dim imageResource1 As LinkedResource = New System.Net.Mail.LinkedResource(Server.MapPath("imagenes/imagen1.jpg"), MediaTypeNames.Image.Jpeg)

Asp. Net: Tarda en llegar el mensaje de correo de GMail

Estuve averiguando por qué al enviar un mensaje de correo usando código Visual Basic .Net con ASP.Net y noté que al usar como servidor de correos una cuenta de GMail, resulta que éste ralentiza en gran medida la entrega del mensaje a su destinatario.

Y ya averigüé por qué ocurre!. El problema es que al incluir direcciones URL en el mensaje, parece que GMail analiza si esa URL existe y quién sabe qué más cosas hace; el punto es que al quitar la URL del mensaje, la entrega al destinatario se da en un tiempo muy bueno.

Asp .Net: Mantener la sessión de usuario activa.

¿Por qué se pierde la sesión de usuario y cómo lograr que permanezca todo el tiempo hasta que se cierre la sesión?

En el siguiente link encontrarán las respuestas. Sin embargo, yo implementé otra solución con ayuda de "Web Service" estático.

Más referencias:
Ésta es interesante porque lo resuelve con un HttpHandler
Ésta otra solución pero con JQuery

sábado, 1 de mayo de 2010

Asp .Net: Limitar el tamaño de la carga de un archivo

En la sección System.Web poner lo siguiente:

<httpruntime maxrequestlength="10000"></httpruntime>

Estableciendo la regla anterior en el web config de Asp.Net, se estaría indicando que el servidor web solo permite al usuario cargar archivos con una cantidad máxima aproximada de ~10 MB.

El tamaño predeterminado es de 4 MB exactos, osea 4096 KB.


Referencia: astrayalien

Asp.Net: Error con VJSharpCodeProvider y AjaxControlToolkit Resource

Al ejecutar una aplicación web aparece éste error:

Error al cargar el ensamblado con el nombre para mostrar 'AjaxControlToolkit.resources' en el contexto de enlace 'LoadFrom' de AppDomain con ID 2. Error debido a: System.IO.FileLoadException: No se puede cargar el archivo o ensamblado 'AjaxControlToolkit.resources, Version=3.0.30512.20315, Culture=es, PublicKeyToken=28f01b0e84b6d53e' ni una de sus dependencias. La definición del manifiesto del ensamblado no coincide con la referencia al ensamblado. (Excepción de HRESULT: 0x80131040)
Nombre de archivo: 'AjaxControlToolkit.resources, Version=3.0.30512.20315, Culture=es, PublicKeyToken=28f01b0e84b6d53e'
......

Y también éste error:

The assembly with display name 'VJSharpCodeProvider' failed to load in the '
LoadFrom' binding context of the AppDomain with ID 2. The cause of the failure was: System.IO.FileNotFoundException: Could not load file or assembly ...

Para solucionar el primer caso, lo que hice fue descargar el código fuente de la versión 30512 de Ajax, que en lo personal, estoy seguro que es la más estable que he utilizado. Procedí a compilarla, luego tomé el ensamblado de la carpeta Release, también copie el archivo AjaxControlToolkit.pdb para depuración. Los dos archivos los pegué en la carpeta Bin de mí proyecto ASP.Net. Desde Visual Studio 2008, y estando en la carpeta Bin, saco el menú contextual y selecciono "Agregar Referencia ..." y luego busco el ensamblado.

Para el segundo caso, resulta que se corrige instalando "
Microsoft Visual J# Version 2.0 Redistributable Package" el cual se puede descargar desde: http://www.microsoft.com/DOWNLOADS/details.aspx?familyid=F72C74B3-ED0E-4AF8-AE63-2F0E42501BE1&displaylang=en

domingo, 21 de marzo de 2010

Asp.Net: Insertar un archivo CSS en el HEAD

Alternativa para insertar una hoja de estilos en el HEAD de la página:

Dim Browser As HttpBrowserCapabilities = Request.Browser
If Browser.Type = "IE6" Then
Dim litIE6 As New Literal
litIE6.Text = "<link rel='stylesheet' type='text/css' href='Recursos/css/minaetStyle_ie6.css' />"
Page.Header.Controls.Add(litIE6)
End If

sábado, 20 de marzo de 2010

Asp.Net: Recuperar elementos del HEAD.


Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
Dim ctl As Control
For Each ctl In Page.Header.Controls

If TypeOf (ctl) Is HtmlLink Then
Dim linkTag As HtmlLink = CType(ctl, HtmlLink)
If (linkTag IsNot Nothing) And linkTag.Href.StartsWith("~/") Then
If Request.ApplicationPath = "/" Then
linkTag.Href = linkTag.Href.Substring(1)
Else
linkTag.Href = Request.ApplicationPath & "/" & _
linkTag.Href.Substring("~/".Length)
End If
End If
End If
Next
End Sub


Referencia:

www.mindfly.com

domingo, 7 de marzo de 2010

Asp.Net:Encriptar cadena de conexión

Con las siguientes líneas de comando se puede hasta desencriptar la cadena de conexión que reside en el web.config de la aplicación web:

Ir a aspnet_regiis:
cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\

Para encriptar:
aspnet_regiis.exe -pef "connectionStrings" "c:\Proyectos\PruebaEncriptacion" -prov "DataProtectionConfigurationProvider"

Para desencriptar
aspnet_regiis.exe -pdf "connectionStrings" "c:\Proyectos\PruebaEncriptacion"

Donde dice
PruebaEncriptacion, es el nombre del proyecto web.

domingo, 28 de febrero de 2010

Asp.Net: Otro ejemplo para inyectar javascript.

Dim script As String = "function Update_Bitacora()
{Scroll_Pais();__doPostBack('ctl00$ContentPlaceHolder1$gridBitacora','Modificar$0')}"
ClientScript.RegisterStartupScript(Me.GetType(), "UpdatePanel2", script, True)

El botón está oculto en la página y una ventana que se abre con window.open tiene un botón que llama a la función Update_Paises de la forma: window.opener.Update_Bitacora.

La sub-ventana tiene un botón "Modificar", éste realiza una operación sobre una base de datos. Una vez realizada dicha operación inyecta código javascript el cual se encarga de llamar a la función Update_Bitacora() y además despues de actualizar la bitácora, se cierra a si misma. La bitácora es un listado que está en la ventana padre.

Un punto importante es enviar el parámetro 'Modificar$0' ya que de lo contrario el evento RowCommand del GridView, no se ejecutará de ninguna manera. No es estricto enviar $0 y además se puede personalizar en caso de que se ocupe enviar otro argumento en vez de un cero.

Otra alternativa es poner un botón oculto y crear un procedimeinto con el siguiente código:

Dim btnControl As New PostBackOptions(btn)
Page.ClientScript.RegisterForEventValidation(btnControl)
Dim script As String = Page.ClientScript.GetPostBackEventReference(btnControl)
ClientScript.RegisterStartupScript(Me.GetType(), "UpdatePanel1", "function Update_Bitacora(){script}", True)

Posteriorente en la ventana hija se llama a la función que inserta el código anterior.

Referencias: aspadvice.com

domingo, 21 de febrero de 2010

Asp .Net: ¿Por qué desaparece una columna de un GridView después de un PostBack?

Existe un grid con una columna X que en cada celda de esa misma columna presenta un link el cual realiza una operación personalizada. El problema es que después de hacer clic, dicha columna desaparecía. En el code-behind se hacía el refresh del grid, pero aún así, la columna desaparecía.

Solución: El problema estaba en la forma como se declaró la columna para el elemento Column del GridView en el código XHTML. La línea incorrecta es como la siguiente:

<asp:HyperLinkField DataTextField="codigo">

La forma correcta es:

<asp:BoundField DataField="CODIGO">

IIS: Resetear IIS y ASP.Net

Abrir una ventana de cmandos e ir a la siguiente dirección:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

2) Ejecutar los siguientes comandos:

a. aspnet_regiis.exe –i

b. aspnet_regiis.exe –e

3) Resetear el IIS con iisreset

sábado, 20 de febrero de 2010

PHP: Instalar php en IIS fácilmente.

Ver el siguiente video: Video

Web Crystal Reports: Botones Navigation no funcionan.

Cuando uno hace clic sobre uno de los botones de navegación de un reporte que está en una página Web, éste se pierde y aparece un error informando que los parámetros de logeo son incorrectos.

Una solución efectiva es utilizar el evento Navigate del control CrystalReportViewer. En dicho evento poner el código que genera el reporte en su defecto llamar al método o función que genera dicho reporte.

Otra alternativa recomendada según lo que he leido en diferentes sitios en internet es utilizar el evento Page_Init de la página Web para generar el reporte; y con base en los ejemplos que me encontré, también se recomienda utilizar una variable de sesión para guardar el reporte, de esa manera el reporte no se estaría generando a cada rato si no más bien cuando sea extrictamente necesario volver a generar el reporte.

miércoles, 17 de febrero de 2010

Javascript: InnerHTML no cambia después de la primera vez.

Intentaba cambiar dinámicamente el atributo innerHTML de un elemento span. El código JS inicial funcionaba solo la primera vez, pero al dar clic en el botón que hace el cambio del atributo, no funcionaba.

El objeto Span estaba dentro de un elemento Div y éste a su vez es mostrado por un ModalPopupExtender que además está fuera del UpdatePanel.

El problema era que al dar clic sobre el botón que muestra un texto que dice "Sí" del ModalPopup, éste no hacía nada y el modal popup no se cerraba.. Entonces procedí a crear el Trigger del botón. Tuve el resultado esperado, pero al intentar borrar el segundo item de un grid, el mensaje del span no aparecía. A pesar de que la propiedad innerHTML se estaba asignando, éste no se mostraba en pantalla.

Solución: Quitar el trigger y programarle al botón "Sí" codigo javascript para cerrar el modalpopup con javascript, y listo!

Otra alternativa es inyectar el elemento TextNode con ayuda del DOM (Document Object Model).

Ejemplo:

var padre = $get('div');
while (padre.firstChild)padre.removeChild(padre.firstChild);
var nuevo = document.createElement("span");
nuevo.appendChild(document.createTextNode("Nuevo valor:" + codigo);
padre.appendChild(nuevo);

domingo, 14 de febrero de 2010

Asp.Net: Inyectar código Jasvascript.

Código de ejemplo para ejecutar un código inyectado después de un submit de la página:

Poner la siguiente línea en el Event Handler del control, ya sea un botón, un LinkButton o cualquier otro control del lado del servidor:

ClientScript.RegisterStartupScript(Me.GetType(), "focus", "ScrollToElement('" + ServerControlName.ClientID +"');", True)

La function de javascript que está en un archivo por aparte es la siguiente:

function ScrollToElement(element){
var pos = Sys.UI.DomElement.getBounds($get(element)).y;
document.documentElement.scrollTop = pos;
}

Pasar primera letra de una palabra a mayúscula

Ejemplo:

Dim cu As TextInfo = Thread.CurrentThread.CurrentCulture().TextInfo
Dim resultado as string = cu.ToTitleCase("titulo")

Referencia:
http://support.microsoft.com/kb/312890/es

domingo, 7 de febrero de 2010

Ajax .Net: El control CascadingDropDown devuelve [Error 500]

Después de horas y horas para saber por qué el control CascadingDropDown de Ajax me devuelve la cadena [Error 500] como un item en el cuadro de lista colgante del propio control, resultó que el método del servicio web debe tener como nombres de parámetros
los siguientes:

- Primer nombre de parámetro: knownCategoryValues
- Segundo nombre de parámetro: category

La definición de la función en los lenguajes más utilizados en Visual estudio son las siguientes:

VB .Net:
Public Function Obtener_ListaTerritorial(ByVal knownCategoryValues As String, ByVal category As String) As AjaxControlToolkit.CascadingDropDownNameValue()

 C#:
[WebMethod]
public CascadingDropDownNameValue[] GetColorsForModel(
string knownCategoryValues,
string category)

miércoles, 3 de febrero de 2010

ASP .Net: ¿Cómo obtener el ID de un GridView que no muestra campo ID.

Éste caso consiste en que se desea obtener el valor del campo llave de una tabla cuando se dispare un evento cualquiera del Grid. De alguna forma se desea obtener el valor de la llave con la condición adicional de que el campo llave no aparece en el Grid ya que éste es invisible o se decidió no ponerlo en el grid.

Dicho caso está relacionada con una entrada anterior titulada: ASP .NET Recuperar ID de fila en gridview.html

La situación aquí es que se creó una columna en el grid pero se olvidó poner a dicha columna el atributo DataField="CODIGO".
Siendo más claros, el código para la columna que se metió en el grid manualmente es el siguiente:
<asp:boundfield headertext="Modificar" datafield="CODIGO">
</headerstyle></asp:boundfield>

Ahora bien, el código anterior lo que hace es que aparezca una columna adicional en el Grid, aunque el DataSource no contenga esa columna.

En el code-behind, auque tratemos de recuperar el valor del campo llave que en éste caso se llama COLUMNA, ¡SERÁ CASO PERDIDO GARANTIZADO!.

Para soluionarlo se debe agregar el atributo DataField a la columna y de esa forma se logrará obtener el valor del campo llave aunque éste no esté en el GridView.

Ejemplo:
<asp:boundfield headertext="Modificar" DataField="CODIGO">
</headerstyle></asp:boundfield>
Para terminar el ejemplo, ¿Cómo hacer que una celda del grid haga algo cuando le demos clic a un link dentro de la celda o a un control cualquiera dentro de la celda?

La solución más rápida es utilizar el evento RowDataBound y dentro de éste poner
un código equivalente al siguiente:
If e.Row.RowType = DataControlRowType.DataRow Then
e.Row.Cells(0).Text = "<a href=" +
Page.ClientScript.GetPostBackClientHyperlink(Me.GridView1, "Modificar$" +
e.Row.Cells(1).Text, False) + ">" + "[Modificar Fila]" + "</a>"
End If

El código anterior utiliza el método GetPostBackClientHyperlink del objeto ClientScript para insertar código Javascript del lado del cliente. La ventaja de hacerlo así, es que éste genera una llamada a la función __doPostBack que también está del lado del cliente provocando una llamada al evento o eventos del objeto GridView (los eventos en el lado del servidor del GridView).

Ahora bien, una vez creado completamente el gridview en pantalla, en caso de que el usuario haga clic sobre el link que está en la celda de la fila, éste disparará al evento RowCommand del GridView. En el evento RowCommand se puede preguntar por los parámetros CommandName y CommandArgument para obtener los valores tanto del tipo de operación que se realiza o preguntar por el valor adicional que se pasa en CommandArgument.

viernes, 8 de enero de 2010

Javascript: Problemas con evento onclick y setAttribute

Poner una función como la que sigue, definitivamente no funcinará en IE6 pero si en le resto de exploradores:

boton.setAttribute('onclick', 'Ejecutar(' + "'btn" + Pintar.lastAssignedId + "');");


La solución es usar la siguiente sintaxis:

boton.onclick = function () {Ejecutar(boton.id);};

Referencia en: codingforums.com