Editar registros dentro del GridView

La historia empieza hacia ..

Cierto día estaba trabajando con el control GridView el cual lo utilizo para mostrar información hasta que llego el momento de editar esos registros lo primero que se me vino a la mente fue armar una nueva pagina donde pudiera editar cada uno de ellos pero reaccione y dije es mucho en rollo ademas el control GridView proporciona ciertas columnas para poder manipular la información.

Lo primero que tenemos que hacer es agregar una columna de de tipo CommandField solo tenemos que seleccionar el el control GridView en la parte superior del lado derecho aparece una flecha ,que al seleccionar nos desplegara un menu de opciones elegimos la opción de Editar Columnas

Fig1. Edicion de Columnas

Fig1. Edicion de Columnas

Habilitando la opción tenemos que buscar en la lista de campos disponibles   CommandField  y en sus opciones seleccionar Editar,Actualizar,Cancelar por ultimo damos agregar y en la parte de campos nos mostrara las columnas de nuestro  GridView

Fig.2 Definición de columnas

Fig.2 Definición de columnas

Al agregar esta columna lo primero que tendremos que hacer es agregar los siguientes métodos a nuestro control   GridView :

  • RowEditing
  • RowCancelingEdit
  • RowUpdating

El método RowEditing   se produce cuando se hace clic en el botón Editar de una fila y en code-behind quedaría de esta manera :

protected void gvPrefijos_RowEditing(object sender, GridViewEditEventArgs e)
{
  this.gvPrefijos.EditIndex = e.NewEditIndex;

  DataTable dt = new DataTable();
  dt = (DataTable)ViewState["Data"];

  this.gvPrefijos.DataSource = dt;
  this.gvPrefijos.DataBind();

}

El método RowCancelingEdit se produce cuando se hace clic en el botón Cancelar de una fila en modo de edición, pero antes de que la fila salga del modo de edición y en code-behind quedaría de esta manera :

//
protected void gvPrefijos_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    this.gvPrefijos.EditIndex = -1;
    CargaPrefijos();
}
//

Finalmente en el metodo RowUpdating se produce cuando se hace clic en el botón Actualizar de una fila y en code-behind quedaría de esta manera :

protected void gvPrefijos_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
     int resultInt = 0;
     bool resultado = new Prefijos_CN().ModificarPrefijos(new Prefijos_CN
          {
            IdPrefijo = int.TryParse(this.gvPrefijos.DataKeys[e.RowIndex].Values["IdPrefijo"].ToString(), out resultInt) ? resultInt : 0,
            Nombre = ((TextBox)this.gvPrefijos.Rows[e.RowIndex].Cells[0].Controls[0]).Text,
            Descripcion = ((TextBox)this.gvPrefijos.Rows[e.RowIndex].Cells[1].Controls[0]).Text
         });

     if (resultado)
     {
        gvPrefijos.EditIndex = -1;
        CargaPrefijos();
     }
    else
    {

    }
}

En nuestro control GridView nos debe de quedar de la siguiente manera(Codigo) ..

<asp:GridView runat="server" ID="gvPrefijos" AutoGenerateColumns="False" DataKeyNames="IdPrefijo" onrowediting="gvPrefijos_RowEditing" onrowupdating="gvPrefijos_RowUpdating" onrowcancelingedit="gvPrefijos_RowCancelingEdit"></pre>
<Columns>
<asp:BoundField DataField="Nombre" HeaderText="Nombre" />
<asp:BoundField DataField="Descripcion" HeaderText="Descripcion" />
<asp:CommandField ShowEditButton="True"/>
</Columns>
</asp:GridView>

Finalmente al editar los registros de nuestro control GridView nos debe de quedar de la siguiente manera(Diseño) ..

Fig.3 Edición de registros

Fig.3 Edición de registros

 

Saludos...

Disposing objects in SharePoint 2010

En SharePoint 2010 contamos con los siguientes objetos:

  • SPFarm
  • SPService
  • SPWebApplication
  • SPSite
  • SPWeb
  • SPList

La mayoría de los cuales no soportan o requieren Dispose. SharePoint 2010 cuenta con una gran cantidad de productos, algunos de ellos fueron creados incluso antes de que .NET existiera. Los objetos SPSite y SPWeb se apoyan en ciertos (no todos) objetos COM para llevar a cabo su funcionalidad. Entonces, el recolector de basura no nos asegurará el liberar todos los recursos para los SPWeb y SPSite no referenciados en memoria. La no liberación de estos recursos es un error común en el desarrollo en SharePoint.

¿Cómo liberaremos los recursos?

Estos objetos implementan la la interfaz IDispose, la cual utilizaremos para liberarlos.

¿Qué sucede si no se realiza Dispose?

El recolector de basura tendría que encargarse de la liberación de estos recursos pero como ya se menciono, no lo realizará totalmente y dejaremos estos objetos colgados en memoria con lo cual causaremos un memory leak en nustro servidor.

Best practices para la liberacion de recursos de SPSite y SPWeb

La forma de liberar los recursos depende de la forma en que instanciamos nuestro objeto:

Si creas una nueva instancia de un SPSite o SPWeb, debes de realizar un Dispose cuando ya no se necesite el objeto.

SPSite site= new SPSite("http://sharepoint");

SPWeb web= mySite.OpenWeb("/projects");

...

web.Dispose();

site.Dispose();

Cuando recorremos en un foreach una lista de objetos SPSite o SPWeb, en cada interación del foreach se instancia el SPSite o SPWeb correspondiente. Por tanto, debemos de realizar un Dispose al final de su uso.

...
foreach (SPSite site in webApplication.Sites)
{
   try
   {
   ...
   }
   finally
   {
      site.Dispose();
   }
}

Una forma de realizar Dispose automáticamente a los objetos cuando dejen de utilizarse es poner nuestro código dentro de un bloque Using. Using automáticamente libera el objeto cuando el código dentro del bloque se ha ejecutado.


using(SPSite site = new SPSite("http://sharepoint"))
{
   using(SPWeb web = site.RootWeb)
   {
    ...
   }
}

Si utilizas las instancias globales de SPSite y SPWeb que provee la clase estática SPContext.Current no hay que realizar un Dispose a estos objetos ya que son para uso global y otros componentes los utilizan.

SPSite site = SPContext.Current.Site;
SPWeb web = SPContext.Current.Web;
...

//No realizar Dispose a estos objetos

Encabezados de una tablas en un Report Viewer

En los últimos días e estado modificando algunos reportes creo que todo va bien hasta que me di cuanta que al mostrar una segunda pagina los encabezados de una tabla no se muestran.

Para ello les hablare de un poco de  como lo solucione el problema.

Lo primero que tenemos que hacer al momento de hacer reportes es configurar nuestro reporte (Tamaño,Margenes, Posición),creo que eso seria lo básico en mi caso estoy usando Report Viewer que viene por defaul en el Visual Studio 2010 .

Fig1.ReportViewer

Fig1.ReportViewer

Para ello nos vamos a Barra de Herramientas=> Menú Informe=>Propiedades del informe nos debe de aparecer el siguiente recuadro :

Fig.2 Configuracion del reporte

Fig.2 Configuración del reporte

Una vez que hayamos definido la configuración de nuestro reporte  es hora de comenzar a diseñar nuestro reporte,pero primero os explico un par de cosas mi configuración, es simple  definido que usare papel tamaño carta y que los margenes que e definido son de 2cm para ambos casos y que la medida pagina es por cm.

Continuamos a diseñar nuestro reporte pero antes definamos el tamaño del cuerpo del reporte (Área de trabajo) ,nos posicionamos en el cuerpo y en la barra de propiedades buscamos la propiedad Size en mi caso el tamaño que e definido tomando en cuenta la orientación del reporte es  25.94cm,19.59cm.

Fig.3 Diseño

Fig.3 Diseño

Una vez que este el diseñado de nuestro reporte  lo que haremos sera deferir que los encabezados de la tabla se repitan siempre y cuando se cree una nueva pagina, para ello buscamos en la parte inferior buscamos una barra que contiene   dos columnas(Grupo de filas,Grupo de columnas) al final de la barra hay un símbolo de triangulo damos clic y seleccionamos Modo Avanzado.

Fig4.ModoAvanzado

Fig4.ModoAvanzado

Al seleccionar el modo avanzado se nos habilitara una nueva opción en la columna de Grupo de filas  («Estatico») para ello lo primero que haremos es seleccionar  la fila  que contiene los encabezados en  nuestra tabla una vez seleccionada damos clic en Estático en  la columna de Grupo de filas.

Fig5.Encabezados

Fig5.Encabezados

Una vez echo lo anterior buscamos en la barra de propiedades la opción de RepeatOnNewPage definiendo un valor  True con esto los encabezados de la tabla se mostraran cada vez que se genere una nueva pagina.

Fig6.Barra de Propiedades

Fig6.Barra de Propiedades

Bueno con lo ya mencionado cada vez que se genere una nueva pagina los encabezados de la tabla se mostraran .

Saludos!!

Definiendo el tamaño de una imagen

Definiendo el tamaño de una imagen

Esta vez les hablare con algo que me tope en el camino del desarrollo de aplicaciones web..

Resulta que estaba desarrollando una aplicación y para ello mostraba una imágenes en un formulario  todo marcha bien hasta me empece a dar cuenta que no todas las imágenes que mostraba  eran del mismo tamaño lo primero que se me ocurrio, un tamaño por default por lo que intente esto

<table>
<tr>
<td>
<asp:Image runat="server" ID="imgPortada" AlternateText="Imagen no disponible" Width="250px" Height="250px" />
</td>
</tr>
</table>

Para la parte del código cree una forma por default:

//
private void CargaPortada()
{
  this.imgPortada.ImageUrl = ResolveUrl("~/Carperta/Imagen");
}
//

Pero después me di cuenta que hacer lo anterior resultaba un poco inadecuado ya que las imágenes perdían legibilidad y varias de ellas no tenían el mismo tamaño por lo que arme unas lineas código para resolverlo:

//
private void CargaPortada()
    {
        try
        {
            this.lblMensaje.Text = "";

            this.imgPortada.ImageUrl = ResolveUrl("~/Carperta/Imagen");
            System.Drawing.Image objImagen = System.Drawing.Image.FromFile(Server.MapPath("~/Carperta/Imagen"));

            this.imgPortada.Width = objImagen.Height;
            this.imgPortada.Height = objImagen.Width;
            
            objImagen.Dispose();
            objImagen = null;
        }
        catch(Exception e)
        {
            this.lblMensaje.Text = "Imagen no disponible.";
        }
    }
//

Entonces lo que hice fue una instancia de la clase System.Drawing.Image a la cual le asigno la ruta física de la imagen y por ultimo a mi control de asp le defino los valores del Width y Height del objeto

Por ultimo el control de asp lo definimos de esta manera sin Width y Height

<asp:Image runat="server" ID="imgPortada" AlternateText="Imagen no disponible" />

Saludos!!

Usando la clase StringBuilder

Esta entrada es dedicada a las largas cadenas con las que alguna vez nos ha tocado trabajar.

La clase StringBuilder forma parte de la librería System.Text, normalmente la utilizaremos cuando se desee modificar una cadena sin crear un nuevo objeto. Solo mencionaré algunos métodos que nos permitirán modificar la cadena con la que estemos trabajando.

Para empezar a trabajar con la clase es necesario agregar una referencia al espacio de nombres System.Text

Una vez que se haya agregado la referencia empezaremos por declarar nuestro objeto y le asignaremos un cadena de la siguiente manera:

//
StringBuilder objStringBuilder = new StringBuilder("Hola Mundo");
//

Métodos

 

StringBuilder.Append

Básicamente este método nos va permitir agregar texto al final de nuestra cadena que contenga nuestro objeto StringBuilder

Ejemplo :

//
StringBuilder objStringBuilder = new StringBuilder("Hola Mundo");
objStringBuilder.Append("que tal tu día ?");
Console.WriteLine(objStringBuilder.ToString());
Console.Read();

El resultado de estas lineas de código en consola sería:

Hola Mundo que tal tu día ?

 

StringBuilder.AppendFormat

Este método nos permite agregar texto a la cadena actual, además nos va a permitir dar formato al texto mediante la interfaz IFormattable

El siguiente ejemplo añadiremos un valor de tipo DateTime dándole un formato de fecha corta.

Ejemplo :

DateTime fechaActual = DateTime.Now;

StringBuilder objStringBuilder = new StringBuilder("Hoy es ");
 objStringBuilder.AppendFormat("{0:d}", fechaActual);
 Console.WriteLine(objStringBuilder.ToString());
 Console.Read();

El resultado de estas líneas de código en consola sería :

Hoy es 07/02/2013

 

StringBuilder.Insert

Este método permite insertar una cadena u objeto en un índice que se especifique dentro de nuestra cadena actual

Ejemplo:

StringBuilder objStringBuilder = new StringBuilder("Lonchera cósmica que haría sin ti");
 objStringBuilder.Insert(27, "mi lonche ");
 Console.WriteLine(objStringBuilder.ToString());
 Console.Read();

El resultado de estas  lineas de código en consola seria:

Lonchera cósmica que haría mi lonche sin ti

 

StringBuilder.Remove

Este  método permite eliminar texto de la cadena actual indicando el número de caracteres a eliminar y comenzando en un índice de base cero previamente especificado.

Ejemplo:

StringBuilder objStringBuilder = new StringBuilder("Hola Mundo");
objStringBuilder.Remove(5,5);
Console.WriteLine(objStringBuilder.ToString());
Console.Read();

El resultado de estas  lineas de código en consola seria:

Hola

 

StringBuilder.Replace

Este método nos va a permitir remplazar  caracteres del objeto  StringBuilder con otro carácter especificado para ello tenemos que tener en cunta que caracteres vamos a remplazar.

Ejemplo:

StringBuilder objStringBuilder = new StringBuilder("Hola Mundo");
 objStringBuilder.Replace("Mundo", "Comunidad");
 Console.WriteLine(objStringBuilder.ToString());
 Console.Read();

El resultado de estas  lineas de código en consola seria:

Hola Comunidad

Es todo en esta entrada. Saludos !