Set SelectedValue in DataList

Otra de esas pequeñas cosas que nos puede hacer perder el tiempo. Queremos cargar un Datalist con una lista de items, en el caso del ejemplo imágenes, y hacer que una de ellas aparezca seleccionada. Si recorremos los métodos y propiedades disponibles en este control, nos daremos cuenta de que la única forma de seleccionar por código un elemento es estableciendo la propiedad SelectedIndex. Existe la propiedad SelectedValue, pero es únicamente de lectura. Por desgracia, el índice no suele ser lo más recomendable para identificar a un elemento, así que en este ejemplo vamos a ver cómo hacer que este mismo control permita establecer su SelectedValue.

Se trata de un método extensor que recorrerá los elementos de la colección buscando coincidencias de clave, y una vez encontrada selecciona el elemento por su índice. Fijaos en que la dificultad reside en que la lista de claves no está indexada, con lo cual la tenemos que recorrer en un foreach y llevar la cuenta del índice “a pelo”.

  public static void SetSelectedValue(this DataList dataList,String value)
    {
        if (dataList.Items.Count > 0)
            {
                int i = 0;
                foreach (Object key in dataList.DataKeys)
                {//Recorremos las claves, llevando el índice en la vble i
                    if (value ==  key.ToString())
                    {//Elemento a seleccionar, fin del método
                        dataList.SelectedIndex = i;
                        break;
                    }
                    else
                        i++;
                }
            }
    }

 

Como siempre, espero que a alguien más le resulte útil 😉

 

FileUpload dentro de UpdatePanel

Sabido es que ciertos controles no funcionan correctamente dentro de un UpdatePanel. Es el caso de los Treeview, menú, gridview o detailsView entre otros. Algunos de estos no funcionan bajo determinadas circunstancias, o simplemente quedan totalmente invalidados. A este último grupo pertenece el control FileUpload, que nos  permite subir archivos al servidor.

Buscando por ahí, se encuentran varias soluciones, (destacaría la de Isaac Fernández en este mismo site), la mayoría enfocadas a la situación sencilla de que el control fileUpload esté situado directamente dentro del update panel. En este caso basta con agregar a la lista de triggers del UpdatePanel un nuevo PostBackTrigger con el ControlId apuntando al botón de subir archivo de nuestro FileUpload.

El problema de esta solución viene cuando la arquitectura se complica y tenemos, por ejemplo, el fileUpload dentro de un control de usuario propio, que a su vez será utilizado en páginas con varias MasterPage anidadas y el UpdateManager se encuentra en la primera de dichas MasterPages (suena rebuscado así contado, pero no estoy inventando nada :-)) Está claro que no podemos referirnos directamente desde el ASCX al UpdateManager (de forma sencilla, se entiende) ni viceversa. En este caso la solución sería tan simple como crear el PostBackTrigger referido a nuestro botón desde código, para lo cual necesitamos obtener el ScriptManager que se está utilizando en la página actual. El siguiente código muestra cómo hacerlo:

  

    protected void
Page_Load(object sender, EventArgs e)

    {

        ScriptManager scripManager = ScriptManager.GetCurrent(this.Page);

        scripManager.RegisterPostBackControl(lnkNuevaImagen);

    }

 

 

Asunto resuelto, nos cargamos la funcionalidad asíncrona para este botón, pero aseguramos que funciona con sólo incluir dos líneas de código fácilmente entendibles.

Espero que a alguien más le sirva!