jueves, 14 de mayo de 2009

Enlazar un enumerado a un Dropdownlist c#

En muchas ocasiones en nuestras aplicaciones definimos enumerados para hacer un manejo mas eficiente de los datos, muchas veces queremos mostrarlos en un combo para que el usuario seleccione. Para hacer esto podemos enlazar el enumerado al control DropdownList public enum MiEnumerado {Lunes,Martes,Miercoles} MiDropDownList.DataSource = Enum.GetNames(typeof(MiEnumerado)); MiDropDownList.DataBind(); Para acceder al valor seleccionado podriamos hacerlo de la siguiente manera: MiEnumerado miEnun = (MiEnumerado)Enum.Parse(typeof(MiEnumerado),MiDropDownList.SelectedValue); De esta forma tenemos el valor seleccionado en forma de enumerado nuevamente.

martes, 12 de mayo de 2009

Ciclo de vida de una pagina Asp.Net

Gracias a un gran compañero y mejor profesional (para que no te quejes Rafa) os dejo el esquema del ciclo de vida completo de una pagina asp.net.
(Haz click en la imagen para verla a tamaño completo)

Saber que control ha provocado el Postback

En algunas ocasiones nos gustaria saber control ha provocado la recarga (postback) de la página para esto podemos hacerlo de dos formas dependiendo de si es una recarga parcial (ajax) o un postaback total de la pagina. 1.-Si es una recarga parcial de la pagina //obtenemos la página actual Page page = (HttpContext.Current.Handler as Page); //mediante el Scriptmanager accedemos al control que ha hecho la recarga parcial de la misma string ctrlname = ScriptManager.GetCurrent(page).AsyncPostBackSourceElementID; Control control = page.FindControl(ctrlname); 2.-Si es una recarga total ctrlname = page.Request.Params["__EVENTTARGET"]; Esto funciona conrrectamente con casi todos los controles pero No con Botones, esto es debido a que los botons cuando se pintan en html no llaman a la función __doPostBack de Javascript y por tanto __EVENTTARGET nunca va a tener valor, para conseguir esto os dejo un enlace en el que muestran como conseguirlo para todo tipo de controles. Es un articulo muy útil de Ryan Farely.

Determining the Control that Caused a PostBack

lunes, 11 de mayo de 2009

TreeView SelectedNodeStyle no funciona sin Postback

Después de pasar un buen rato trabajando con el control Treview de asp.net (la version 2.0 del control, con la uno este problema no existe) me surgio un problema que con el que no contaba, el árbol que yo estaba generando no hacia postback cuando se producia un click en uno de los nodos, este que a priori no deberia suponer un problema, lo es cuando queremos personalizar el estilo del nodo seleccionado, en esta situación no se aplicaba el estilo. Esto se puede hacer de forma declarativa medienta las propiedades SelectNodeStyle. <"asp:treeview id="arbolListines" runat="server" backcolor="Aqua" bordercolor="Black" bold="true" > Para que el estilo sea reconocido de forma correcta debemos añadir la siguiente propiedad al control Treeview: Target="_self" De esta forma conseguiemos que funcione correctamente.

Acceder a un control dentro de un ContentPlaceHolder desde JavaScript

Un pequeño problema a la hora de usar las MasterPage es que al introducir controles dentro de los ContentPlaceHolder, el ClientId de estos controles aparece modificado, se le añade un prefijo con el nombre de su contenedor (ContentPlaceHolder). Esto solo nos afecta si queremos acceder a estos controles desde el cliente (javascript) . Un ejemplo seria un TextBox con el Id = txtNombre, este apareceria en nuestro codigo html como
ctl00_ContentPlaceCuerpoPagina_txtNombre

La solución fácil seria acceder usando el nombre completo

document.getElementById("ctl00_ContentPlaceCuerpoPagina_txtNombre").value

Esto seria poco elegante y ademas peligroso, ya que si en algun momento se cambia el nombre
del ContentPlaceHolder,esa sentencia ya no seria valida. Una forma efectiva de acceder al control seria.


document.getElementById('<%=txtNombre.ClientID %>').value

jueves, 23 de octubre de 2008

Seleccionar un item en un DropDownList por código

Aunque en un principio esta tarea nos pueda parecer algo trivial, no es tan sencillo. Para poder seleccionar un item del DropDownList conocido su valor deberemos concatener dos operaciones de búsqueda DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue(miValor)); En una primera operación se realiza una búsqueda por el valor que teniamos previamente (FindByValue) el resultado de esta operación es un elemento del tipo ListItem, una vez tenemos el item en cuestion solo tenemos que aplicarle el método IndexOf que nos devolvera su posición dentro del DropDownList.

jueves, 25 de septiembre de 2008

Evento RowCreated del Gridview, modificar el aspecto del grid

Estos ultimos dias me ha surgido la necesidad de modificar la forma en la cual se muestra un gridview y a continuación mostrare una forma en la que podemos realizar esta tarea. Las modificaciones las haremos a traves del evento RowCreated del control GridView, este evento se dispara cada vez que se crea una nueva fila, de esta forma podemos modificar el aspecto de cada una de las celdas a nuestro gusto. El siguiente codigo muestra un ejemplo protected void tablaPedidos_RowCreated(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { if (this.numeroPedido == null) this.numeroPedido = ((Pedidos)(e.Row.DataItem)).numeroPedido; else if (this.numeroPedido == ((Pedidos)(e.Row.DataItem)).numeroPedido) { TableCell tc = e.Row.Cells[2]; tc.Attributes["styles"] = "border:0"; } else this.numeroPedido = ((Pedidos)(e.Row.DataItem)).numeroPedido; } } Aunque el código habla por si mismo, ahora vamos a comentar algunas de las lineas claves para entender este ejemplo. if (e.Row.RowType == DataControlRowType.DataRow) En esta linea comprobamos que sea una fila, para no realizar este tratamiento sobre la cabecera ni el pie del grid ((Pedidos)(e.Row.DataItem)).numeroPedido; En nuestro caso el Grid se carga con una coleccion de objetos de tipo Pedido, asi que accedemos a las propiedades del objeto para saber si tenemos que hacer alguna modificacion en la fila TableCell tc = e.Row.Cells[2]; tc.Attributes["styles"] = "border:0"; De esta forma accedemos a la celda que esta en la posición 3 de la nueva fila que hemos creado y le decimos que elimine el borde. En resumen el evento RowCreated es bastante útil cuando queremos modificar la el aspecto de la fila que se esta creando o de alguna de sus celdas. Saludos!