JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Ejecución de subprocesos en segundo plano: advertencias.

Cuando lanzamos un nuevo hilo de ejecución en una aplicación, éste puede ejecutarse en segundo plano o no. Depende del valor que tenga la propiedad IsBackground del objeto Thread asociado. Los subprocesos en segundo plano son idénticos a los subprocesos en primer plano, pero los subprocesos en segundo plano no impiden que un proceso finalice. Es decir, un proceso en primer plano permanece "asociado" al proceso que lo lanzó y no permite que éste termine hasta que él mismo a su vez haya terminado su ejecución. Por el contrario, cuando hay procesos en segundo plano (IsBackground = true) y terminan todos los procesos en primer plano que pertenecen a un determinado proceso, la CLR finaliza el proceso llamando al método Abort de todos los subprocesos en segundo plano que todavía se estén ejecutando. En resumen: si tenemos un proceso en segundo plano debemos asegurarnos de que termina antes de que lo haga el proceso principal que lo lanzó o se suspenderá automáticamente y no terminará su tr... [Más]

Cómo conectar y desconectar automáticamente un Módem

El otro día ayudando a una persona surgió la necesidad de que una aplicación se conectara y se desconectara de Internet automáticamente utilizando un módem estándar, a través de la línea telefónica. La aplicación estaba escrita en Visual Basic 6 (nada de .NET). Tras darle vueltas un rato llegué a esta solución que pasa por usar la API de Windows para conseguirlo: ' Declaraciones de la APIPrivate Declare Function InternetAutodial Lib "wininet.dll" _(ByVal dwFlags As Long, ByVal dwReserved As Long) As LongPrivate Declare Function InternetAutodialHangup Lib "wininet.dll" _(ByVal dwReserved As Long) As Long Private Const INTERNET_AUTODIAL_FORCE_ONLINE = 1Private Const INTERNET_AUTODIAL_FORCE_UNATTENDED = 2 Con ellas, para conectarse a Internet de forma automática con un módem, sin intervención del usuario, sólo hay que escribir: InternetAutodial INTERNET_AUTODIAL_FORCE_UNATTENDED, 0 Para desconectarse al terminar de hacer lo que necesitamos en la Red sólo hay que escribir: Inte... [Más]

ASP.NET - Uso de funciones externas desde código de enlazado a datos

En ocasiones hay que realizar transformaciones más o menos complejas con los datos de un origen de datos antes de enlazarlos a un control. Lo mejor en estos casos es crear un método que devuelva una cadena como resultado, en una clase accesible desde la página que haga las operaciones. Luego se lo puede llamar desde el código de enlazado (<%# %>) para no hacerlo innecesariamente largo o complejo. Sin embargo y en contra de lo que pudiera parecer, no llega con que la clase con las utilidades se encuentre dentro del mismo espacio de nombres que el resto de la aplicación, puesto que el código de enlazado a datos se ejecuta dentro de su propio espacio de nombres, específico para la página actual. Para asegurarnos de que al enlazar los datos se ecuentran esas funciones auxiliares podemos hacer tres cosas: 1.- Si la función de transformación estamos seguros de que sólo la vamos a usar desde la página actual bastará con incluirla dentro del archivo de código "CodeBehind" para poder ... [Más]

API para GMail implementada en .NET

Johnvey Hwang ha realizado ingeniería inversa de la API que Google utiliza en GMail y ha creado una biblioteca de clases en C# que permiten comunicarse directamente con el servicio desde cualquier aplicación, sin necesidad de usar el navegador. GMail, el famoso servicio de correo de Google, utiliza un motor de interfaz de usuario basado en HTML Dinámico que consigue comunicación vía JavaScript con el servidor, sin necesidad de recargar la propia página varias veces. Lo cierto es que es una "virguería" (si me permitís la expresión) y la sensación de agilidad que imprime a la interfaz está muy bien. La comunicación con el servidor no se realiza con XML sino con un formato propio (DataPack) que contiene únicamente matrices JavaScript que se procesan en el cliente por el motor de interfaz de usuario, siempre desde la misma página. La idea es muy interesante y ya se aplicaba por otros clientes de correo web como Oddpost (recientemente comprado por Yahoo para competir con GMail). En fin, ... [Más]

Método GetChanges en DataSets de la Compact Framework

La .NET Compact Framework (DNCF) es estupenda y permite crear aplicaciones .NET para dispositivos móviles (Pocket PC y SmartPhone) con casi las mismas técnicas y objetos que se utilizan en el desarrollo de aplicaciones de escritorio comunes. Sin embargo la DNCF no nos ofrece todo lo que proporciona su hermana mayor, la propia plataforma .NET. Una carencia importante es la ausencia del método GetChanges en la clase DataSet. Este método se utiliza en ADO.NET para obtener una copia del DataSet original que sólo contiene los elementos que han cambiado desde la última llamada a AcceptChanges(). Esto resulta de mucha utilidad a la hora de sincronizar cambios en el servidor sobre todo si transmitimos el DataSet a través de un servicio Web. Gracias a este método sólo enviamos los datos necesarios y no el DataSet completo. Por desgracia la calse DataSet de la DNCF no soporta el método GetChanges por lo que, o enviamos todos los datos y los seleccionamos en el servidor, o nos trabajamos nosot... [Más]

Selección o edición de una fila de un DataGrid pulsando en cualquier lugar.

Seguimos con algunos consejos referentes a controles Web DataGrid. Para poner una fila de un DataGrid en modo edición o para seleccionarla, normalmente añadimos un botón en la primera o la última columna que, al pulsarlo, hace un PostBack al sevidor y muestra los controles de edición o cambia la fila seleccionada (normalmente ésta aparece resaltada). Podemos facilitarle mucho la vida a los usuarios si permitimos que la acción selección o la edición se obtenga pulsando en cualquier parte de una fila, y no sólo en el botón de edición. ¿Cómo se consigue esto? Imaginemos que nuestro DataGrid tiene un botón de tipo LinkButton (o CommandButton) en la primera fila, que es el encargado de lanzar la edición o la selección de la fila. Podemos ocultarlo si queremos. Lo que tenemos que conseguir es que, cuando el usuario pulse en cualquier lugar de la fila, se envíe al servidor exactamente la misma información que si se hubiese pulsado sobre el botón, es decir, debemos simular el PostBack del b... [Más]

Formato de columnas de un DataGrid

Esta semana seguimos con los trucos y consejos de los DataGrid de ASP.NET... Para que una columna enlazada no aparezca tal y como está en la base de datos sino que se le aplique de manera automática un formato, es preciso utilizar la propiedad DataFormatString de las columnas. Ésta se puede aplicar directamente en el código HTML o, si usamos la interfaz gráfica del diseñador de DataGrids, usando el campo Formato. El valor de esta propiedad sigue las mismas reglas que se usan en la plataforma para el formato de cadenas, y dependerá del tipo de dato almacenado en el campo de la base de datos. Por ejemplo, si hemos enlazado un campo que contiene fechas y queremos que aparezca con formato largo, esto es, por ejemplo, "25 de Octubre de 2004", sólo tendríamos que asignar a la propiedad el valor "{0:D}". Si en lugar de una 'd' mayúscula la ponemos minúscula el formato de la fecha sería el corto. Si la cantidad a mostrar es un precio y queremos que aparezca en el formato de moneda definido... [Más]

Sustituir la restauración de ViewState para evitar el efecto de doble evento ItemCreated

Hace un par de días comenté el efecto de ejecución doble de ItemCreated que se podía dar al enlazar ciertos DataGrids en una página Web. Una forma posible e evitarlo (entre otras muchas) sería redefinir el evento LoadViewState de la página para marcar con un indicador booleano cuándo se está ejecutando, una cosa así: private boolean RestaurandoViewState = false;protected override void LoadViewState(object savedState) {     this.RestaurandoViewState = true;     base.LoadViewState(savedState);     this.RestaurandoViewState = false;} De este modo durante el evento ItemCreated sólo tenemos que comprobar si se está restaurando el ViewState o no, ejecutando el código sólo en caso de que no.

Un par de consejos sencillos sobre controles enlazados y DataGrid

Sólo un par de detallitos simples que a veces pueden resultar útiles. 1.- Normalmente los controles DataGrid de ASP.NET (u otros similares enlazados) los generas usando el diálogo especial que tiene Visual Studio. En éste defines las columnas que va a llevar y las características de éstas. Si por ejemplo defines una columna plantilla que, de entrada, no está enlazada con ningún campo de un origen de datos, Visual Studio utiliza comillas dobles para asignar los valores propiedades. Si luego retocamos la plantilla manualmente e incluimos código en ella lo más probable es que obtengamos un error. Ello se debe a que, al tener comillas en el exterior como delimitadores, en cuanto incluyamos también comillas dentro de la expresión (para una cadena, por ejemplo) el intérpreto de tiempo de ejecución identifica mal los límites del atributo, produciendo un error.Solución: cambia los delimitadores externos del atributo a comillas simples ('). El intérprete las usa correctamente y se acabó el p... [Más]

¿El evento ItemCreated se ejecuta dos veces?

Pues sí. Esta situación es algo que despista bastante si no se tiene controlado (y uno se da cuenta, claro). En los DataGrid de WebForms en ASP.NET el evento ItemCreated se puede ejecutar dos veces a partir de la primera carga de la página. Esto se debe a que cuando hacemos un PostBack a la página (es decir, pulsamos un botón o hacemos algo que genera un evento en el servidor) los contenidos de la rejilla de datos se regeneran a partir del ViewState de la página y por lo tanto se lanza el evento para cada fila. Si además volvemos a enlazar la rejilla para responder a una ordenación o paginación, ésta se vuelve a generar y por lo tanto se lanza de nuevo el evento ItemCreated. Si usamos el evento ItemDataBound esto no ocurre ya que los contenidos la primera vez se regeneran desde el ViewState y por lo tanto no hay enlace de datos. En este caso el evento sólo se lanza una vez: al realizar el verdadero enlace. Conclusión: si usas el evento ItemCreated ten en cuenta que, dependiendo de c... [Más]