November 2009 - Artículos

[Entity Framework] Parámetros OUT en funciones de mi modelo (mapeados a procedimientos almacenados)

Cuando necesitamos enviar a una función de mi modelo que esta mapeada a un procedimiento almacenado un parámetro out necesitaremos crear el ObjectParameter, aquí una express mirada por los integrantes de esta obra…

 

El procedimiento almacenado (PA)

Si tenemos nuestro procedimiento con este parámetro OUT

image

 

Nuestra función mapeada en el modelo de Entity Framework

Podemos mapeamos a una función a nuestra entidad y dicha función que sea un PA que devuelva un listado del mismo tipo que la entidad.

image 

Si lo queremos utilizar nos pide convertir en ObjectParameter (que es el objeto de parámetros que utiliza internamente el modelo para mapear valga la redundancia los parámetros, puedes verlo en clase que genera el modelo,  TuModelo.Designer)

Bueno, como decía,  al utilizarlo no da este precioso mensaje de error:

image 

 

Solución: utilizar un ObjectParameter

Creamos el parámetro (no olvidar que ObjectParameter se encuentra en el namespace System.Data.Objects)

paramOutPageTotal = new System.Data.Objects.ObjectParameter("PageTotal", typeof(int));

y para recuperar

paginaPageTotal = Int32.Parse(paramOutPageTotal.Value.ToString());

Quedaría asi:

image

 

 

Enlaces

Crossposting desde mi blog en Geeks.ms: http://geeks.ms/blogs/fernandezja

Posted 11-16-2009 20:27 por Jose A. Fernandez | con no comments

[ASP.NET] Gridview: Opciones para visualizar encabezado cuando los datos a enlazar están vacios(ShowHeaderWhenEmpty), y lo nuevo en ASP.NET 4.0

Nuevamente a raíz de una pregunta que me hicieron que es simple para responder o realizar la tarea, pero aquí quiero navegar en otras soluciones, por eso la dejo plasmada para futuras referencias.

Sea en grupos de noticias relacionados, foros o en la clases de .NET de las Becas Control F se siente (en algunos que vienen de winform sobre todo) la necesidad de esta funcionalidad, y cuando la preguntan quiero expresar todo lo que digo aquí.

Si alguien tiene otra opción, que escriba un comentario por favor entonces agrandamos al oferta :)

 

Empezamos…

 

Necesidad: (el titulo del articulo) Visualizar encabezado cuando los datos a enlazar están vacios en un Gridview

Si bien es algo que lo podremos resolver mediante estas dos propiedades

EmptyDataText Obtiene o establece el texto que se mostrará en la fila de datos vacía que se representa cuando un control GridView se enlaza a un origen de datos que no contiene registros.
EmptyDataTemplate Obtiene o establece el contenido definido por el usuario para la fila de datos vacía que se representa cuando un control GridView se enlaza a un origen de datos que no contiene registros.

Si se establecen las propiedades EmptyDataText y EmptyDataTemplate, la propiedad EmptyDataTemplate tendrá prioridad.

Ya nos contaba por aquí Sergio Tarrillo…

 

Nota !! CSS Friendly Adapter
Si estas utilizando CSS Friendly Adapter, tienes que tener la ultima versión para que renderice correctamente estas dos propiedades.
Puedes leer este articulo:

 

A que queremos llegar?

Entonces para llegar a realizar lo que vemos en la siguiente imagen,… que si la consulta no devuelve resultados visualicemos el encabezado del Gridview

image

Estoy utilizando la base de datos de ejemplo AdventureWorksLT2008 (la puedes descargar por aquí)

 

Soluciones

  1. Utilizando EmptyDataText
  2. Utilizando EmptyDataTemplate
  3. Manipulando el Datasource, que viene vacio y agregamos una fila “en blanco”
  4. Extendiendo el Gridview (aquí una elegante solución por Joe Wrobel )
  5. Utilizando ShowHeaderWhenEmpty (nuevo en ASP.NET 4.0)

 

Tenemos un ejemplo… para descargar :)

El ejemplo sencillo para poder realizar esta tarea es el siguiente

image

Las opciones (posibles soluciones) están en este ejemplo, menos la opcion 3 y la 5 que es una propiedad nueva en ASP.NET 4.0 (VS2010 Beta1/2)

image

 

Descargar Ejemplo

Click en la imagen o aquí

 

Exploremos las soluciones…

 

 

1 - Utilizando EmptyDataText

En esta propiedad solo podremos escribir una cadena:

image

Se visualiza de esta manera

image

Podemos introducir HTML, …

image

image

Pero imaginemos que querramos introducir el encabezado de esta manera :) no es del todo “agradable para el alma” podremos sufrir demasiado. Si quieres sufrir, sufrí! seria algo así…

<asp:GridView ID="gvProducts" runat="server" 
           AutoGenerateColumns="False" 
           DataKeyNames="ProductID"
           EmptyDataText="<div class='AspNet-GridView'><table cellpadding='0' cellspacing='0' summary=''><thead><tr><th scope='col'>Name</th>
<th scope='col'>ProductNumber</th><th scope='col'>Color</th><th scope='col'>StandardCost</th><th scope='col'>SellStartDate</th></tr></thead><tbody>
<tr><td colspan='5'>No se encontraron registros.<strong>En negrita.</strong></td></tr></tbody></table></div>"
CSSSelectorClass="YodaGrilla" DataSourceID="edsProducts"> <Columns> ...

El resultado (si nos va bien en esa “jungla” de HTML) seria

image

 

En el ejemplo se encuentra en esta pagina: image

 

 

 

2 - Utilizando EmptyDataTemplate

Aquí podremos escribir mas fácilmente sin tanto dolor je!, contenido para este momento de no tener datos disponibles en la consulta.

Lo podremos acceder mediante código declarativo

image 

image

O también mediante el Editor de Plantillas del Gridview

image

Aquí podremos hacer mas… introducir HTML que sea el encabezado generado cuando hay datos, o sea este HTML

image

 

Es decir copiamos el HTML que genera nuestra consulta con datos para copiar con estilos (y mas aun si utilizamos CSS Friendly Adapter).
Esto no es automático, cuando agregamos o modificamos una columna tendremos que realizar esta tarea nuevamente.

image

Si colocamos dentro del EmptyDataTemplate una tabla bien armada con lo que copiamos anteriormente, quedaria

image 

Esta solución no es muy elegante y no cumple con la filosofía que todo desarrollador debe seguir DRY (Don't repeat yourself), pero lo bueno que no tenemos que escribir código de servidor :)

 

Nos queda de la siguiente manera cuando los tenemos vacía la consulta de datos

image

Podremos agregar una fila un poco mas informativa…

image

image

 

En el ejemplo se encuentra en esta pagina:

 

 

 

3 - Manipulando el Datasource, que viene vacio y agregamos una fila “en blanco”

La idea es fácil, si el origen de datos no contiene datos entonces ingresamos un ítem vacio.
Hay que tener en cuento los no nulls o los que contenga un valor por default…
Aquí dejo dos enlaces que le puede ayudar al lector a realizar esta tarea:

 

 

4 - Extendiendo el Gridview… la solución elegante

Me baso en la solución propuesta por Joe Wrobel

Como lo dice el mismo una “solución elegante

El codigo lo dejo en MSDN Code Gallery

Como

protected IEnumerable gvProduct_MustAddARow(IEnumerable data) {
        List<Product> listProducts = (List<Product>)data;
        listProducts.Add(new Product());
        return listProducts;
}
 
 

NOTA: EntityDataSource mmm!!

Si trabajamos (como yo en este ejemplo) con un proveedor como EntityDataSource cuando estamos dentro del control y queremos

image

Y no podremos obtener el listado de nuestros objetos a partir de este EntityDataSourceWrapperCollection
(Si alguien conoce la forma por favor comente en este articulo)

Error:
"No se puede convertir un objeto de tipo 'System.Web.UI.WebControls.EntityDataSourceWrapperCollection' al tipo 'System.Collections.Generic.List`1[AdventureWorksLT2008Model.Product]'."


image

Así que en este ejemplo podría no utilizar EntityDataSource, pero lo que hice fue generar una lista vacía de Productos (ya que conocemos que tipo de datos se enlazan a esta grilla en particular) y agregarle un producto vacio en el evento MustAddRow de la idea original de Joe Wrobel

//List<Product> listProducts = (List<Product>)data;
List<Product> listProducts = new List<Product>();
listProducts.Add(new Product());
return listProducts;

 

 

5 - Utilizando ShowHeaderWhenEmpty del Gridview (solo disponible para ASP.NET 4.0)

Simplemente… algo que vamos tenemos disponible nativamente en ASP.NET 4.0
Y nos olvidamos de todo :) y disfrutamos:

image 

Lo que no  encontré todavía fue un ShowFooterWhenEmpty :(  pero bueno estamos en la beta 2 de VS2010

Mas info: GridView.ShowHeaderWhenEmpty 

 

 

 

Descargar el ejemplo

Click en la imagen o aquí

 

 

Enlaces

  • GridView.EmptyDataTemplate (Propiedad)
    Obtiene o establece el contenido definido por el usuario para la fila de datos vacía que se representa cuando un control GridView se enlaza a un origen de datos que no contiene registros.
  • GridView.EmptyDataText (Propiedad)
    Obtiene o establece el texto que se mostrará en la fila de datos vacía que se representa cuando un control GridView se enlaza a un origen de datos que no contiene registros.
  • GridView.ShowHeaderWhenEmpty (Property) (nuevo en ASP.NET 4.0)
    Gets or sets a value that indicates whether the heading of a column in the GridView control is visible when the column has no data.

Crossposting desde mi blog en Geeks.ms: http://geeks.ms/blogs/fernandezja

Posted 11-04-2009 22:00 por Jose A. Fernandez | con no comments