martes, 27 de marzo de 2012

Call server methodo from client javascript

Aveces nos veremos obligados a llamar un método que tenemos del lado del servidor, o simplemente no queremos complicarnos en buscar la manera desde el cliente de obtener los datos necesarios para ejecutar el método deseado, para eso tenemos la siguiente de muchas opciones:


Por mensionarlo, tenemos estas opciones:
__doPostBack ==> detallado más adelante
RadAjaxManager ==> nos permite ejecutar el método definido en su "OnAjaxRequest"
ScriptManager  ==> acá una explicación


Explico el "__doPostBack" por su facilidad y efectividad, porque he visto las otras opciones fallar en algún momento.


__doPostBack es una función que genera un postback a nuestra página, el cual podemos capturar en el evento Load de la página.


La estructura del __doPostBack es la siguiente:  __doPostBack("target", "argument");
Usando los parámetros podemos controlar el evento "target" y usar los parametros enviados en el "Argument", de la siguiente manera:


protected void Page_Load(object sender, EventArgs e)
{
 if ((Request["__EVENTTARGET"]!= null) && (Request["__EVENTARGUMENT"]!= null))
     {
   if((Request["__EVENTTARGET"]=="Update")&&(Request["__EVENTARGUMENT"]=="1945"))
       {
          //Ejecutar nuestro código del lado del servidor;
       }
    }
 }

Dobleclick Server Event c# ASP

He venido trabajando en un proyecto web Asp .Net, y para redondear el problema, quería implementar el dobleclick en un listbox, y por otra parte ejecutar un evento del servidor llamado desde javaScript. Enseguida un paso a paso para comenzar a usar estas muy útiles funcionalidades.


La primera nos permite capturar el doble click para un control, para esto adicionamos el evento en el load de la página al control de la siguiente manera:

nuestroControl.Attributes.Add("ondblclick", Page.ClientScript.GetPostBackEventReference( nuestroControl, "EventDblclick"));

GetPostBackEventReference nos devuelve una cadena que se puede utilizar en un evento de cliente para que se produzca una devolución de datos al servidor. El control especificado ("nuestroControl") para controlar la devolución de datos y un argumento de cadena con información adicional sobre el evento definen la cadena de referencia ("EventDblclick").


Ahora al realizar la acción de doble click sobre el control que le hemos adicionado nuestro evento nos hará un postback que vamos a capturar con el siguiente método: 



if (Request["__EVENTARGUMENT"] != null && Request["__EVENTARGUMENT"] == " EventDblclick")
            {
                AddElement();
            }



En el mismo page_load capturamos el Request["__EVENTARGUMENT"], cual si corresponde a la acción de nuestro doble click, en el control que le especificamos, traerá como valor el nombre del evento que le hemos referenciado, para este caso "EventDblclick". Desde aquí podemos manejar el evento según sea necesario, para mi caso se trataba de adicionar lo seleccionado en un listbox para adicionarlo a una caja de texto. En fin hay muchas funcionalidades a mi parecer, por lo cual lo comparto.

domingo, 11 de marzo de 2012

C# .Net Games WinForms Othello, Picas Fijas, Reversi

En mis momentos de ocio y por esa gran pasión que llevo por mi profesión, desarrollé un par de juegos, que eran nuestro entretenimiento cuando eramos niños y mi papá nos compró el tan anhelado "Atari".... era lo máximo !!!. En mi casa con mi hermana recordabamos cuando jugabamos othello, entonces me dió por construir una aplicación para jugar. Si no recuerdan othello o no lo conocen, acá les va una descripción:


Se trata de un juego muy simple, donde hay dos jugadores, blanco y negro, la idea del juego es llenar el tablero de fichas con tu color, esto lo consigues cambiando las fichas de tu contrario, colocando un ficha tuya donde en línea recta hayan fichas de tu enemigo y al final haya otra tuya, en fín no se si sea claro, pero lo intenté.

Les comparto mi juego, creado en vs .Net 2010, para que lo evolucionen a .net remoting, para que aprendan, además tiene muchas cosas muy recursivas.

Calma que eso no es todo, porque también tengo otro juego típico, con el que podemos aprender y enseñar, y se trata del punto fama, o fijas picas, no se que más nombres podrá tener.

Se trata de algo que jugabamos cuando niños, y consistía en que escribias en una hoja un numero de 4 cifras, donde no se podía repetir nungún número, y los demás concursantes hacían lo mismo; la idea era descubrir el número del otro, lanzando número, a alguién, ese alguién te decia cuantos número estaban de los que él tenía eran correctos, y cuantos de esos estaban en la posición adecuada, así hasta descubrir el número.... modestia aparte era muy bueno para eso, pero mi hermana nos jugaba sucio porque nos decia datos no muy ciertos, por lo que me inventé este proyectico para que jugaramos en el pc, y no hubiera oportunidad de fraude.

Entonces les hago entrega de Picas Fijas, tambien creado en .Net 2010. que lo disfruten.



miércoles, 7 de marzo de 2012

Enum string - string (key - value) c#

Este es la solución práctica de un problema no problema, pues podríamos encontrar otras soluciones. Se trata de manejar Enum para estandarizar una lista enumerada, pero con llave "string" y clave "string"; para mi caso se  dió porque siempre me gusta dejar un código ordenado, elegante y entendible, entonces me encontré con un proyecto donde se usaban un listado de actividades, donde cada una de ellas tenía una definición en xml estándar, la cual se usaba de manera constante en muchas partes del código, entonces se me ocurrió buscar una opción de manejar un Enum donde se declarara una sola vez estas actividades y simplemente por el nombre de la actividad, cargar su esquema. 

Entonces, acá tenemos la solución, que aclaró simplemente hice algunos cambios pues no es mi idea y no conozco el autor.

Lo primero es armar nuestro Enum, el cual va a tener la siguiente estructura:


Vemos que cada item tiene la propiedad por encima llamada descripción; En esta etiqueta vamos a ubicar los textos que necesitamos asociar a nuestra llave, para este caso se trata de un esquema XML (ejemplo), el cual necesito cargar cada vez que llame una de estas etiquetas.

Ahora, para obtener la información asociada en la descripción usamos la siguiente función, la cual nos va a devolver la descripción según el valor llave del Enum:


Funciona perfectamente, y nuestro código tendrá una lista estándar y reutilizable. De nuevo les comparto, y espero les sirva, aunque no es un problema, podríamos mejorar mucho nuestro trabajo.


Encontrar elementos dentro de Iframe js

Tuve un problema tratando de encontrar unas imágenes rotas dentro de un iframe, que proviene de un control llamado Datadynamics, pero la solución es muy generica por lo cual la comparto, pues de muchas opción que encontré en Internet casi que ninguna me sirvió, entonces hice una compilación de pruebas y construí algo que al final me solucionó el problema, y como ya es costumbre las comparto con ustedes.


Este ejemplo  corrige algunas imágenes que se cargaron sin el nombre de nuestro sitio, no es un problema común, pero hay partes importantes que podemos rescatar.

function CorregirImagenes()
         <               
            // obtiene el nombre de nuestro sitio
            var path =  '<%=Context.Request.ApplicationPath %>'; 
            // Obtiene el iframe
            var ifReport = document.getElementById('IframeName');
           // obtiene el document del iframe
            var doc =  ifReport.contentDocument || ifReport.contentWindow.document;
           // se usa || debido a que en explorer usa una opción y los demás exploradores usan la otra

           // obtiene el body del iframe
            var iFContent = doc.body; 
           // Hasta este punto ya obtenemos lo que queramos dentro de este Iframe

            // obtiene todas las imágenes dentro del body
            // ya obtenidas las imágenes les hago un proceso de inserción  del nombre del sitio para que las cargue correctamente, entonces una funcioncita por si necesitan hacer inserción de un string dentro de otro            var imagenes = iFContent.getElementsByTagName('img');
               for( i=0; i < imagenes. length; i++)
                <    
                    var imagen = imagenes[i].src;
                    var urlimg = imagen.split("/");
                    // debido a que la url de la imagen viene con "/" (http://localhost/sitio/corehandl**), hacemos un split y buscamos en la posición 4 el nombre del sitio, es decir [3], esto nos devolvería la palabra "sitio", si esto es DIFERENTE a nuestro path "/sitio" (al cual le hacemos un substring para compararlo si el "/"), entonces le añadimos nuestro path.
                    if(urlimg[3] != path.substring(1,path.length))
                     <   
                        var newurl = imagen.substring(0, imagen.indexOf("/CoreHandler")) + path +              imagen.substring(imagen.indexOf("/CoreHandler"), imagen.length);                       
                       
                        imagenes[i].src = newurl;                  
                    >
               >           
            return false;
        >


De nuevo espero a alguien le sirva, y comparta este conocimiento.