martes, mayo 23, 2006

Ventanas Emergentes (Popup's)

Alguna ve recuerdo haber escuchado a uno que otro compañero de estudios decir: "felizmente existe el visual basic, el .Net ahora, así no tendré que aprenderme el feo lenguaje Java o javascript" ... ahora se me viene a la mente con mucha más claridad porque en estos días he estado necesitando mucho del famoso javascript, es más, creo yo que si él, no hubiese logrado lo que buscaba.

La situación es la siguiente, tengo un webform principal con una lista de usuarios registrados, en este webform al que llamaremos "Usuarios.aspx" tenemos la opción de crear, editar y eliminar estos usuarios, estas operaciones se realizan llamando a un webform hijo, mejor dicho un webform en forma de popup que saltara delante del Usuarios.aspx para poder realizar la creación, edición, o eliminar a algún usuario en específico, la idea es que después de realizar la isersión o modificación del registro en la base de datos, nuestro popup se cierre e inmediatamente el webform principal se actualice automáticamente. ¿Que como lo hariamos?

Esa es la respuesta que he estado buscando y después de un par de días logre encontrar, todo esto se puede hacer gracias al "javascript" ... y aquí daremos el ejemplo claro de como poder hacerlo.

En mi caso, acostumbrado a trabajar con clases, herencia y reutilización de código he usado una clase específica, mejor dicho, he creado una clase llama Control_Ventanas la cúal contendra 3 principales procedimientos, (void en C#, sub en VB).
Vamos a reemplazar el signo "<" por un "&" y al signo ">" por un "$" para evitar que el código script se mezcle con mi editor de este blog.

public class Control_Ventanas
{
public void AbrirVentanaHija(Page pagina,string url,string param)
{

string cadena_script="";

cadena_script =&script language="JavaScript"$" +
"window.open("+"'"+url+"'"+", 'CustomPopUp'," +"'"+param+"'"+")" +
"&/script$";
pagina.RegisterStartupScript("Popup",cadena_script);
}


public void ActualizarPadre(Page pagina,string url)
{
string cadena_script="";
cadena_script = "&script language="'JavaScript'"$" + "var pWin;" +
"function setParent(){pWin=top.window.opener;}"+
"function reloadParent(){pWin.location.href="+"'"+url+"'"+";}"+
"setParent();"+
"reloadParent();"+
"&/script$";
pagina.RegisterClientScriptBlock("VentanaHija",cadena_script);
}

public void CerrarVentana(System.Web.UI.Page pagina)
{
string cadena_script="";
cadena_script = "&script language="'JavaScript'"$" +
"function cerrar(){"+
"var ventana=window.self;"+
"ventana.opener=window.self;"+
"ventana.close();}"+
"cerrar();"+
"&/script$";
pagina.RegisterClientScriptBlock("CerrarVentana",cadena_script);
}


Estas son los 3 procedimientos usados para poder lograr lo que buscamos, obviamente tendriase que conocer algo de javascript para poder entenderlos, pero ese no es problema alguno, manuales hay y muchos, no pretendo darles clases de javascript tampoco, pero si alguien no entiende dichas funciones puede simplemente preguntar que resolveremos la duda. Por cierto este codigo esta hecho para C#, no lo hice en VB pq no me gusta usarlo, y eso que creo saber más VB que C#, pero bueno, la utilización de la clase y sus procedimientos sería algo así.

El llamado a nuestro popup, o webform secundario se haría de la siguiente manera, obviamente ubicando este código en el evento click de algun link buton, o en el evento click de algun Button.

-------------------------------------------------------------------
Control_Ventanas vent=new Control_Ventanas();
vent.AbrirVentanaHija(this.Page,"http://localhost/Gimnasio/Admin/MantUsuarios.aspx","width=500, height=530, left=300, top=100, resizable=no");

-------------------------------------------------------------------

Para actualizar el webform principal después de realizada la operación que fuese usamos esto, que puede ir en el evento click del boton grabar, actualizar o eliminar.

--------------------------------------------------------------------
Control_Ventanas ventan=new Control_Ventanas();
ventan.ActualizarPadre(this.Page,"http://localhost/Gimnasio/Admin/AdminUser.aspx?texto=refresh");
ventan.CerrarVentana(this.Page);

--------------------------------------------------------------------

De esta manera abrimos un popup y actualizamos la página principal después de realizar una operación en dicho popup y que este sea cerrado.
Obviamente, es algo muy sencillo, pero si sabemos como se hace podemos hacerlo más complejo, ojala les sirva, mi objetivo aparte de esperar que alguien lo use, es que esté en donde esté el día que no recuerde bien como era, simplemente me bastará con ver mi blog jejejeje. Suerte.

jueves, enero 19, 2006

C# .NET - Controlando las Teclas Pulsadas

Básicamente uno siempre busca validar las entradas de datos de algun sistema que desarrollemos, y mucho más aún si estos datos van a ser grabados en una Base de Datos o serviran como referencia a Datos Históricos más adelante, por ello en el Framework de .Net se implementaron algunas librerias con las características propias para poder manejar estos casos. Imaginemos que tenemos una caja de texto, en la que se pide ingresar la edad de alguna persona X, para luego calcular algún otro dato usando esa edad ingresada, que pasaría si en esa caja de texto se nos va una letra, definitivamente nos traería uno que otro problemilla que aunque no grave si muy molesto, de la misma forma en una caja donde solo queremos poner letras, o mucho más aún, si tenemos un computador en el que la configuración regional de los decimales usa el "." y nosotros queremos usar siempre la "," definitivamente podemos manejar eso, y aquí expongo los 3 casos que más se usan, espero les sirva de algo. Este codigo muestra una caja de texto(txtSoloNumeros) en donde solo se pueden ingresar numeros y usar la tecla que nos permite borrar las entradas (Back)

private void txtSoloNumeros_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsNumber(e.KeyChar.ToString().Substring(e.KeyChar.ToString().Length - 1,1),0)==false)
{
if( e.KeyChar == Convert.ToChar(Keys.Back) )
{e.Handled=false;}
else{e.Handled=true;}
}
}

Aqui es lo contrario, se permiten la entrada de cualquier caracter, menos uno numérico

private void txtNoNumeros_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsNumber(e.KeyChar.ToString().Substring(e.KeyChar.ToString().Length - 1,1),0)==true)
{
if( e.KeyChar == Convert.ToChar(Keys.Back) )
{e.Handled=false;}
else{e.Handled=true;}
}
}

Y por último el hecho de pulsar una tecla y remplazarla por otra, va de esta manera.

private void txtConvierteCaracteres_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsNumber(e.KeyChar.ToString().Substring(e.KeyChar.ToString().Length - 1,1),0)==true)
{
e.Handled=true;
SendKeys.Send("*");
}
if(e.KeyChar=='*')
{
e.Handled=true;
SendKeys.Send("/");
}
}

Bueno se debe notar, que tenemos 2 casos, si es un numero convertirlo en "*", o el caso específico de si es "*" convertirlo en "/".

Antes de todo, debemos claro agregar el Evento "KeyPress" a cada una de las cajas de texto que vamos a usar

this.caja2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.caja2_KeyPress);

domingo, noviembre 06, 2005

Seguridad? - Privacidad? o Envidia?

Llamémoslo como sea que se nos ocurra, pero estoy seguro de que muchos lo van a implementar en su Espacio Personal, veamos la idea es la siguiente, cuando salio el MSN–Spaces empecé a escribir por ahí unos borradores, los que después de algún tiempo los vi totalmente idénticos en otra web, así que me preguntaba si podía evitar que cuando alguien visite mi blog pueda seleccionar el texto, darle clic derecho y copiarlo, así que la solución que propongo nos la da el “javascript” a través de 2 funciones sencillas, las cuales pongo a disposición de ustedes.

Les contaré que desde aqui es todo un inconveniente poder publicar código estructurado, pués todo el texto sale corrido y tendría q estar escribiendo etiquetas html por todo lado, disculpen la pereza ... pero si estan interesados pueden probar a seleccionar el texto de aqui y veran que no se puede, y pueden probar a dar el click derecho, si les interesa el código me lo piden por correo a jack.pe.cast@gmail.com y con mucho gusto se los enviaré.