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.