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!!

Project Euler

No des tiempo al tiempo porque el tiempo no da tiempo al tiempo.

De esos días que decides tomarte un gran y amplio descanso de 15 minutos -como ustedes sabrán soy un rockstar y estoy muy ocupado atendiendo a mis fans-, me puse a vagar por la red, sin rumbo alguno y en modo random.. y encontré por ahí tan bonito sitio:

Project Euler

No sé como no lo había descubierto antes si soy geek rockstar y de lo más intrépido.

Trata de un sitio donde el atractivo principal es una serie de problemas matemáticos -hablando de manera general- que deben ser resueltos mediante una rutina de programación.

Para darle un valor agregado, uno debe registrarse para empezar a formar parte de la comunidad o «red social» y se van rankeando los usuarios con mayor puntaje a modo competencia.

¿Cuál es el punto?

Pues resulta que hay cierta persona en mi trabajo que siempre advierte que es inmune a todo, que lo puede todo y lo sabe todo (ñaca-ñaca).

No quiero decir nombres ni hacerles saber de quién se trata e.e

[ @Memo_Pita ]

…y entonces, decidí retarlo.

Utilizaremos python, dado que los dos sabemos prácticamente nada y además yo tenía tiempo queriendo ponerme a practicar. Por si fuera poco, para los problemas complejos no ganará quien solamente los resuelva, si no el que genere la rutina que obtenga el resultado en menor tiempo.

Y como Thanks Network! tiene hambre de entradas y además voy ganando =P, aquí van los primeros dos:

Problema 1: Múltiplos de 3 y 5

El problema dice así:

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.

¿Demasiado sencillo no?

Generamos un bucle que «tope» en el 1000 y validamos si el número actual es múltiplo de 5 o 3 utilizando el operador «módulo». De ser múltiplo lo almaceno en un arreglo y así sucesivamente. Una vez finalizado el bucle, imprimimos la suma de los valores contenidos en dicho arreglo. Piece of cake!

s = []
for x in range(1,1000):
    if x % 5 == 0 or x % 3 == 0:
        s.append(x)
     
print sum(s)

Problema 2: Números Fibonacci Pares

El problema dice lo siguiente:

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

Un poco mas complejo pero nada nivel alienígena…

Generamos un bucle while donde la condición se evalúa al inicio, a comparación del for -de kinder garden-.

array=[0,1]
sum = 0
fib=0

while (fib <= 4000000):
    if(fib%2):
        sum += fib 
    
    fib = array[1]
    array[1] += array[0]
    array[0] = fib
    
print sum

Y en el arreglo siempre arrastramos el valor anterior, de la serie, al que está en actual iteración. Es decir, tendríamos algo similar a lo siguiente:

[0, 1] -> [1, 1] -> [1, 2] -> [2, 3] -> [3, 5] -> [5, 8] -> [8, 13] -> [13, 21] -> [21, 34] -> [34, 55] -> ...

Aparentemente parece que cometo un error por como inicia la serie. Pero realmente la serie debe iniciar desde 0 y no desde 1 como me ha tocado ver. Independientemente de ello, no afectaría en el resultado, of course!, pero no está de más decirlo =)

Y bueno, solo se trata de ir sumando y al final imprimirlo. Nada de magia oscura.

So… ¿?

Pues son 416 problemas, y por aquí los estaré posteando y explicando para los que sean mas complejos. Aunque se supone no debería publicarlos, seré bueno y no pondré el resultado =P.

Solo espero que el trabajo me de tiempo para poder terminarlos. T___T

Saludos!