21 de mayo de 2010

Clonar Objeto con C#

C# Clonar un objeto complejo: Veamos un ejemplo práctico y sencillo de como clonar o duplicar un objeto de estructura compleja.

La mayoría de los datos que solemos utilizar en nuestras aplicaciones, son tipos de datos por referencia, lo que implica que cuando igualamos una variable a otra (objeto1 = objeto2;) en realidad estamos definiendo que objeto1 apunte a la misma dirección de memoria que objeto2; de tal manera que si cambiamos una propiedad en el objeto1, esta cambiará también para el objeto2 (y viceversa).

Pero existen determinados escenarios donde necesitamos hacer una copia duplicada del objeto (clonación). Para lograrlo tenemos en .NET a nuestra disposición varias técnicas, con sus propias ventajas y desventajas. En este post pretendo comentar como lograr la clonación de la forma más sencilla (bajo mi punto de vista) aunque debo advertirte que no es la más eficiente en cuanto a consumo de recursos, pero sí la más ágil y fácil de mantener.

Posibles técnicas de clonación:

  1. Serialización y Deserialización del objeto.
  2. Implementar la interfaz IClonable para la clase.
  3. Usar MemberwiseClone() con Reflection.

Nota: De momento no se me ocurre ninguna otra técnica de clonación de objetos en .NET, si conoces alguna escríbeme un comentario para incluirla.

 

Clonar un Objeto con Serialización y Deserialización

Esta técnica de clonación de objetos .Net, consiste en:

  • Tomar el objeto que queremos clonar o duplicar, y serializarlo.
  • Tomar el resultado de la serialización y deserializarlo.
  • Almacenar la deserialización en la nueva variable.

Pero vallamos a la practica, veamos un ejemplo de como lograrlo:

//Creo el objeto de tipo Contacto
Contacto objeto1 = new Contacto { Id = 1, Nombre = "Pedro", Tel = "601010101" };
 
//Serializar objeto1 a XML
string xmlContacto = objeto1.SerializarToXml();
 
//Deserializar XML a objClonado
Contacto objClonado = xmlContacto.DeserializarTo<Contacto>();

Nota: En el código anterior hemos usado 2 métodos extensores que explicaré más adelante en este mismo artículo (SerializarToXml - DeserializarTo<T>). La clase del ejemplo (Contacto) es muy simple y es mucho mejor cualquiera de las otras 2 técnicas mencionadas, pero igual nos sirve de base para mostrar la técnica de clonación con serialización y deserialización.

Y con esto ya tenemos clonado el objeto1; a partir de este momento ya tenemos 2 variables independientes (objeto1, objClonado); actualmente ambas tienen la misma información, pero al modificar una variable no cambiará la otra automáticamente. El código lo puse en tres líneas para una mejor comprensión, también podríamos haberlo hecho así:

Contacto objeto1 = new Contacto { Id = 1, Nombre = "Pedro", Tel = "601010101" };
Contacto objClonado = objeto1.SerializarToXml().DeserializarTo<Contacto>();

 

Métodos Extensores para serialización y deserialización XML

Solo me limitaré a dejar el código de ambos métodos extensores, pues con anterioridad ya escribí un artículo donde los comentaba en profundidad Serializar y Deserializar un objeto con C#.

//Serializar a XML (UTF-16) un objeto cualquiera
public static string SerializarToXml(this object obj)
{
  try
  {
    StringWriter strWriter = new StringWriter();
    XmlSerializer serializer = new XmlSerializer(obj.GetType());
 
    serializer.Serialize(strWriter, obj);
    string resultXml = strWriter.ToString();
    strWriter.Close();
 
    return resultXml;
  }
  catch
  {
      return string.Empty;
  }
}
 
//Deserializar un XML a un objeto T
public static T DeserializarTo<T>(this string xmlSerializado)
{
  try
  {
    XmlSerializer xmlSerz = new XmlSerializer(typeof(T));
 
    using (StringReader strReader = new StringReader(xmlSerializado))
    {
        object obj = xmlSerz.Deserialize(strReader);
        return (T)obj;
    }
  }
  catch { return default(T); }
}

Y hasta aquí el post…

 

Artículos Relacionados:

12 de mayo de 2010

Error en SQL Server Management Studio 2008 al modificar una tabla

ErrorSQL

Este error o advertencia aparece cuando tienes instalado SQL Server Management Studio 2008 e intentas modificar una tabla de datos o alguna propiedad relacionada, al guardar los cambios aparece el mensaje:

No se permite guardar los cambios. Los cambios …”

Por suerte la solución es bien simple. En realidad el mensaje aparece porque lo tenemos configurado así, o mejor dicho, porque la instalación de SQL Server Management Studio 2008 por defecto, nos lo configuró así, pero veamos los pasos para cambiar la configuración.

 

Modificar Configuración de SQL Management Studio 2008, Permitir Guardar Cambios

  1. Ir al menú Herramientas\Opciones.
  2. Navegar hasta la opción Diseñadores\Diseñadores de tablas y bases de datos.
  3. Y en las opciones que aparecen a la derecha, DESMARCARImpedir guardar cambios que requieran volver a crear tablas”.

ErrorSQLOpciones

Y con esto ya está todo listo, ya puedes modificar cualquier tabla de datos en SQL Server Management Studio 2008.

 

Editar las 200 primeras filas en SQL Management Studio 2008

Otro tema que puede resultar incomodo en ciertas casos, es cuando pulsamos el botón derecho sobre una tabla (menú contextual), con la esperanza de editar los registros de la misma y nos encontramos con que solo nos deja:

  • Editar las primeras 200 filas.
  • Seleccionar las primeras 1000 filas.

Estas variables o cantidades también son configurables y lo que debes hacer es lo siguiente:

Modificar Configuración de SQL Management Studio 2008, Editar todas las Filas

  1. Ir al menú Herramientas\Opciones.
  2. Navegar hasta la opción Explorador de objetos de SQL Server\Comandos.
  3. Y en las opciones que aparecen en la imagen en el panel derecho, escribir un cero. Estas propiedades por defecto traerán 200 y 1000, solo bastará con escribirles el valor 0.

SQLEditarX

11 de mayo de 2010

jQuery Resumen Manipulación DOM

En este post pretendo resumir (a modo chuleta jQuery) los principales Métodos de Manipulación DOM con jQuery.

jQuery, Métodos de Manipulación DOM

Métodos  Métodos usados para:
.append()
.appendTo()
.prepend()
.prependTo()
Insertar nuevos elementos dentro de cada elemento coincidente.
.after()
.insertAfter()
.before()
.insertBefone()
Insertar nuevos elementos adyacentes a cada elemento coincidente.
.wrap()
.wrapAll()
.wrapInner()
Insertar nuevos elementos alrededor de cada elemento coincidente.
.html()
.text()
.replaceAll()
.replaceWith()
Reemplazar cada elemento coincidente con nuevos elementos o texto.
.empty() Eliminar los elementos internos o hijos.
.remove() Eliminar cada elemento coincidente, sin eliminarlos en realidad.

 

Nota: Estos son algunos de los principales métodos jQuery de Manipulación DOM

Referencia: Learning jQuery 1.3, un excelente libro.

 

Artículos relacionados:

8 de mayo de 2010

jQuery Autocomplete Facebook con ASP.Net

jQuery Autocomplete Facebook_thumb[2]

Veremos un ejemplo simple de como implementar jQuery Autocomplete Facebook en ASP.Net.

Hace unos meses atrás escribí un post sobre como implementar un Autocomplete con jQuery UI. En esta ocasión pretendo usar otro plugin jQuery autocomplete (FCBKcomplete). Este es un interesante plugin jQuery con el que podemos dotar a nuestras páginas de un vistoso autocomplete al estilo Facebook para seleccionar múltiples opciones.

 

jQuery Facebook Autocomplete

Con este artículo pretendo que veamos el código completo asociado a un ejemplos simple de implementación del plugin jQuery FCBKcomplete, un ejemplo muy básico, si deseas profundizar un poco más en las distintas opciones recomiendo visiten la página oficial del plugin.

Pero vayamos a la práctica. El objetivo de la página que desarrollaremos será el de obtener algo similar a la imagen del encabezado de este post; o sea; tendremos una caja en la que escribiremos el nombre de una compañía aérea y el autocomplete se activará mostrando las aerolíneas coincidentes. Veamos el código de ejemplo:

jQuery Autocomplete Facebook Ejemplo, ASPX

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="jQueryAutocompleteFacebook.aspx.cs" Inherits="jqAutocompleteFacebook" %>

<html xmlns="http://www.w3.org/1999/xhtml"> 

  <head> 

    <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 

    <title>jQuery AutoComplete Facebook Demo</title> 

    <link rel="stylesheet" href="fcbkcomplete.css" type="text/css" media="screen" 

      title="Test Stylesheet" charset="utf-8" /> 

    <script src="jquery.js" type="text/javascript" charset="utf-8"></script> 

    <script src="jquery.fcbkcomplete.min.js" type="text/javascript"></script>   

  </head> 

  <body> 

    <form id="form1" runat="server"> 

      <div> 

        <label>Seleccione la Aerolínea:</label> 

        <asp:DropDownList ID="cmbAerolineas" runat="server" ></asp:DropDownList> 

      </div> 

    </form> 

    <script type="text/javascript"> 

      $(document).ready(function () {

        $("#cmbAerolineas").fcbkcomplete({ maxitems: 3 });

      });

    </script> 

  </body>

</html> 

Comentemos un poco el código aspx:

  1. Inicialmente hacemos las referencias respectivas al css, y a las 2 bibliotecas (jQuery.js y fcbkcomplete.min.js)
  2. Lo próximo relevante que hacemos es incluir el DropDownList que contendrá todas las aerolíneas, a partir de las cuales filtraremos los datos a mostrar y seleccionar.
  3. Posteriormente enlazamos el plugin jQuery (Autocomplete Facebook) con el DropDownList (cmbAerolineas), además definimos la propiedad maxitems que nos sirve para delimitar el máximo número de aerolíneas a seleccionar.

Hasta aquí el código de la página aspx, pero nos falta el llenado de los datos del DropDownList (FCBKcomplete). La carga de estas aerolíneas pudimos haberla hecho directamente en el aspx, pero prefiero hacerlo desde el code-behind para hacer el ejemplo más parecido a un caso real.

 

jQuery Autocomplete Facebook Ejemplo, Code-Behind

public partial class jqAutocompleteFacebook : System.Web.UI.Page

{

  protected void Page_Load(object sender, EventArgs e)

  {

    if (Page.IsPostBack) return;

    var lstCodigos = new List<KeyValuePair<string, string>>();

    lstCodigos.Add(new KeyValuePair<string, string>("CU", "Cubana"));

    lstCodigos.Add(new KeyValuePair<string, string>("IB", "Iberia"));

    lstCodigos.Add(new KeyValuePair<string, string>("TP", "Tap Portugal"));

    lstCodigos.Add(new KeyValuePair<string, string>("UX", "Air Europa"));

    lstCodigos.Add(new KeyValuePair<string, string>("U1", "Air France"));

    lstCodigos.Add(new KeyValuePair<string, string>("U2", "Air Belrlin"));

    lstCodigos.Add(new KeyValuePair<string, string>("U3", "Air Derbis"));  

    cmbAerolineas.DataValueField = "key";

    cmbAerolineas.DataTextField = "value";

    cmbAerolineas.DataSource = lstCodigos;

    cmbAerolineas.DataBind();

  }

}

y Hasta aquí el ejemplo, espero te sea de utilidad...

Nota:
Este plugin (jQuery Autocomplete Facebook) tiene algunas otras propiedades interesantes que te ayudan a personalizar su comportamiento, para más información visita la página oficial.

 

Nota:
Además de este plugin, si lo deseas puedes usar el widget jQuery UI Autocomplete que también implementa la selección múltiple, para más información visita mi artículo sobre Autocomplete con jQuery UI o la página oficial.

 

Artículos relacionados: