Tratar un dato dentro de un gridview

Leyendo el post Eval in gridview de los foros de ASP.NET en castellano (a los que a todo el mundo aconsejo), y dado que esta duda también me surgió en su momento y también me resolvió el señor Fredrik Normén en este artículo, paso a comentar un poquito la problemática.

Cuando estamos trabajando con controles de ASP.NET que leen de la base de datos y muestran un listado de resultados, como por ejemplo el gridview, el datalist o el repeater, en ocasiones nos hace falta tratar algún que otro dato.

Por ejemplo, queremos mostrar el listado de temas de un foro con el título de los temas y los 20 primeros caracteres de su texto con un gridview.

Algo tan sencillo como leer esos primeros 20 caracteres puede resultar muy complejo!!!

El truquito es llamar desde el Item del gridview a una función que hayamos creado en nuestro código. Siguiendo el ejemplo, tendríamos:

ejemplo.aspx
<asp:GridView ID="gv_Mensajes" runat="server" AutoGenerateColumns="False" AllowPaging="True" PageSize="20" OnRowDataBound="gv_Mensajes_RowDataBound" OnDataBinding="gv_Mensajes_DataBinding">
   <Columns>
      <asp:TemplateField>
         <ItemTemplate>   
            El título es:
            <asp:Label ID="lb_Titulo" runat="server" Text='<%# Eval("Titulo") %>'></asp:Label>  
         </ItemTemplate>
      </asp:TemplateField>      
      <asp:TemplateField>
         <ItemTemplate>   
            <asp:Label ID="lb_Texto" runat="server" Text='<%# acorta(Eval("Texto")) %>'></asp:Label>  
         </ItemTemplate>
     </asp:TemplateField>
   </Columns>
</asp:GridView>


Como veis en este (feo) gridview, el título lo dejamos tal cual está, pero al texto lo mandamos a la función acorta para que nos dé el valor de la Label.

En cuanto a la función acorta, tenemos:

ejemplo.aspx.cs
protected string acorta(object texto)
{
   return texto.ToString().Substring(0, 20);
}


Es muy importante darse cuenta de que la función acorta debe ser protected o public, pero no private, porque entonces nos dará un error diciéndonos que no se puede acceder a acorta dado su nivel de protección.

Por otra parte, también aconsejo, o al menos yo me he acostumbrado, a parsear la variable desde el gridview, de modo que acorta no tenga que recibir una variable object, sino, en este caso, un string.

De modo que quedaría:

<%# acorta((string)Eval("Texto")) %>

protected string acorta(string texto)


El motivo es que de ese modo, podemos acceder a la función acorta desde otros sitios que no sean el gridview sin necesidad de obligarle a tratar a texto como una variable object cuando sabemos que es un string. Esto puede parecer poco importante cuando estamos hablando de una simple variable de texto, pero sí es muy importante cuando por ejemplo estamos trabajando con una lista genérica con 1000 items.