<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-26706176</id><updated>2011-11-25T08:23:19.854-08:00</updated><category term='Crystal Reports'/><category term='Libros'/><category term='AjaxControlToolKit'/><category term='_spBodyOnLoadFunctionNames'/><category term='Architecture Journal'/><category term='Designer'/><category term='VS.NET'/><category term='AJAX'/><category term='WSPBuilder'/><category term='OPEN XML SDK'/><category term='ASCX'/><category term='access denied'/><category term='SOA'/><category term='AddIn'/><category term='stsadm'/><category term='XAML'/><category term='ASP.NET'/><category term='.NET Show'/><category term='JQuery'/><category term='MSDN'/><category term='VSTO'/><category term='Metadata Administrada'/><category term='OBA'/><category term='Gestión Documental'/><category term='GAC'/><category term='Planning'/><category term='Outlook AddIn'/><category term='Taxonomía'/><category term='MSDN Radio'/><category term='Revista'/><category term='init.js'/><category term='MOSS'/><category term='LINQ'/><category term='Field Explorer'/><category term='Language pack'/><category term='Scott Guthrie'/><category term='SharePoint 2007'/><category term='SPContext'/><category term='Arquitectura'/><category term='GridView'/><category term='SPWeb'/><category term='.NET 3.0'/><category term='ListBox'/><category term='.NET Framework'/><category term='SharePoint 2010'/><category term='WSS'/><category term='crqe.dll'/><category term='Master Page'/><category term='C#'/><category term='addcontentdb'/><category term='WebParts'/><category term='Lista'/><category term='WebPart'/><category term='Ineta'/><category term='WCF'/><category term='Code behind'/><category term='Sharepoint'/><category term='Load Report Failed'/><category term='DLL Hell'/><category term='Process'/><category term='GDI+'/><category term='IIS7'/><category term='Patrones'/><category term='JavaScript'/><category term='WPF'/><category term='Planeación'/><category term='Silverlight'/><category term='XmlHTTPRequest'/><category term='Excel'/><title type='text'>SharePoint día a día</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>60</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-26706176.post-1866885698863427538</id><published>2011-11-25T08:20:00.001-08:00</published><updated>2011-11-25T08:23:19.861-08:00</updated><title type='text'>Aprobar una Tarea Programáticamente</title><content type='html'>&lt;p align="justify"&gt;Hola de nuevo. Este es un tema que varios han comentado bastante en Foros, Blogs, y bueno cada medio que permita dar a entender la problemática.&lt;/p&gt; &lt;p align="justify"&gt;En resumen lo que necesitábamos en nuestro caso era poder Aprobar una Tarea asociada a un WorkFlow diseñado con SharePoint Designer, pero que al tiempo el WorkFlow vaya avanzando.&lt;/p&gt; &lt;p align="justify"&gt;Uno de los inconvenientes que los usuarios finales encuentran con los WorkFlows de SharePoint Designer es tener que completar las tareas asignadas, pero de paso también tener que aprobar el ítem de la lista que tiene asociado el WorkFlow.&lt;/p&gt; &lt;p align="justify"&gt;Para evitar esto, podemos crear una WebPart que nos permita tanto aprobar (realizar la tarea y cambiar el estado del ítem), como puede ser rechazar o finalmente cancelar en caso de no querer ejecutar ninguna acción en el momento.&lt;/p&gt; &lt;p align="justify"&gt;Supongamos entonces que tenemos un WorkFlow bastante simple, con 3 pasos, durante los cuales un primer paso es asignar una tarea a un Primer Aprobador. Luego en el siguiente paso el primer aprobador requiere Revisar y Aprobar un ítem de una lista o quizá un documento en una biblioteca, y quiere poder hacer todo desde un único punto, y no tener que vérselas con la opción de Realizar Tarea. En caso que el primer aprobador apruebe, entonces viene un tercer paso donde el segundo aprobador da por terminado el proceso Aprobando o Rechazando el ítem.&lt;/p&gt; &lt;p align="justify"&gt;A continuación se puede apreciar el WorkFlow diseñado:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-XF8QZ_2eTks/Ts_AOpTWdiI/AAAAAAAAANA/Uq8fxGGoVpo/s1600-h/Task1%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Task1" border="0" alt="Task1" src="http://lh3.ggpht.com/--r_L0KyvB5g/Ts_APK0L2jI/AAAAAAAAANI/OMcj8OcWNZs/Task1_thumb.png?imgmax=800" width="244" height="173"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Cuando se crea un WorkFlow en SharePoint Designer, este a su vez crea una serie de formularios ASPX personalizados que se pueden encontrar en la siguiente localización, junto a los archivos de configuración y reglas del WorkFlow. Esas páginas ASPX se corresponden o sirven con mecanismo que permite la Realización de la Tarea, que se ha configurado como una Acción en algún paso del WorkFlow, por ejemplo en los pasos Revisar y Aprobar 1 del WorkFlow de este ejemplo.&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-rMtv0RH9ShE/Ts_AP20k42I/AAAAAAAAANQ/nZNoXwAESbI/s1600-h/Task2%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Task2" border="0" alt="Task2" src="http://lh3.ggpht.com/-vdLBx5QYCoM/Ts_AQYuiVzI/AAAAAAAAANY/_NY75GudNGM/Task2_thumb.png?imgmax=800" width="244" height="144"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;En rojo se enmarcan las páginas ASPX respectivas de cada Acción de Tarea en los pasos del WorkFlow.&lt;/p&gt; &lt;p align="justify"&gt;Pero llega el momento de crear la WebPart que permita entonces reemplazar la WebPart por defecto de cada página ASPX asociada a una Tarea. La WebPart por defecto lo único que permite realizar es la acción de Completar la Tarea, que es lo que queremos evitar, y que mejor eso se haga y también se modifique automáticamente el estado del WorkFlow.&lt;/p&gt; &lt;p align="justify"&gt;La lista que se asociará con el WorkFlow deberá contener un campo llamado Estado de tipo elección y campo llamado Aprobador de tipo Texto. Los dos campos podrán estar ocultos en la lista porque son únicamente un medio de ejecución y control para la WebPart personalizada.&lt;/p&gt; &lt;p align="justify"&gt;No voy a explicar cómo construir la WebPart ya se aen WSPBuilder para SharePoint 2007 o una WebPart visual en SharePoint 2010. Dejo el código a continuación. Este ejemplo asume que la WebPart utiliza un control ASCX. En el cual estarán las tres acciones de Aprobar, Rechazar y Cancelar, que son básicamente botones.&lt;/p&gt; &lt;p&gt;using System;&lt;br&gt;using System.Collections.Generic;&lt;br&gt;using System.Web;&lt;br&gt;using System.Web.UI;&lt;br&gt;using System.Web.UI.WebControls;&lt;br&gt;using Microsoft.SharePoint;&lt;br&gt;using Microsoft.SharePoint.Workflow;&lt;br&gt;using Microsoft.SharePoint.Utilities;&lt;br&gt;using System.Collections;&lt;br&gt;using System.Globalization;&lt;/p&gt; &lt;p&gt;namespace WSPBuilderCOA&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public partial class EditTask : System.Web.UI.UserControl&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string url;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Url&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url = value;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return url;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void Page_Load(object sender, EventArgs e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //this.lblMensaje = "";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void btnAprobar_Click(object sender, EventArgs e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPSecurity.RunWithElevatedPrivileges(delegate()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite site = new SPSite(url))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = site.OpenWeb())&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; web.AllowUnsafeUpdates = true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPList task = web.Lists["Tareas"];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPListItem item = task.Items.GetItemById(Convert.ToInt32(Request.Params["ID"]));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (item["WorkflowListId"] != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Guid sourceListID = new Guid(item["WorkflowListId"].ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPList sourceList = web.Lists.GetList(sourceListID, true);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int sourceListItemID = Convert.ToInt32(item["WorkflowItemId"]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPListItem sourceListItem = sourceList.GetItemById(sourceListItemID);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //El primer aprobador realiza la tarea y cambia el estado del ítem a Aprobado en Primera Instancia&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sourceListItem["Aprobador"].ToString() == "Aprobador 1" &amp;amp;&amp;amp; Convert.ToString(sourceListItem["Estado"]) == "En Revisión")&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceListItem["Estado"] = "Aprobado en Primera Instancia";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceListItem["Aprobador"] = "Aprobador 1";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceListItem.Update();&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Get the workflow instance id from Task item&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Guid taskWorkflowInstanceID = new Guid(item["WorkflowInstanceID"].ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWorkflow workflow = item.Workflows[taskWorkflowInstanceID];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWorkflowTask wfTask = workflow.Tasks[item.UniqueId];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hashtable ht = new Hashtable();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.Completed] = "TRUE";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["Completed"] = "TRUE";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.PercentComplete] = 1.0f;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["PercentComplete"] = 1.0f;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["Status"] = "Completed";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString(new CultureInfo((int)wfTask.Web.Language, false), Strings.WorkflowStatusInProgress, new object[0]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.WorkflowOutcome] = "Approved";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["TaskStatus"] = "Approved";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["FormData"] = SPWorkflowStatus.InProgress;&lt;/p&gt; &lt;p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWorkflowTask.AlterTask((wfTask as SPListItem), ht, true);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect(Request.Params["Source"]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sourceListItem["Aprobador"].ToString() == "Aprobador 1" &amp;amp;&amp;amp; Convert.ToString(sourceListItem["Estado"]) == "Aprobado en Primera Instancia")&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceListItem["Estado"] = "Aprobado en Segunda Instancia";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceListItem["Aprobador"] = "Aprobador 2";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceListItem.Update();&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Get the workflow instance id from Task item&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Guid taskWorkflowInstanceID = new Guid(item["WorkflowInstanceID"].ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWorkflow workflow = item.Workflows[taskWorkflowInstanceID];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWorkflowTask wfTask = workflow.Tasks[item.UniqueId];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hashtable ht = new Hashtable();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.Completed] = "TRUE";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["Completed"] = "TRUE";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.PercentComplete] = 1.0f;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["PercentComplete"] = 1.0f;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["Status"] = "Completed";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString(new CultureInfo((int)wfTask.Web.Language, false), Strings.WorkflowStatusInProgress, new object[0]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.WorkflowOutcome] = "Approved";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["TaskStatus"] = "Approved";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["FormData"] = SPWorkflowStatus.InProgress;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWorkflowTask.AlterTask((wfTask as SPListItem), ht, true);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect(Request.Params["Source"]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception ex)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //lblMensaje.Text = "Ha ocurrido un error aprobando: " + ex.Message + " - " + ex.Source;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; web.AllowUnsafeUpdates = false;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void btnRechazar_Click(object sender, EventArgs e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPSecurity.RunWithElevatedPrivileges(delegate()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite site = new SPSite(url))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = site.OpenWeb())&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; web.AllowUnsafeUpdates = true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPList task = web.Lists["Tareas"];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPListItem item = task.Items.GetItemById(Convert.ToInt32(Request.Params["ID"]));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (item["WorkflowListId"] != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Guid sourceListID = new Guid(item["WorkflowListId"].ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPList sourceList = web.Lists.GetList(sourceListID, true);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int sourceListItemID = Convert.ToInt32(item["WorkflowItemId"]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPListItem sourceListItem = sourceList.GetItemById(sourceListItemID);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //El primer aprobador realiza la tarea y cambia el estado del ítem a Aprobado en Primera Instancia&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sourceListItem["Aprobador"].ToString() == "Aprobador 1" &amp;amp;&amp;amp; Convert.ToString(sourceListItem["Estado"]) == "En Revisión")&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceListItem["Estado"] = "Rechazado";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceListItem["Aprobador"] = "Aprobador 1";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceListItem.Update();&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Get the workflow instance id from Task item&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Guid taskWorkflowInstanceID = new Guid(item["WorkflowInstanceID"].ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWorkflow workflow = item.Workflows[taskWorkflowInstanceID];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWorkflowTask wfTask = workflow.Tasks[item.UniqueId];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hashtable ht = new Hashtable();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.Completed] = "TRUE";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["Completed"] = "TRUE";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.PercentComplete] = 1.0f;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["PercentComplete"] = 1.0f;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["Status"] = "Completed";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString(new CultureInfo((int)wfTask.Web.Language, false), Strings.WorkflowStatusInProgress, new object[0]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.WorkflowOutcome] = "Approved";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["TaskStatus"] = "Approved";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["FormData"] = SPWorkflowStatus.InProgress;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWorkflowTask.AlterTask((wfTask as SPListItem), ht, true);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect(Request.Params["Source"]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sourceListItem["Aprobador"].ToString() == "Aprobador 1" &amp;amp;&amp;amp; Convert.ToString(sourceListItem["Estado"]) == "Aprobado en Primera Instancia")&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceListItem["Estado"] = "Rechazado";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceListItem["Aprobador"] = "Aprobador 2";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceListItem.Update();&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Get the workflow instance id from Task item&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Guid taskWorkflowInstanceID = new Guid(item["WorkflowInstanceID"].ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWorkflow workflow = item.Workflows[taskWorkflowInstanceID];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWorkflowTask wfTask = workflow.Tasks[item.UniqueId];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hashtable ht = new Hashtable();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.Completed] = "TRUE";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["Completed"] = "TRUE";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.PercentComplete] = 1.0f;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["PercentComplete"] = 1.0f;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["Status"] = "Completed";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString(new CultureInfo((int)wfTask.Web.Language, false), Strings.WorkflowStatusInProgress, new object[0]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[SPBuiltInFieldId.WorkflowOutcome] = "Approved";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["TaskStatus"] = "Approved";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht["FormData"] = SPWorkflowStatus.InProgress;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWorkflowTask.AlterTask((wfTask as SPListItem), ht, true);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect(Request.Params["Source"]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception ex)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //lblMensaje.Text = "Ha ocurrido un error aprobando: " + ex.Message + " - " + ex.Source;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; web.AllowUnsafeUpdates = false;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;}&lt;br&gt;&lt;/p&gt; &lt;p align="justify"&gt;El código es únicamente como demostración, no hemos revisado ninguna buena práctica o que quede mejor ordenado y estructurado porque no es el objetivo de esta entrada. Lo realmente interesante de todo eso, es la parte donde se ejecutan las acciones que permiten Aprobar y Terminar cada tarea asociada, pero que adicionalmente cambian el campo Estado de la lista y que hace que el WorkFlow pueda ir avanzando acorde a la lógica diseñada en SharePoint Designer.&lt;/p&gt; &lt;p align="justify"&gt;En la siguiente imagen se aprecian la WebPart personalizada y la que ofrece SharePoint por defecto para cada Tarea. El ejemplo muestra lo que vería el usuario Aprobador 2 cuando va a Editar su Tarea asignada.&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/-f1aAd63MSl8/Ts_A87oIzjI/AAAAAAAAANg/FwOVvhNWDr8/s1600-h/Task3%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Task3" border="0" alt="Task3" src="http://lh6.ggpht.com/-Htc4pDA5J5M/Ts_A9R39o9I/AAAAAAAAANo/Y3zdpudlSGc/Task3_thumb.png?imgmax=800" width="244" height="87"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;Feliz Tarea Programática.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-1866885698863427538?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/1866885698863427538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=1866885698863427538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1866885698863427538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1866885698863427538'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2011/11/aprobar-una-tarea-programaticamente.html' title='Aprobar una Tarea Programáticamente'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/--r_L0KyvB5g/Ts_APK0L2jI/AAAAAAAAANI/OMcj8OcWNZs/s72-c/Task1_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-7182701714683802714</id><published>2011-11-01T07:08:00.001-07:00</published><updated>2011-11-01T07:11:17.375-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='WebPart'/><category scheme='http://www.blogger.com/atom/ns#' term='ASCX'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView'/><title type='text'>Video con SharePoint 2010</title><content type='html'>&lt;p align="justify"&gt;&lt;br&gt;Hola de nuevo. Lo primero comentar sobre una gran falencia de nuestra querida plataforma, y es el no poder embeber con facilidad vídeo dentro de campos de tipo Rich HTML. Una gran falencia porque debería ser algo natural de hacer, y no se puede. No voy a entrar en detalles, pero por ejemplo les dejo una muestra, de todo lo que toca hacer para embeber video en una entrada de Blog de SharePoint 2010.&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/b/sharepointdesigner/archive/2009/12/11/video-blogging-with-javascript-and-the-media-web-part.aspx"&gt;http://blogs.msdn.com/b/sharepointdesigner/archive/2009/12/11/video-blogging-with-javascript-and-the-media-web-part.aspx&lt;/a&gt;  &lt;p align="justify"&gt;Así sucesivamente si se navega por internet buscando soluciones, ninguna es simple, y siempre tocará hacer unos cuantos pasos.  &lt;p align="justify"&gt;Ahora bien, más allá de eso esta entrada quiere mostrarles cómo usar la WebPart de Media que SharePoint Server 2010 nos ofrece como mecanismo para presentar vídeo y audio. Esta WebPart aparentemente tiene una limitación, y es que para el usuario final, solo le permitirá establecer "rígidamente" el vínculo a un vídeo o archivo de audio, sin permitir ningún tipo de interacción dinámica. Recuerden siempre el cliente quiere una presentación de vídeo tipo YouTube, no un único vídeo preestablecido.  &lt;p align="justify"&gt;Lo comentado al inicio de esta entrada va directamente relacionado con esto, porque lo primero que los clientes quieren es, por ejemplo, embeber vídeo en cuerpos de Noticias, en entradas de Blog, y en general tener canales de vídeo, tipo YouTube.  &lt;p align="justify"&gt;Entonces, luego de tanta palabra, pongamos manos a la obra:  &lt;ul&gt; &lt;li&gt; &lt;p align="justify"&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Desarrollando la lógica de negocio&lt;/strong&gt;&lt;/font&gt;: El método a continuación que se explica, puede meterse en un proyecto de biblioteca de clases. &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;blockquote&gt; &lt;p align="justify"&gt;El siguiente método tiene como objetivo conectarse a una biblioteca de Media y desplegar el listado de Vídeos, que se filtran a través de una vista de dicha biblioteca.  &lt;p align="justify"&gt;La vista es una excelente técnica cuando por ejemplo se quiere limitar a una cantidad de ítems, ordenarlos, agruparlos, y en general poder tener los ítems listos para ser consumidos a través de código .NET.  &lt;p align="justify"&gt;Lo primero que tenemos a continuación es la rutina en C#, que a través del modelo de objetos administrado retorna la lista genérica con los ítems consultados de la vista de esa biblioteca de media de SharePoint.&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p align="left"&gt;public IList&amp;lt;TGVideo&amp;gt; GetVideos(string listName, string viewName)&lt;br&gt;{&lt;br&gt;IList&amp;lt;TGVideo&amp;gt; videos = new List&amp;lt;TGVideo&amp;gt;();&lt;br&gt;TGVideo video = null;&lt;br&gt;SPSecurity.RunWithElevatedPrivileges(delegate()&lt;br&gt;{&lt;br&gt;using (SPSite site = new SPSite(SPContext.Current.Site.Url))&lt;br&gt;{&lt;br&gt;using (SPWeb web = site.OpenWeb())&lt;br&gt;{&lt;br&gt;SPList list = web.Lists[listName];&lt;br&gt;if (list != null)&lt;br&gt;{&lt;br&gt;try&lt;br&gt;{&lt;br&gt;SPView view = list.Views[viewName];&lt;br&gt;SPListItemCollection items = list.GetItems(view);&lt;br&gt;foreach (SPListItem item in items)&lt;br&gt;{&lt;br&gt;video = new TGVideo();&lt;br&gt;video.Title = item.Name.Split('.')[0];&lt;br&gt;video.UrlVideo = "/paginas/videos.aspx?video=" + item.Name;&lt;br&gt;if (item["AlternateThumbnailUrl"] != null)&lt;br&gt;video.Thumbnail = ((SPFieldUrlValue)item["AlternateThumbnailUrl"]).Url;&lt;br&gt;else&lt;br&gt;video.Thumbnail = "/_layouts/images/VideoPreview.png";&lt;br&gt;videos.Add(video);&lt;br&gt;}&lt;br&gt;}&lt;br&gt;catch (Exception ex)&lt;br&gt;{&lt;br&gt;EventLog log = new EventLog();&lt;br&gt;if (!(log.Source == "Errores WebPart"))&lt;br&gt;log.Source = "Errores WebPart";&lt;br&gt;log.WriteEntry("Error en el Método GetVideos: " + ex.Message + "- InnerException: " + ex.InnerException + "- Source: " + ex.Source + "- StackTrace: " + ex.StackTrace,&lt;br&gt;EventLogEntryType.Error, 1);&lt;br&gt;throw;&lt;br&gt;}&lt;br&gt;}&lt;br&gt;}&lt;br&gt;}&lt;br&gt;});&lt;br&gt;return videos;&lt;br&gt;}&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p align="justify"&gt;Lo primero que se aprecia es que el método retorna una lista genérica de elementos de tipo TGVideo. Dicha clase luce así:  &lt;p align="justify"&gt;public class TGVideo&lt;br&gt;{&lt;br&gt;private string title;&lt;br&gt;public string Title&lt;br&gt;{&lt;br&gt;get&lt;br&gt;{&lt;br&gt;return title;&lt;br&gt;}&lt;br&gt;set&lt;br&gt;{&lt;br&gt;title = value;&lt;br&gt;}&lt;br&gt;}&lt;br&gt;private string thumbnail;&lt;br&gt;public string Thumbnail&lt;br&gt;{&lt;br&gt;get&lt;br&gt;{&lt;br&gt;return thumbnail;&lt;br&gt;}&lt;br&gt;set&lt;br&gt;{&lt;br&gt;thumbnail = value;&lt;br&gt;}&lt;br&gt;}&lt;br&gt;private string urlVideo;&lt;br&gt;public string UrlVideo&lt;br&gt;{&lt;br&gt;get&lt;br&gt;{&lt;br&gt;return urlVideo;&lt;br&gt;}&lt;br&gt;set&lt;br&gt;{&lt;br&gt;urlVideo = value;&lt;br&gt;}&lt;br&gt;}&lt;br&gt;}&lt;/p&gt; &lt;p align="justify"&gt;El método recibe como parámetros el nombre de la lista e incluso el nombre de la vista que finalmente servirá para consultar los ítems.  &lt;p align="justify"&gt;Recordemos que una sitio de SharePoint hay usuarios que se loguean y tendrán privilegios de administración, pero otros de solo lectura. Esos usuarios de solo lectura son muy limitados, y si eso no se tiene en cuenta, las WebParts que construimos pueden fallar. Por tal razón es que toda la parte esencial del método se envuelve dentro de la rutina SPSecurity.RunWithElevatedPrivileges, que en términos generales permite ejecutar todo el código que encierra con permisos elevados.  &lt;p align="justify"&gt;La manera de instanciar objetos SPSite y SPWeb, es la mejor práctica usar USING. En este caso no se aprovecha obtener los objetos del contexto de SharePoint con la clase SPContext, porque SPSecurity.RunWithElevatedPrivileges no funciona así, por tal motivo es que esas instancias se obtienen de ese modo, y por lo tanto se hace DISPOSE formal con la clausula USING.  &lt;p align="justify"&gt;Luego se puede apreciar como se obtiene la lista a través de su nombre. Muy importante recordar que no es una buena práctica cuando se tiene muchas listas. Lo mejor será instanciar la lista a través de su ID para aumentar el rendimiento. Luego se obtienen los ítems desde la vista y a partir de ahí se itera para recuperar la información deseada a través de la clase de entidad TGVideo.  &lt;p align="justify"&gt;La página Video.aspx es la que servirá como contenedor o visor de los videos, más adelante se explica su funcionalidad.  &lt;p align="justify"&gt;Luego si quiere obtener el Thumbnail asociado al video se usa el campo con su nombre interno AlternateThumbnailUrl. En caso que no se haya establecido la ruta una imagen que sirva como thumbnail se usa la imagen por defecto de SharePoint, para tal caso se encuentra en la ruta: /_layouts/images/VideoPreview.png  &lt;p align="justify"&gt;Finalmente como manejo de errores se escribe una rutina que permita registrar los sucesos en el visor de eventos de Windows, nombrando la entrada como Errores WebPart.&lt;/p&gt;&lt;/blockquote&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Desarrollando la WebPart Visual&lt;/strong&gt;&lt;/font&gt;: Las WebParts visuales son un concepto y técnica esperado desde hace ya bastante tiempo, al menos desde que desarrollamos para SharePoint 2007. En esencia es una separación entre lógica de WebPart (eventos) y presentación (HTML y Codebehind), a través de una clase que hereda de la clase WebPart y otra que es básicamente un control de usuario ASCX. Muy importante recordar que cuando vayan a crear el proyecto de tipo SharePoint 2010 en VS.NET 2010, deben configurarlo como un deploy de tipo FARM. Las WebParts visuales no pueden ser desplegadas como tipo SandBox. En este caso se asume que se va a agregar al proyecto de tipo SharePoint 2010 un nuevo ítem de tipo WebPart visual llamado VideosPart.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align="justify"&gt;En el HTML del control ASCX tendremos lo siguiente:&lt;/p&gt; &lt;p&gt;&amp;lt;div&amp;gt;&lt;br&gt;&amp;lt;asp:GridView ID="grvVideos" CellSpacing="10" CellPadding="5" runat="server" GridLines="None" ShowHeader="false" AutoGenerateColumns="false"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Columns&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TemplateField&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ItemTemplate&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href='&amp;lt;%#Eval("UrlVideo")%&amp;gt;'&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Image ID="imgThumbnail" ImageUrl='&amp;lt;%#Eval("Thumbnail")%&amp;gt;' runat="server" Width="120" Height="90" BorderWidth="0" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/a&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ItemTemplate&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:TemplateField&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TemplateField&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ItemTemplate&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Label ID="lblTitle" runat="server" Text='&amp;lt;%#Eval("Title")%&amp;gt;' /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href='&amp;lt;%#Eval("UrlVideo")%&amp;gt;'&amp;gt;Ver Video&amp;lt;/a&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ItemTemplate&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:TemplateField&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Columns&amp;gt;&lt;br&gt;&amp;lt;/asp:GridView&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Label ID="lblMessage" runat="server" /&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;/p&gt; &lt;p align="justify"&gt;En esencia cada Eval() hace llamado a las propiedades definidas en la clase de entidad TGVideo.&lt;/p&gt; &lt;p align="justify"&gt;Ahora bien, el codebehind del control ASCX deberá tener lo siguiente:&lt;/p&gt; &lt;p&gt;private TGServices services = null;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string listName;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string ListName&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return listName; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { listName = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string viewName;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string ViewName&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return viewName; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { viewName = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void Page_Load(object sender, EventArgs e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.lblMessage.Text = "";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!Page.IsPostBack)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; services = new TGServices();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IList&amp;lt;TGVideo&amp;gt; videos = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; videos = services.GetVideos(listName, viewName);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; grvVideos.DataSource = videos;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; grvVideos.DataBind();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception ex)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.lblMessage.Text = "Se ha presentado un error cargando la información: " + ex.Message;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (grvVideos.Rows.Count == 0 || videos == null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.lblMessage.Text = "Actualmente no hay información para desplegar en este elemento.";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;Si se fijan es muy poco código, porque toda la complejidad se delegó en la capa de negocio. Lo primero es una instancia de la clase que contendrá el método que se explicó de la lógica de negocio. En este ejemplos e asume que dicha clase se llama TGServices. Luego se definen 2 propiedades que servirán como puente de comunicación entre la clase WebPart y el con trol ASCX. Para este caso la WebPart proporcionará como propiedades configurables el nombre de la lista y de la vista. Y Finalmente se invoca el método que retorna los videos en forma de lista genérica que se pasa como fuente de datos al GridView.&lt;/p&gt; &lt;p&gt;Finalmente así lucirá el código de la clase WebPart:&lt;/p&gt; &lt;p&gt;[Personalizable(), WebBrowsable, Category("Configuración"), WebDisplayName("Nombre de la Lista")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String ListName { get; set; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Personalizable(), WebBrowsable, Category("Configuración"), WebDisplayName("Nombre de la Vista")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String ViewName { get; set; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Visual Studio might automatically update this path when you change the Visual Web Part project item.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private const string _ascxPath = @"~/_CONTROLTEMPLATES/Familia.WebParts/VideosPart/VideosPartUserControl.ascx";&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void CreateChildControls()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Control control = Page.LoadControl(_ascxPath);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((VideosUserControl)control).ListName = ListName;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((VideosUserControl)control).ViewName = ViewName;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Controls.Add(control);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;Se aprecia que las propiedades definidas en el code behind del control de usuario son usadas para pasar dichos valores desde la clase de tipo WebPart.&lt;/p&gt; &lt;p&gt;Hasta este punto tenemos ya lista la WebPart visual que consume y despliega un listado de Videos. Pero como ya se explicó, la URL configurada al hacer clic sobre el thumbnail o la opción Ver Video de la WebPart, lleva a una página llamada Videos.aspx. Como se pudo observar es una página que se ha creado en una biblioteca llamada Páginas de SharePoint. La página Videos.aspx se ha creado como una Página con WebParts. En esa página se deberá agregar un DIV de esta forma, por ejemplo en el Place Holder Main:&lt;/p&gt; &lt;p&gt;&amp;lt;div id="divMediaWebpart"&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;/p&gt; &lt;p&gt;El único objetivo del DIV anterior es ser el contenedor de lo que será la WebPart de Media de SharePoint 2010, agregada dinámicamente.&lt;/p&gt; &lt;p&gt;Luego si se quiere agregando una WebPart de Editor de contenido, o directamente en el HTML de la página a través de SharePoint Designer 2010, agregar el siguiente JavaScript:&lt;/p&gt; &lt;p&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(document).ready(function() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var videoHolder = document.getElementById('divMediaWebpart'); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mediaPlayer.createMediaPlayer(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; videoHolder, videoHolder.id, '640px', '390px',&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; displayMode: 'Inline',&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mediaTitle: '',&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mediaSource: '/Videos/' + getQuerystring('video',''),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; previewImageSource:'/_layouts/images/VideoPreview.png',&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; autoPlay: true,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loop: false,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mediaFileExtensions:'wmv;wma;avi;mpg;mp3;',&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; silverlightMediaExtensions:'wmv;wma;mp3;'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;br&gt;&lt;/p&gt; &lt;p&gt;Muy importante a tener en cuenta los siguiente:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;El JavaScript anterior solo funciona agregando la siguiente referencia, bien sea directamente en la página o en la página maestra del sitio: &amp;lt;script type="text/javascript" src="/_layouts/mediaplayer.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt; &lt;li&gt;El JavaScript usa una función que permite leer valores pasados por QueryString cuya implementación es similar a esto:  &lt;p&gt;function getQuerystring(key, default_)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp; if (default_==null) default_=""; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");&lt;br&gt;&amp;nbsp;&amp;nbsp; var regex = new RegExp("[\\?&amp;amp;]"+key+"=([^&amp;amp;#]*)");&lt;br&gt;&amp;nbsp;&amp;nbsp; var qs = regex.exec(window.location.href);&lt;br&gt;&amp;nbsp;&amp;nbsp; if(qs == null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return default_;&lt;br&gt;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return qs[1];&lt;br&gt;}&lt;/p&gt; &lt;p&gt;La función anterior en el JavScript de la página Videos.aspx estaría esperando un nombre de parámetro llamado video, que en esencia trae el nombre del video junto a su extensión. Dichos Videos deberán alojarse en una biblioteca de Media llamada Videos.&lt;/p&gt; &lt;li&gt;Debido a que se hace uso de algunas opciones de JQuery, es también obligatorio adicionar una referencia a la librería respectiva, por ejemplo en la página maestra lo siguiente:  &lt;p&gt;&amp;lt;script type="text/javascript" src="/SiteAssets/JS/jquery-1.4.3.min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Con lo anterior se puede disfrutar de una página que despliega Video dinámicamente así:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;WebPart desplegando el listado de Videos:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-ygY2CFo1etE/Tq_9W2wIK2I/AAAAAAAAAMY/NuXDcexdZlE/s1600-h/VideoPart%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="VideoPart" border="0" alt="VideoPart" src="http://lh4.ggpht.com/-7H8UUZVaT58/Tq_9XfjLBCI/AAAAAAAAAMg/s8uUxU7SRXA/VideoPart_thumb.png?imgmax=800" width="244" height="98"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Luego al hacer clic en Ver Video o en el thumbnail se hace un redirect a la página ya explicada Videos.aspx:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-F_N8LFF6T8U/Tq_9YOhYdeI/AAAAAAAAAMo/qUwxdzlvBqI/s1600-h/Video%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Video" border="0" alt="Video" src="http://lh3.ggpht.com/-Ce00NP1AAdo/Tq_9YpppEWI/AAAAAAAAAMw/s2i_yRqv5-Y/Video_thumb.png?imgmax=800" width="244" height="208"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Feliz video player!!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-7182701714683802714?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/7182701714683802714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=7182701714683802714' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/7182701714683802714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/7182701714683802714'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2011/11/video-con-sharepoint-2010.html' title='Video con SharePoint 2010'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-7H8UUZVaT58/Tq_9XfjLBCI/AAAAAAAAAMg/s8uUxU7SRXA/s72-c/VideoPart_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-2133114371940086914</id><published>2011-09-21T15:27:00.000-07:00</published><updated>2011-09-21T15:30:28.287-07:00</updated><title type='text'>SharePoint 2010 Web Content Management</title><content type='html'>Este video merece la pena ser divulgado, excelente presentación del tema.&lt;br /&gt;&lt;br /&gt;&lt;iframe style="height:288px;width:512px" src="https://channel9.msdn.com/Blogs/matthijs/Web-Content-Management-in-SharePoint-2010/player?w=512&amp;h=288" frameBorder="0" scrolling="no" &gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Feliz wcm!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-2133114371940086914?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/2133114371940086914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=2133114371940086914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/2133114371940086914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/2133114371940086914'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2011/09/sharepoint-2010-web-content-management.html' title='SharePoint 2010 Web Content Management'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-215330960528511818</id><published>2011-09-21T14:01:00.001-07:00</published><updated>2011-09-21T14:18:53.691-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='access denied'/><category scheme='http://www.blogger.com/atom/ns#' term='addcontentdb'/><category scheme='http://www.blogger.com/atom/ns#' term='stsadm'/><title type='text'>AddContentDB Access Denied Error</title><content type='html'>Hola de nuevo. Se me han ido creo que aproximadamente entre probando, leyendo blogs, tomando café, y bueno, unas cuantas cosas más, unas 12 a 14 hrs de mí tiempo, tratando de hacer lo siguiente:&lt;br /&gt;&lt;br /&gt;1. Mi cliente quiere renombrar la base de datos de contenido de la administración central: Por ejemplo de esto, SharePoint_AdminContent_66877b93-3d3a-4dd1-b90f-399670de5e7b a esto SharePoint_AdminContent, y tiene razón, ese nombre con ese GUID da escalofrios.&lt;br /&gt;&lt;br /&gt;2. Es de un cuidado extremo esta tarea, porque entre los pasos, se debe desasociar la BDs de Contenido de nada menos y nada más que la Administración Central. Por eso hagan Backup!!&lt;br /&gt;&lt;br /&gt;3. Pero entre tanto blog, entre tanto Foro, puedo ver de regreso a gente descuidada, que finalmente ayuda a medias. &lt;br /&gt;&lt;br /&gt;4. Lo que ocurre es que por algún motivo al ejecutar el comando del STSADM, por ejemplo:&lt;br /&gt;&lt;br /&gt;C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\BIN&gt;stsa&lt;br /&gt;dm -o addcontentdb -url http://centraladminsite:puerto -databasename  SharePoint_AdminContent&lt;br /&gt;&lt;br /&gt;De donde lo que se evidencia es la intención de volver a asociar la BDs de contenido nueva con el sitio de Administración Central, produce un error de Acceso negado.&lt;br /&gt;&lt;br /&gt;El blog con los pasos pero incompleto es este: http://guru-web.blogspot.com/2007/03/renaming-central-admin-content-database.html&lt;br /&gt;&lt;br /&gt;El foro que me motivó a la solución es este: http://www.office-outlook.com/outlook-forum/index.php/m/672431/&lt;br /&gt;&lt;br /&gt;Pero aun se quedan incompletos, porque seguirá dando error de Acceso Negado hasta que no se detenga el servicio de Windows llamado Windows SharePoint Services Timer y se vuelva a iniciar.&lt;br /&gt;&lt;br /&gt;Al final la administración central deberá funcionar y quedar asociada a una BDs de contenido re-bautizada, digamos con un nombre más elegante.&lt;br /&gt;&lt;br /&gt;Felíz re-bautizo&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-215330960528511818?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/215330960528511818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=215330960528511818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/215330960528511818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/215330960528511818'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2011/09/addcontentdb-access-denied-error.html' title='AddContentDB Access Denied Error'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-1896555053384431552</id><published>2011-09-14T17:35:00.001-07:00</published><updated>2011-09-14T17:40:39.889-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='_spBodyOnLoadFunctionNames'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint'/><title type='text'>SharePoint answers</title><content type='html'>Hola de nuevo. De casualidad entré  a un enlace de Twitter y llegué a un sitio bastante interesante de SharePoint. Es una especie de Foro on steroids, y navegando dí con una pregunta, la cual en unos 10 minutos, lei, probé en SharePoint 2010 y pude entregarle una respuesta al autor. De paso revisen el JavaScriopt de ese genio porque está bastante bueno, es algo así como para detectar si tenes Silverligth instalado.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sharepoint.stackexchange.com/questions/19318/issue-with-editing-sharepoint-page/19369#19369"&gt;Question&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Felíz answer!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-1896555053384431552?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/1896555053384431552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=1896555053384431552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1896555053384431552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1896555053384431552'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2011/09/hola-de-nuevo.html' title='SharePoint answers'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-7791815314389701757</id><published>2011-09-12T06:20:00.000-07:00</published><updated>2011-09-12T06:34:44.132-07:00</updated><title type='text'>SharePoint Microsoft Community Specialist</title><content type='html'>Hace varios años que vengo colaborando y ayudando en muchos temas a la comunidad Microsoft. Ahora me llegan a la mente INETA, Celulas Microsoft, Influencers, y bueno, charlas y particpación en eventos, donde llama la atención el interés de Microsoft por promover sus tecnologías, pero tratando de hacerlo bien, y llegando de la mejor manera a su amplia comunidad de desarrolladores.&lt;br /&gt;&lt;br /&gt;Ahora me llega un nuevo reto, que Microsoft lo ha llamado "Especialista de comunidad", en mí caso, por un interés grande en SharePoint, y que espero a través de estos canales de Web 2.0 seguir aportando con algo para que exista información y soluciones puntuales a problemáticas, nuevas ideas, y en general tela de donde cortar sobre la plataforma SharePoint.&lt;br /&gt;&lt;br /&gt;Gracias a Microsoft por este nuevo reconocimiento y al buen amigo &lt;a href="http://blogs.msdn.com/b/warnov/archive/2011/08/24/convi-233-rtete-en-un-microsoft-community-specialist-beta-program.aspx"&gt;Walter Novoa&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-7791815314389701757?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/7791815314389701757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=7791815314389701757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/7791815314389701757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/7791815314389701757'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2011/09/sharepoint-microsoft-community.html' title='SharePoint Microsoft Community Specialist'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-1135990895771751144</id><published>2011-09-09T15:38:00.000-07:00</published><updated>2011-09-09T15:46:38.345-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASCX'/><category scheme='http://www.blogger.com/atom/ns#' term='WebParts'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2007'/><category scheme='http://www.blogger.com/atom/ns#' term='WSPBuilder'/><title type='text'>WebPart ASCX en SharePoint 2007 con WSP Builder</title><content type='html'>Hola de nuevo. A continuación les comparto una de mis demostraciones de los pasos básicos a seguir cuando queremos crear una WebPart con un control de usuario ASCX para SharePoint 2007.&lt;br /&gt;&lt;br /&gt;Esto tiene ventajas obvias sobre la creación de WebParts que requieren la implementación manual y agregación de cada control a renderizar y por supuesto programar a nivel de eventos en la WebPart.&lt;br /&gt;&lt;br /&gt;El ejemplo hace uso de Visul Studio .NET 2008, &lt;a href="http://wspbuilder.codeplex.com/"&gt;WSPBuilder&lt;/a&gt; y MOSS 2007. Esto también podría hacerse para WSS 3.0 sin ningún problema. WSPBuilder es la herramienta recomendada para las tareas de desarrollo sobre SP 2007.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="420" height="345" src="http://www.youtube.com/embed/UBNvQEiyU9U" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-1135990895771751144?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/1135990895771751144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=1135990895771751144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1135990895771751144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1135990895771751144'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2011/09/webpart-ascx-en-sharepoint-2007-con-wsp.html' title='WebPart ASCX en SharePoint 2007 con WSP Builder'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/UBNvQEiyU9U/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-5480648027323590163</id><published>2011-09-08T20:15:00.000-07:00</published><updated>2011-09-11T16:28:51.611-07:00</updated><title type='text'>SharePoint en el lado del cliente - JQuery</title><content type='html'>Suelo hablar poco de las tecnologías y menos tratar de filosofar, prefiero remitirlos a los "gurus" y por supuesto a algún buen libro.&lt;br /&gt;&lt;br /&gt;Lo real es que SharePoint 2010 cuenta con capacidad directa para soportar cosas bien interesantes, entre las que podemos citar el uso de JQuery, REST, JSON, modelo de objetos del lado del cliente, entre otros aspectos interesantes que nos estan beneficiando directamente a los desarrolladores.&lt;br /&gt;&lt;br /&gt;A continuación les dejo un sencillo ejemplo que tiene por objetivo leer información de una lista de tipo calendario y presentar las fechas de cumpleaños y festivos qe ahi se han definido, haciendo uso de un poco de JQuery.&lt;br /&gt;&lt;br /&gt;&lt; script type="text/javascript" &gt;&lt;br /&gt;$(document).ready(function() &lt;br /&gt;{&lt;br /&gt;    $.getJSON("http://urlsitosharepoint/_vti_bin/ListData.svc/Calendario",function(data) {&lt;br /&gt;            var count = 0;&lt;br /&gt;     var fechaActual=new Date();&lt;br /&gt;            var diaActual = fechaActual.getUTCDate()-1;&lt;br /&gt;            var mesActual = fechaActual.getMonth()+1;&lt;br /&gt;            var anioActual = fechaActual.getFullYear();&lt;br /&gt;            var eventos = "false";&lt;br /&gt;            $('#resultarea').text("");&lt;br /&gt;&lt;br /&gt;            $.each(data.d.results, function(i,result) {&lt;br /&gt;                &lt;br /&gt;  var tmpInicio = eval(result.HoraDeInicio.replace(/\/Date\((\d+)\)\//gi, "new  Date($1)"));&lt;br /&gt;&lt;br /&gt;                var dia = tmpInicio.getUTCDate()-1;&lt;br /&gt;                var mes = tmpInicio.getMonth()+1;&lt;br /&gt;                var anio = tmpInicio.getFullYear();&lt;br /&gt;&lt;br /&gt;  if(diaActual==dia &amp;&amp; mesActual == mes &amp;&amp; anioActual==anio)&lt;br /&gt;  { &lt;br /&gt;   &lt;br /&gt;   html = "&lt;table&gt; &lt;tr&gt;&lt;td&gt;&lt;b&gt;Hoy " + result.Título +"&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;";&lt;br /&gt;                 $('#resultarea').append($(html));&lt;br /&gt;                        eventos="true";&lt;br /&gt;  }&lt;br /&gt;                                      &lt;br /&gt;            });&lt;br /&gt;            &lt;br /&gt;            if(eventos == "false")&lt;br /&gt;                {&lt;br /&gt;                 $('#resultarea').text("Sin eventos el día de hoy");&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     });&lt;br /&gt;&lt;br /&gt;});&lt; /script &gt;&lt; div id="resultarea" &gt;&lt; / div &gt;&lt;br /&gt;&lt; div &gt;&lt; a href="/Lists/Calendario/calendar.aspx"&gt;Ver todos &lt; / a &gt;&lt;/ div&gt;&lt;br /&gt;&lt;br /&gt;Lo primero que se debe notar es la llamada a ListData.svc, ahi prácticamente está lo interesante que ofrece SP 2010. Para no decir más revisen &lt;a href="http://msdn.microsoft.com/en-us/library/ff798339.aspx"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Luego JQuery llega al rescate, como ha venido haciéndolo desde hace un tiempo acá, y bueno nos provee el mecanismo getJSON para comunicarnos con el servidor &lt;a href="http://api.jquery.com/jQuery.getJSON/"&gt;así&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;El resto amigos creo que es muy conocido por todos, uso de JavaScript común y corriente. Interesante de todo eso la linea var tmpInicio = eval(result.HoraDeInicio.replace(/\/Date\((\d+)\)\//gi, "new  Date($1)"));&lt;br /&gt;donde logramos tomar la columna HoraDeInicio de la lista Calendario, y bueno la muy obvia Título con el objeto pertinente del recorrido del ciclo each: result.Título.&lt;br /&gt;&lt;br /&gt;Es evidente que esto tiene grandes ventajas, cero deploy en el servidor, cero interacción con los cara dura de IT, rapida manipulación de data sin tanto problema: solo un poco de JQUERY, JavaScript y típico HTML.&lt;br /&gt;&lt;br /&gt;Feliz client programming.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-5480648027323590163?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/5480648027323590163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=5480648027323590163' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/5480648027323590163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/5480648027323590163'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2011/09/sharepoint-en-el-lado-del-cliente.html' title='SharePoint en el lado del cliente - JQuery'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-4210280786890255096</id><published>2011-08-05T11:46:00.000-07:00</published><updated>2011-08-05T12:11:33.097-07:00</updated><title type='text'>SharePoint y OBAs Part II</title><content type='html'>De regreso y avanzando con esta serie de entradas relacionadas a soluciones de SharePoint que involucran una WebPart e interacción con un cliente Office como Excel, voy a seguir dejándoles algunos ejemplos de código que he usado para esto.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dotnetsofi.blogspot.com/2011/08/sharepoint-2007-y-obas.html"&gt;Ver Parte I&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Qué se debe hacer cuando necesitamos obtener las vistas que pertenecen a una lista específica?&lt;br /&gt;&lt;br /&gt;public IList &lt; TGLista &gt; GetViews(Guid idList)&lt;br /&gt;        {&lt;br /&gt;            SPWeb webList = this.GetWebByIdList(idList);&lt;br /&gt;            if (webList != null)&lt;br /&gt;            {&lt;br /&gt;                TGLista vista = null;&lt;br /&gt;                IList&lt;TGLista&gt; vistas = new List&lt;TGLista&gt;();&lt;br /&gt;                SPList listaTemp = null;&lt;br /&gt;                try&lt;br /&gt;                {&lt;br /&gt;                    listaTemp = webList.Lists[idList];&lt;br /&gt;                    foreach (SPView temp in listaTemp.Views)&lt;br /&gt;                    {&lt;br /&gt;                        vista = new TGLista();&lt;br /&gt;                        vista.Id = temp.ID;&lt;br /&gt;                        vista.Titulo = temp.Title;&lt;br /&gt;                        vistas.Add(vista);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                catch (SPException ex)&lt;br /&gt;                {&lt;br /&gt;                    throw;&lt;br /&gt;                }&lt;br /&gt;                catch (Exception ex)&lt;br /&gt;                {&lt;br /&gt;                    throw;&lt;br /&gt;                }&lt;br /&gt;                finally&lt;br /&gt;                {&lt;br /&gt;                    if (webList != null)&lt;br /&gt;                        webList.Dispose();&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                if (vistas != null)&lt;br /&gt;                {&lt;br /&gt;                    //Hace un ordenamiento ASCENDENTE de la lista&lt;br /&gt;                    var list = from temp in vistas&lt;br /&gt;                               orderby temp.Titulo&lt;br /&gt;                               select temp;&lt;br /&gt;                    return list.ToList();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;Nuevamente se aprecia el uso de una clase entidad para almacenar la información a pasar entre capas usando una colección genérica de dichos objetos.&lt;br /&gt;&lt;br /&gt;Quizá lo que más rescato como buena práctica del método anterior es que si se fijan, el método recibe por parámetro el ID de la lista para la cual queremos obtener sus vistas. No el nombre de la lista (string) o su índice dentro de alguna colección, que puede ser un entero. No se recibe su GUID que es la técnica mejor considerada cuando uno quiere referirse a una lista de SharePoint. La razón que más me gusta y que resguarda las soluciones de problemas "tontos", es que aunque los usuarios finales cambien el nombre de la lista (título o caption), el ID interno se conserva, y eso ya evita que el código quede "débil". Si el usuario borra su lista, apague y vámonos, ahí no hay anda que hacer, pero bueno eso ya son situaciones que se corrigen con un buen entrenamiento y conocimiento de los usuarios de las soluciones.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Un poco de CAML, como buena práctica no le cae mal a una solución SharePoint 2007.&lt;br /&gt;&lt;br /&gt;private SPListItem GetItemByTitle(string titulo)&lt;br /&gt;        {&lt;br /&gt;            SPWeb web = SPContext.Current.Site.RootWeb;&lt;br /&gt;            SPQuery query = new SPQuery();&lt;br /&gt;            query.Query = "&lt;Where&gt;&lt;Eq&gt;&lt;FieldRef Name='Title' /&gt;&lt;Value Type='Text'&gt;" + titulo + "&lt;/Value&gt;&lt;/Eq&gt;&lt;/Where&gt;";&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                SPList list = web.Lists["Objetivos KPI"];&lt;br /&gt;                foreach (SPListItem item in list.GetItems(query))&lt;br /&gt;                {&lt;br /&gt;                    return item;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            catch (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                throw;&lt;br /&gt;            }&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;Lo único más interesante a rescatar es el uso de la consulta CAML que lo único que hace es filtrar los ítems de la lista por un título dado. De aquí solamente quiero decirles que usen herramientas como &lt;a href="http://www.u2u.net/res/Tools/CamlQueryBuilder.aspx"&gt;CAML Builder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y qué pasa cuando quiero guardar un archivo generado por la solución en una biblioteca de SharePoint?&lt;br /&gt;&lt;br /&gt;public void SaveLibrary(string file,Stream stream,Guid idList)&lt;br /&gt;        {&lt;br /&gt;            SPFolder spFolder = null;&lt;br /&gt;            SPFile spFileTemp = null;&lt;br /&gt;            TGServices services = new TGServices();&lt;br /&gt;            SPListItem item = null;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                SPSecurity.RunWithElevatedPrivileges(delegate()&lt;br /&gt;                {&lt;br /&gt;                    using (SPWeb web = this.GetWebByIdList(idList))&lt;br /&gt;                    {&lt;br /&gt;                        web.AllowUnsafeUpdates = true;&lt;br /&gt;                        spFolder = web.Folders["Plantillas Excel"];&lt;br /&gt;                        spFileTemp = spFolder.Files.Add(file, stream, true);&lt;br /&gt;                        spFolder.Update();&lt;br /&gt;                        item = spFileTemp.Item;&lt;br /&gt;                        item.UpdateOverwriteVersion();&lt;br /&gt;                        web.AllowUnsafeUpdates = false;&lt;br /&gt;                    }&lt;br /&gt;                });&lt;br /&gt;            }&lt;br /&gt;            catch (SPException ex)&lt;br /&gt;            {&lt;br /&gt;                throw;&lt;br /&gt;            }&lt;br /&gt;            catch (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                throw;&lt;br /&gt;            }&lt;br /&gt;            finally&lt;br /&gt;            {&lt;br /&gt;                if (stream != null)&lt;br /&gt;                    stream.Close();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;Y para usar el método anterior podría tenerse algo similar:&lt;br /&gt;&lt;br /&gt;FileInfo fileToLibrary = null;&lt;br /&gt;                try&lt;br /&gt;                {&lt;br /&gt;                    fileToLibrary = new FileInfo(file);&lt;br /&gt;                    link = services.SaveLibrary(file, fileToLibrary.OpenRead(), new Guid(IdLista));&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lo primero que el método recibe es el nombre de un archivo por ejemplo miarchivo.xlsx. Luego lo más importante recibe un Stream, en el ejemplo anterior se muestra cómo crear dicho stream y pasárselo al método en modo openRead(). Y finalmente pasar el ID de la lista, que quizá nos sirva como fuente para obtener el sitio de ejecución del proceso.&lt;br /&gt;&lt;br /&gt;Muy importante la línea                 SPSecurity.RunWithElevatedPrivileges(delegate()&lt;br /&gt;porque ejecuta el proceso de guardar a la biblioteca de documentos Plantillas Excel en un modo de privilegios elevados, así no tener problemas de acceso negado si el usuario ejecutando la solución no tiene suficientes permisos sobre la biblioteca. &lt;br /&gt;&lt;br /&gt;Y siendo el resto de código algo entendible, lo realmente importante es dejar la seguridad de la ejecución como estaba                         web.AllowUnsafeUpdates = false;&lt;br /&gt;Eso indica que solo ese tramo del código fue elevado, el resto de la ejecución continuará con los permisos del usuario que está ejecutando la solución.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Feliz coding!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-4210280786890255096?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/4210280786890255096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=4210280786890255096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/4210280786890255096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/4210280786890255096'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2011/08/sharepoint-y-obas-part-ii.html' title='SharePoint y OBAs Part II'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-1745729984091781218</id><published>2011-08-04T07:38:00.000-07:00</published><updated>2011-08-04T08:32:16.264-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitectura'/><category scheme='http://www.blogger.com/atom/ns#' term='WebParts'/><category scheme='http://www.blogger.com/atom/ns#' term='Planeación'/><category scheme='http://www.blogger.com/atom/ns#' term='Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='Metadata Administrada'/><category scheme='http://www.blogger.com/atom/ns#' term='Gestión Documental'/><category scheme='http://www.blogger.com/atom/ns#' term='Taxonomía'/><title type='text'>Arquitectura SharePoint</title><content type='html'>Creo que para todos los que nos movemos en proyectos que involucran a la plataforma SharePoint, teniendo en mente proyectos de un tamaño mediano a grande. Es un hecho la necesidad de tener una arquitectura y una planificación en general de lo que va a ser la solución en términos de los requerimientos del negocio. Con SharePoint 2010, los elementos de arquitectura a considerar siguen siendo los mismos básicos de la plataforma empresarial 2007. Pero cuando uno revisa en detalle la nueva versión, comienza a encontrar elementos que han sido totalmente rediseñados, y es muy importante tener elementos de donde poder arrancar para poder establecer nuestras arquitecturas iniciales.&lt;br /&gt;&lt;br /&gt;En el repositorio de Microsoft hay un gran número de documentos, artículos, gráficos, en fin, mucha información, que personalmente pienso debería haber sido organizada de otro modo, y ser un poco más descriptiva y práctica. Pero siendo eso lo que tenemos de primera mano para planear las primeras etapas de la arquitectura, no está demás arrancar por ahí. Lo que uno si nota es que al menos eso da una idea de los elementos primarios que uno debe considerar en una arquitectura de una solución SharePoint, por ejemplo: Planeación de sitios, Planeación de Seguridad, Planeación de Aplicaciones de Servicio (nuevo en SP 2010), y en general planeación de los elementos que van a impactar sobre las necesidades del negocio: gestión documental, gestión de contenido web, inteligencia de negocio, interacción social, entre otros.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc261834.aspx"&gt;Planning and Architecture&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Específicamente cuando se va a realizar una planeación y arquitectura para un tema como Gestión Documental, en SP 2010 aparecen elementos muy importantes, que deberán tenerse muy en cuenta para implementar una verdadera solución de gestión documental con SharePoint. Aparecen aplicaciones de servicio como es la de Metadata Administrada. Esto habilita posibilidades que no existían en SP 2007, como por ejemplo poder tener verdaderas taxonomías de información. Almacenes de términos, sinónimos, centros de registros, tag sociales, conjuntos de documentos, IDs de documentos, HUBs de tipos de contenido, y muchos otros elementos, van atados a este nuevo servicio empresarial. Si realmente se requiere una solución de gestión documental lo suficientemente avanzada, un arquitecto mínimamente deberá entender todos los conceptos subyacentes y por supuesto tener idea cómo se implementan y usan en SP 2010. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ee530389.aspx"&gt;Metadata Administrada&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Otro elemento esencial en la planeación y arquitectura de una solución SharePoint es un Plan de Gobierno. Esto para muchas empresas llega a ser un tema nuevo, pero si la empresa es grande, tiene la plataforma SP y no tiene políticas y estándares para la misma implementados, antes de hacer nada debería iniciar a crear un Plan de Gobierno. Esto termina siendo un documento donde se consignan las "leyes" que absolutamente todo el mundo en la organización deberá respetar y cumplir. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ff598584.aspx"&gt;Plan de Gobierno&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Quiero hacer claridad en que no se debe desmeritar todo esto en soluciones más pequeñas, pero bueno, un arquitecto debe poner en la balanza, soluciones, presupuestos, tiempos, y en general los recursos de cada proyecto, para ver si ameritan contemplar todos estos elementos. Es lo ideal tener en cuenta todo esto, pero requiere tiempo y eso significa dinero.&lt;br /&gt;&lt;br /&gt;Todo lo anterior es la globalidad de las cosas o elementos que las necesidades de negocio van a requerir de una solución SharePoint. Pero llegan a terrenos más personales, qué hay de la arquitectura de desarrollos .NET para SharePoint?&lt;br /&gt;&lt;br /&gt;Lo primero que una Arquitecto SharePoint que tenga dentro de sus soluciones implementar elementos con la plataforma .NET para SharePoint debe conocer es lo que Microsoft ya ha preparado como una vista rápida de los elementos arquitectónicos que se deberán tener en cuenta para los desarrollos o personalizaciones sobre SharePoint 2010 específicamente, igual lo hay para las versiones anteriores.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=12323"&gt;Software development kit&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=23919"&gt;SharePoint Guidance&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Algo insólito, y pienso que no se hace en muchos casos es el uso de UML en proyectos .NET para SharePoint, al menos ningún libro, artículo, en general ningún "gurú" habla del tema. Más allá de los "monachos" UML, lo preocupante es la falta de propaganda de los patrones de diseño que una buena solución .NET para SharePoint mínimamente deberá implementar. Hablo de UML porque es nuestro lenguaje formal para dar a entender los patrones. De los cientos de libros de desarrollo que hay para SP 2010 y 2007, es ya aburridor y tentador para la hoguera, su insufrible repetición de lo mismo con distintas palabras de lo que todos ya sabemos: WebParts, receptores de eventos, listas, bibliotecas, en fin temas de desarrollo que realmente deberían subirse de categoría y mostrar soluciones más serias de ejemplo en estos relucientes libros de 500 a 1000 páginas.&lt;br /&gt;&lt;br /&gt;Feliz Arquitectura&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-1745729984091781218?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/1745729984091781218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=1745729984091781218' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1745729984091781218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1745729984091781218'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2011/08/arquitectura-sharepoint.html' title='Arquitectura SharePoint'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-788400588207122717</id><published>2011-08-03T06:24:00.000-07:00</published><updated>2011-08-03T08:26:54.892-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OBA'/><category scheme='http://www.blogger.com/atom/ns#' term='SPContext'/><category scheme='http://www.blogger.com/atom/ns#' term='WebParts'/><category scheme='http://www.blogger.com/atom/ns#' term='SPWeb'/><category scheme='http://www.blogger.com/atom/ns#' term='OPEN XML SDK'/><title type='text'>SharePoint 2007 y OBAs</title><content type='html'>&lt;p&gt;Hola de nuevo. En dias pasados había estado desarrollando una solución en SharePoint Server 2007, exactamente una WebPart, que tenía como finalidad tomar datos de SharePoint (KPIs) y los exportaba a un template de Excel donde esos datos terminaban siendo tabulados, aplicados sobre formulas, y en otras páginas del archivo Excel gráficados. Quisiera compartir algunas rutinas de código comunes que se usaron, que quiza puedan ser de utilidad a la comunidad.&lt;br /&gt;&lt;br /&gt;Anoto que los ejemplos son fragmentos de toda la solución, así que recibirán parámetros, tendrán nombres específicos, llamados quizá a otros métodos, que ya ustedes deberán modificar según su necesidad.&lt;br /&gt;&lt;br /&gt;1. Lo primero que vale la pena aclarar es que para esta solución SharePoint se hace uso de WSPBuilder, se los recomiendo, y &lt;a href="http://www.youtube.com/watch?v=UBNvQEiyU9U"&gt;aquí&lt;/a&gt; pueden ver su uso.&lt;br /&gt;&lt;br /&gt;2. Debido a que se utilizó OPEN XML SDK para todo lo que tenía que ver con las operaciones sobre Excel del lado del servidor, para finalmente producir un archivo en formato XLSX, les recomiendo mucho usar el SDK provisto por Microsoft, pero ante todo denle una mirada a esta herramienta (&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=5124"&gt;Open XML SDK Tool&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Es una herramienta bastante buena que les acepta un archivo Excel en formato XLSX, y finalmente les genera el código C# que permitiría producirlo. Es una ventaja porque uno puede hacer un archivo de prueba, tal como quiere generarlo, y ahorrarse mucho tiempo de desarrollo desde ceros. Toca ajustarlo a lo dinámico de la solución, pero eso ya es algo que evidentemente debe hacerse, pero la estructura general del desarrollo, estaría lista.&lt;br /&gt;&lt;br /&gt;3. Ya en código, tú primer requerimiento puede ser obtener todas las listas genéricas (evitar las listas especiales de SharePoint) del site collection y de todos sus sitios hijos, para que con ese listado llenar un control en la capa de presentación que podría ser un ComboBox, un ListBox, etc&lt;br /&gt;&lt;br /&gt;public IList &lt; TGlista &gt; GetListas()&lt;br /&gt;        {&lt;br /&gt;            SPWeb web = SPContext.Current.Site.RootWeb;&lt;br /&gt;            TGLista lista = null;&lt;br /&gt;            SPListCollection listasTemp = web.Lists;&lt;br /&gt;            IList&lt;tglista&gt; listas = new List&lt;tglista&gt;();&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                if (listasTemp != null)&lt;br /&gt;                {&lt;br /&gt;                    foreach (SPList listaTemp in listasTemp)&lt;br /&gt;                    {&lt;br /&gt;                        if (listaTemp.BaseTemplate == SPListTemplateType.GenericList)&lt;br /&gt;                        {&lt;br /&gt;                            lista = new TGLista();&lt;br /&gt;                            lista.Id = listaTemp.ID;&lt;br /&gt;                            lista.Titulo = listaTemp.Title;&lt;br /&gt;                            listas.Add(lista);&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                SPWebCollection webs = web.Webs;&lt;br /&gt;                if (webs != null)&lt;br /&gt;                {&lt;br /&gt;                    foreach (SPWeb webTemp in webs)&lt;br /&gt;                    {&lt;br /&gt;                        try&lt;br /&gt;                        {&lt;br /&gt;                            listasTemp = webTemp.Lists;&lt;br /&gt;                            foreach (SPList listaTemp in listasTemp)&lt;br /&gt;                            {&lt;br /&gt;                                if (listaTemp.BaseTemplate == SPListTemplateType.GenericList)&lt;br /&gt;                                {&lt;br /&gt;                                    lista = new TGLista();&lt;br /&gt;                                    lista.Id = listaTemp.ID;&lt;br /&gt;                                    lista.Titulo = listaTemp.Title;&lt;br /&gt;                                    listas.Add(lista);&lt;br /&gt;                                }&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                        finally&lt;br /&gt;                        {&lt;br /&gt;                            if (webTemp != null)&lt;br /&gt;                                webTemp.Dispose();&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                if (listas != null)&lt;br /&gt;                {&lt;br /&gt;                    //Hace un ordenamiento ASCENDENTE de la lista&lt;br /&gt;                    var list = from temp in listas&lt;br /&gt;                               orderby temp.Titulo&lt;br /&gt;                               select temp;&lt;br /&gt;                    return list.ToList();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            catch (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                throw;&lt;br /&gt;            }&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;Lo primero que se observa es lo que retorna el método:IList &lt; TGlista &gt; . TGLista no es más que una clase entidad, que sirve como contenedor para generar un listado genérico de tipos TGLista, lo cual es ya una técnica de programación muy sencilla y fácil de pasar datos entre las diferentes capas de la solución .NET. El control de la capa de presentación aceptará el tipo IList sin ningún problema.&lt;br /&gt;&lt;br /&gt;Luego en la linea SPWeb web = SPContext.Current.Site.RootWeb; se obtiene un objeto de tipo SPWeb, pero usando la clase SPContext, lo cual es la técnica recomendada cuando se programa una WebPart que estará dentro del contexto del sitio de SharePoint. Super importante, no se hace DISPOSE de la instancia web.&lt;br /&gt;&lt;br /&gt;Esta linea if (listaTemp.BaseTemplate == SPListTemplateType.GenericList) es la que evita que en el listado se obtengan las listas especiales de SharePoint.&lt;br /&gt;&lt;br /&gt;Ahora bien, el requerimiento incluia las listas de los sitios hijo del SiteCollection. Esta linea obtiene todos los sitios hijo SPWebCollection webs = web.Webs; Ahora con esa colección por cada sitio hijo se obtienen su listas del mismo modo. Importante el DISPOSE que si se debe hacer de cada subsite.&lt;br /&gt;&lt;br /&gt;finally&lt;br /&gt;                        {&lt;br /&gt;                            if (webTemp != null)&lt;br /&gt;                                webTemp.Dispose();&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;La razón de lo anterior es que cada subsite obtenido es un nuevo SPWeb que en este caso si debe hacerse DISPOSE formal.&lt;br /&gt;&lt;br /&gt;Finalmente un poco de LINQ no hace daño para ordenar la lista generica de elementos.&lt;br /&gt;if (listas != null)&lt;br /&gt;                {&lt;br /&gt;                    //Hace un ordenamiento ASCENDENTE de la lista&lt;br /&gt;                    var list = from temp in listas&lt;br /&gt;                               orderby temp.Titulo&lt;br /&gt;                               select temp;&lt;br /&gt;                    return list.ToList();&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;Por ahora esto es todo, luego seguiremos compartiendo más TIPs de código .NET para SharePoint.&lt;br /&gt;&lt;br /&gt;Felíz Coding!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-788400588207122717?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/788400588207122717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=788400588207122717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/788400588207122717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/788400588207122717'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2011/08/sharepoint-2007-y-obas.html' title='SharePoint 2007 y OBAs'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-8550442608426337502</id><published>2010-04-21T22:29:00.000-07:00</published><updated>2010-04-21T22:31:38.198-07:00</updated><title type='text'>SharePoint 2010 más y más</title><content type='html'>Hola, pasaba por aquí y solo quiero invitarlos y reiterarles que sean amigos en Facebook de SharePoint en la siguiente ruta:&lt;br /&gt;http://www.facebook.com/group.php?gid=375399405851&amp;v=wall&lt;br /&gt;&lt;br /&gt;Felíz FacePoint!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-8550442608426337502?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/8550442608426337502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=8550442608426337502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/8550442608426337502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/8550442608426337502'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2010/04/sharepoint-2010-mas-y-mas.html' title='SharePoint 2010 más y más'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-7965093765000953908</id><published>2010-03-27T19:04:00.001-07:00</published><updated>2010-03-27T19:21:33.155-07:00</updated><title type='text'>Vídeos SharePoint ... FaceBook group</title><content type='html'>De regreso por esto de la web 2.0 y queriendo aprovechar un poco para llevar información útil a todos ustedes, quiero vincularles un par de videos donde muestro unos sencillos ejemplos que espero sean de utilidad.&lt;br /&gt;&lt;br /&gt;En los siguientes videos quiero hacer algunas aclaraciones:&lt;br /&gt;&lt;br /&gt;1. Los ejemplos se desarrollan teniendo las siguientes consideraciones técnicas:&lt;br /&gt;&lt;br /&gt;• Windows Server 2003&lt;br /&gt;• VS.NET 2008&lt;br /&gt;• WSPBuilder&lt;br /&gt;• MOSS 2007 y WSS 3.0&lt;br /&gt;&lt;br /&gt;2. Son videos cortos pero que todos llevan una línea, así que debe seguirse todo desde el primer vídeo.&lt;br /&gt;&lt;br /&gt;3. El primer vídeo es una simple demostración de cómo y dónde descargar el WSPBuilder&lt;br /&gt;&lt;br /&gt;4. Los siguientes videos muestran cómo crear un proyecto de WSPBuilder en VS.NET 2008, y vincular un proyecto de Característica con un proyecto Web donde están los controles de usuario.&lt;br /&gt;&lt;br /&gt;Este patrón es excelente porque todo el comportamiento de la vista se le delega a un ASCX como hemos venido haciéndolo desde Framework 1.0. El proyecto WSPBuilder solo tendrá la responsabilidad de cargar el ASCX.&lt;br /&gt;En siguientes entradas continuaremos viendo cómo armar una solución de VS.NET que tenga varias capas.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.facebook.com/group.php?v=app_2392950137&amp;amp;ref=mf&amp;amp;gid=375399405851"&gt;http://www.facebook.com/group.php?v=app_2392950137&amp;amp;ref=mf&amp;amp;gid=375399405851&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Feliz SharePoint Development!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-7965093765000953908?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/7965093765000953908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=7965093765000953908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/7965093765000953908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/7965093765000953908'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2010/03/videos.html' title='Vídeos SharePoint ... FaceBook group'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-8534232968615235506</id><published>2010-02-07T09:51:00.001-08:00</published><updated>2010-02-07T17:54:31.345-08:00</updated><title type='text'>SharePoint 2010 - Bienvenida</title><content type='html'>&lt;p align="justify"&gt;Hace unos dias estuve en las instalaciones de Microsoft hablando sobre algunos temas relacionados con la renovada plataforma SharePoint 2010. Y soy sincero pero mientras instalaba y preparaba la máquina para las demostraciones, quedé sencillamente muy emocionado con las novedades y vale la pena sentarse ahora a actualizarse en todo lo nuevo, y motivar a quien lea esta corta entrada a que se ponga hoy mismo a revisar el muy querido SharePoint 2010. Por ahora solo quiero comentar algunas de las novedades:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Instalación: A parte de enterarse que necesitas Windows a 64 bits (Server 2008, Vista, 7), la instalación fue lo de siempre:&lt;/div&gt;      &lt;ul&gt;       &lt;li&gt;         &lt;div align="justify"&gt;La posibilidad de descargarse y conectar SharePoint con SQL Server Express (2005, 2008). Aquí recomiendo instalarse la versión que trae los servicios avanzados (si exacto lo de BI)&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;SharePoint Designer 2010, sencillamente muy renovado.&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;SharePoint Server 2010, que vendría a ser como MOSS, o SharePoint Foundation que vendría a ser WSS 4.0.&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;Office System 2010 y VS.NET 2010, por supuesto también Visio 2010.&lt;/div&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Durante la instalación sobre W2k8 Standard R2 se constata un único BUG, obviamente estamos aun en BETA, que requiere una sencilla instalación de un HOTFIX, y problema resuelto, después de eso la plataforma queda funcionando muy bien.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Para los que tengan una muy buena conexión a internet y mucha paciencia, igual Miocrosoft ya configuró una máquina virtual que sencillamente es muy útil.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;ChartPart: Quiza esto fue de las cosas que más me llamó la atención, una webpart para graficar información proveniente, por ejemplo de una lista de SharePoint.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;InfopathPart: Otra WebPart interesante que permite desplegar formularios de Infopath. Me pareció muy versatil y verdaderamente muy útil.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Silverlight: Hay por todos lados un aspecto y funcionalidad estilo RIA (Aplicaciones Ricas en Internet), es decir se mejoró considerablemente la experiencia del usuario. ¿Todavía recuerdan el monton de PostBacks que hace nuestro querido SharePoint 2007?&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Definitivamente quiza sea el que SharePoint 2010 corre a 64 bits, quiza sea la ayuda de Silverlight y AJAX, pero se ve que los websites corren mucho mejor y más rápidos.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Ya no será necesario configurar un Proveedor de Servicios Compartidos, ahora es cuestión de habilitar o deshabilitar los servicios empresariales que la aplicación Web requiera.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;El concepto de Catalogo de Datos de Negocio todavía se siente en el ambiente pero más renovado y renombrado, ahora se llama Servicios de Conectividad de Negocio.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;No me he sentado hacer ni el primer hola mundo con VS.NET 2010, pero las mejoras para el developer son verdaderamente considerables. Un ejemplo claro el explorador de objetos que trae VS.NET para SharePoint, desde el IDE poder navegar por los elementos del sitio.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Quiza de las cosas en las que más estaré investigando es en las nuevas posibilidades y mejoras en lo que tiene que ver con el Deployment de los desarrollos para SharePoint, esto ha venido siendo un poco arcaico y parece que ahora tiene grandes mejoras.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Sin más por ahora les dejo algunos recursos, y espero que aprovechen estas nuevas mejoras que trae SharePoint 2010, que como siempre he venido diciendo… LOS MATÓ A TODOS!!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Recursos&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://sharepointgeorge.com/2009/installing-sharepoint-2010-beta-windows-2008-r2-server/" href="http://sharepointgeorge.com/2009/installing-sharepoint-2010-beta-windows-2008-r2-server/"&gt;http://sharepointgeorge.com/2009/installing-sharepoint-2010-beta-windows-2008-r2-server/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=0c51819b-3d40-435c-a103-a5481fe0a0d2&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0c51819b-3d40-435c-a103-a5481fe0a0d2&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=0c51819b-3d40-435c-a103-a5481fe0a0d2&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://sharepoint2010.microsoft.com/Pages/videos.aspx" href="http://sharepoint2010.microsoft.com/Pages/videos.aspx"&gt;http://sharepoint2010.microsoft.com/Pages/videos.aspx&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-8534232968615235506?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/8534232968615235506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=8534232968615235506' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/8534232968615235506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/8534232968615235506'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2010/02/sharepoint-2010-bienvenida.html' title='SharePoint 2010 - Bienvenida'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-2046276294363811134</id><published>2009-07-22T14:30:00.001-07:00</published><updated>2009-07-22T14:30:38.055-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Language pack'/><category scheme='http://www.blogger.com/atom/ns#' term='WSS'/><category scheme='http://www.blogger.com/atom/ns#' term='init.js'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS'/><title type='text'>Cannot make a cache safe URL for "init.js", file not found</title><content type='html'>&lt;p&gt;Sí, me dijeron que debía instalar un paquete de lenguaje, porque el sitio que se está intentando subir al nuevo servidor utiliza un lenguaje diferente del instalado con mi MOSS 2007, pero aun no funciona…&lt;/p&gt;  &lt;p&gt;Así te puedes pasar todo el día, si efectivamente instalas tú Language Pack, que estoy seguro lo encontraste aquí:   &lt;br /&gt;&lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=2447426b-8689-4768-bff0-cbb511599a45&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=2447426b-8689-4768-bff0-cbb511599a45&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=2447426b-8689-4768-bff0-cbb511599a45&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pero el siguiente mensaje seguirá apareciendo: &lt;font color="#ff0000"&gt;Cannot make a cache safe URL for &amp;quot;init.js&amp;quot;, file not found. Please verify that the file exists under the layouts directory&lt;/font&gt;.    &lt;br /&gt;    &lt;br /&gt;Lo que ocurre es que muy seguramente estas intentando subir un sitio que fue desarrollado utilizando WSS 3.0 a tú nuevo y reluciente MOSS 2007.&amp;#160; Ahí está el problema, de igual forma debes instalar el Language Pack del idioma utilizado por el sitio, pero para esa versión de Sharepoint específica, la cual está por aquí: &lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyId=36EE1BF0-652C-4E38-B247-F29B3EEFA048&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=36EE1BF0-652C-4E38-B247-F29B3EEFA048&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=36EE1BF0-652C-4E38-B247-F29B3EEFA048&amp;amp;displaylang=en&lt;/a&gt;    &lt;br /&gt;    &lt;br /&gt;Felíz restore&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-2046276294363811134?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/2046276294363811134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=2046276294363811134' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/2046276294363811134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/2046276294363811134'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2009/07/cannot-make-cache-safe-url-for-file-not.html' title='Cannot make a cache safe URL for &amp;quot;init.js&amp;quot;, file not found'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-9164636499153790979</id><published>2009-06-23T20:29:00.001-07:00</published><updated>2009-06-23T20:29:53.824-07:00</updated><title type='text'>Preparando Exam 70-541</title><content type='html'>&lt;p&gt;Algunos links para cubrir los temas que se preguntan en el examén:&lt;/p&gt;  &lt;p&gt;1. Deploy a Web Part to the Windows SharePoint Services server. &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Register an assembly as a safe control in the Web.config file     &lt;br /&gt;”To deploy the Web Part to your WSS Site, you must then register the control as safe in web.config’s SafeControls node, as described in &lt;a href="BBL0018.html#168"&gt;Chapter 3&lt;/a&gt;. Assuming the project name LitwareWebParts, the following entry in the SafeControls node in web.config will register the assembly and namespace as safe.       &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;lt;SafeControl Assembly=&amp;quot;LitwareWebParts&amp;quot; Namespace=&amp;quot;LitwareWebParts&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; TypeName=&amp;quot;*&amp;quot; Safe=&amp;quot;True&amp;quot; /&amp;gt;        &lt;br /&gt;&lt;/font&gt;Note that for this example, we are not strong-naming the assembly, and therefore we can use the simple name of the assembly. When you strong-name the assembly, you should always register the SafeControl entry using the full four-part assembly name.” [1]      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;ul&gt;   &lt;li&gt;Configure Web Part permissions.     &lt;br /&gt;&lt;a title="http://technet.microsoft.com/en-us/library/cc261736.aspx" href="http://technet.microsoft.com/en-us/library/cc261736.aspx"&gt;http://technet.microsoft.com/en-us/library/cc261736.aspx&lt;/a&gt;      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Enable a Web Part to access resources by creating a custom security policy.     &lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/dd583158(office.11).aspx" href="http://msdn.microsoft.com/en-us/library/dd583158(office.11).aspx"&gt;http://msdn.microsoft.com/en-us/library/dd583158(office.11).aspx&lt;/a&gt;      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Create and deploy a Windows SharePoint Services solution package     &lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/bb466225.aspx" href="http://msdn.microsoft.com/en-us/library/bb466225.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb466225.aspx&lt;/a&gt;      &lt;br /&gt;&lt;a title="http://www.sharepointnutsandbolts.com/2007/07/building-and-deploying-sharepoint.html" href="http://www.sharepointnutsandbolts.com/2007/07/building-and-deploying-sharepoint.html"&gt;http://www.sharepointnutsandbolts.com/2007/07/building-and-deploying-sharepoint.html       &lt;br /&gt;        &lt;br /&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Deploy a site definition to a Windows SharePoint Services front-end Web server     &lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/bb687712.aspx" href="http://msdn.microsoft.com/en-us/library/bb687712.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb687712.aspx&lt;/a&gt;      &lt;br /&gt;&lt;a title="http://www.binarywave.com/Lists/Tips%20and%20Tricks/DispForm.aspx?ID=4" href="http://www.binarywave.com/Lists/Tips%20and%20Tricks/DispForm.aspx?ID=4"&gt;http://www.binarywave.com/Lists/Tips%20and%20Tricks/DispForm.aspx?ID=4&lt;/a&gt;      &lt;br /&gt;      &lt;br /&gt;Continuará…      &lt;br /&gt;      &lt;br /&gt;&lt;strong&gt;Referencias&lt;/strong&gt;      &lt;br /&gt;[1] P. Ted and L. Daniel. &lt;a&gt;Inside Microsoft Windows SharePoint Services 3.0&lt;/a&gt;. Cap 3 y 4. 2007.      &lt;br /&gt;      &lt;br /&gt;Feliz certificación&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-9164636499153790979?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/9164636499153790979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=9164636499153790979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/9164636499153790979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/9164636499153790979'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2009/06/preparando-exam-70-541.html' title='Preparando Exam 70-541'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-5517410878565144887</id><published>2009-05-04T12:17:00.003-07:00</published><updated>2009-05-04T12:17:29.020-07:00</updated><title type='text'>Operation is not valid due to the current state of the object.</title><content type='html'>&lt;p align="left"&gt;O debería decir mejor:    &lt;br /&gt;    &lt;br /&gt;&lt;font color="#ff0000"&gt;The database WSS_Content on ComputerName\Microsoft##SSEE is not accessible to missing Windows Internal Database signatur      &lt;br /&gt;      &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Pasaron una cuantas horas y un colapso de mi sistema nervioso para llegar hasta aquí y gracias a los logs de windows y del propio Sharepoint.      &lt;br /&gt;      &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_tP7sdi3BZ2A/Sf8_RuHjivI/AAAAAAAAAKE/9c1pmLeX36M/s1600-h/untitled4.jpg"&gt;&lt;img title="untitled" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="338" alt="untitled" src="http://lh6.ggpht.com/_tP7sdi3BZ2A/Sf8_SEFWhhI/AAAAAAAAAKI/xiQHdhIXwdo/untitled_thumb2.jpg?imgmax=800" width="306" border="0" /&gt;&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;a title="http://support.microsoft.com/kb/944267/en-us/" href="http://support.microsoft.com/kb/944267/en-us/"&gt;http://support.microsoft.com/kb/944267/en-us/&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;- Primer consejo, lean todas esas entradas de Microsoft en inglés, la traducción es sencillamente una pestilencia.     &lt;br /&gt;    &lt;br /&gt;- Segundo, estos errores de verdad que pueden causarle a un mortal un colapso nervioso, más cuando hay grandes proyectos de por medio que de un momento a otro dejan de andar.     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;- &lt;/strong&gt;&lt;/p&gt; &lt;font color="#ff0000"&gt;&lt;strong&gt;En letra roja les digo que corran esto con mucho cuidado, por ejemplo lo que hacen ahi vuelve y deja los archivos web.config de sus sitios con la configuración original, así que si tienen en estos entradas personalizadas se van a perder. Esto es el caso cuando hemos utilziado webparts, páginas aspx, en fin extensibilidad a través de programación para sharepoint que siempre requiere modificar el web.config. &lt;/strong&gt;&lt;/font&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;La teoría dice que una actualización pudo haber sido instalada, yo la verdad no pude ver en qué momento esto sucedió, así que creo que Microsoft debería hacer algo al respecto porque este error cuesta varias horas y que los sitios de Sharepoint dejen de funcionar abruptamente.      &lt;br /&gt;      &lt;br /&gt;Felíz solución&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-5517410878565144887?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/5517410878565144887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=5517410878565144887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/5517410878565144887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/5517410878565144887'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2009/05/operation-is-not-valid-due-to-current.html' title='Operation is not valid due to the current state of the object.'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_tP7sdi3BZ2A/Sf8_SEFWhhI/AAAAAAAAAKI/xiQHdhIXwdo/s72-c/untitled_thumb2.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-149757198007846579</id><published>2009-05-04T12:17:00.001-07:00</published><updated>2009-05-04T12:17:11.945-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AjaxControlToolKit'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='WSS'/><title type='text'>AJAXControlToolKit – El blog de Pinocho</title><content type='html'>&lt;p&gt;En el siguiente blog dicen algunas mentirillas, que no lastiman a nadie pero si nos vuelven paranóicos a los principiantes:    &lt;br /&gt;    &lt;br /&gt;&lt;a title="http://weblogs.asp.net/jan/archive/2007/02/26/using-the-ajax-control-toolkit-in-sharepoint.aspx" href="http://weblogs.asp.net/jan/archive/2007/02/26/using-the-ajax-control-toolkit-in-sharepoint.aspx"&gt;http://weblogs.asp.net/jan/archive/2007/02/26/using-the-ajax-control-toolkit-in-sharepoint.aspx&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;Nuestro buen amigo dice que para poder utilizar el ACT en Sharepoint es necesario agregar un par de entradas en los tags assemblies y controls del web.config. MENTIRA!!     &lt;br /&gt;    &lt;br /&gt;Eso para nada es necesario amigos mios, lo único que Sharepoint quiere es que la dll del ACT sea confiable para el, así que la primera nota del amigo sí es cierta, pero solo la mitad, debemos poner la DLL en la carpeta BIN del sitio de Sharepoint.     &lt;br /&gt;    &lt;br /&gt;Algunos blogs parecen autoria de Pinocho, pero solo con la práctica nos vamos dando cuenta de que muchas cosas le han pasado inadvertidas a muchas personas.     &lt;br /&gt;    &lt;br /&gt;Feliz práctica&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-149757198007846579?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/149757198007846579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=149757198007846579' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/149757198007846579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/149757198007846579'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2009/05/ajaxcontroltoolkit-el-blog-de-pinocho.html' title='AJAXControlToolKit – El blog de Pinocho'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-7690411086160189785</id><published>2009-04-25T20:36:00.001-07:00</published><updated>2009-04-25T20:40:38.290-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Lista'/><title type='text'>Sharepoint List … Programáticamente</title><content type='html'>&lt;p&gt;Hola de nuevo, y esta vez quiero mostrar un sencillo ejemplo de cómo podemos guardar información en una lista previamente configurada en Sharepoint. &lt;/p&gt;  &lt;p&gt;Suponiendo que tenemos una página aspx en la cual programamos una interfaz adecuada para ingresar los valores y posteriormente guardarlos en la lista, el código de ejemplo quedaría de la siguiente forma:&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;Protected Sub btnGuardar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnGuardar.Click      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SPSecurity.RunWithElevatedPrivileges(AddressOf Guardar)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; End Sub &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;&amp;#160;&amp;#160;&amp;#160; Private Sub Guardar()      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dim objSitio As SPSite = New SPSite(ConfigurationManager.AppSettings(&amp;quot;MiSitio&amp;quot;))       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Using objWeb As SPWeb = objSitio.OpenWeb()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; objWeb.AllowUnsafeUpdates = True       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dim objLista As SPList = objWeb.Lists(&amp;quot;MiLista&amp;quot;)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dim objItem As SPListItem = objLista.Items.Add()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; objItem(&amp;quot;Campo 1&amp;quot;) = &amp;quot;xxxx&amp;quot;       &lt;br /&gt;&lt;/font&gt;&lt;font color="#000080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; objItem(&amp;quot;Campo 2&amp;quot;) = &amp;quot;yyyy&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; objItem.Update()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; objWeb.AllowUnsafeUpdates = False       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Using &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;&amp;#160;&amp;#160;&amp;#160; End Sub&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;Lo primero y más importante es la llamada al método:&lt;/font&gt;&lt;/p&gt; SPSecurity.RunWithElevatedPrivileges(AddressOf Guardar)   &lt;br /&gt;Con lo anterior aseguramos que un usuario que ha iniciado sesión en el sitio de Sharepoint pueda ejecutar la acción.   &lt;br /&gt;  &lt;br /&gt;Ya en el método Guardar(), se supone que ya existe un sitio llamado MiSitio, con una lista en ese sitio llamada MiLista la cual tiene una serie de campos, Campo 1 y 2. Eso obviamente lo deben cambiar a sus valores reales.   &lt;br /&gt;  &lt;br /&gt;Lo realmente importante es la llamada a la propiedad AllowUnsafeUpdates con el valor true, lo cual le dice a la Lista que debe quedar hábilitada para permitir la actualización cuando se invoca el método&amp;#160; Update().   &lt;br /&gt;  &lt;br /&gt;&lt;font color="#ff0000"&gt;Lo anterior, que conste que lo escribo en letra roja, es practicamente una impersonación, así que hasta el más razo de los usuarios (read only) podrá hacer una actualización sobre esa lista. Por lo tanto miren la llamada nuevamente a AllowUnsafeUpdates pero esta vez asignado a False, porque puede ser un hueco de seguridad lo anterior. Además si ustedes quieren que la actualización la pueda ejecutar únicamente un usuario con mayores privilegios pues es cuestión de adicionar código que valide el grupo o algo por el estílo que verifique los permisos de dicho usuario, ya que lo anterior lo puede ejecutar cualquiera.&lt;/font&gt;   &lt;br /&gt;  &lt;br /&gt;&lt;font color="#000000"&gt;Felíz Update.&lt;/font&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-7690411086160189785?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/7690411086160189785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=7690411086160189785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/7690411086160189785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/7690411086160189785'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2009/04/sharepoint-list-programaticamente.html' title='Sharepoint List … Programáticamente'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-3345991757614236300</id><published>2009-04-16T11:33:00.001-07:00</published><updated>2009-04-16T11:45:28.470-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Libros'/><title type='text'>Windows Sharepoint Services Book – OnLine</title><content type='html'>&lt;p&gt;Esto me dió gran sorpresa y entusiasmo que se comparta un preview de un libro tan maravilloso sobre la tecnología ya que para los que lo compramos desafortunadamente no trae una versión dígital o los que les interese comprarlo puedan darle un vistazo antes de. Afortunadamente como lo dije en un post anterior el libro vale mucho la pena por cada dolar invertido.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://techbus.safaribooksonline.com/9780470127285/dear_reader" href="http://techbus.safaribooksonline.com/9780470127285/dear_reader"&gt;http://techbus.safaribooksonline.com/9780470127285/dear_reader&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Felíz preview&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-3345991757614236300?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/3345991757614236300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=3345991757614236300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/3345991757614236300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/3345991757614236300'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2009/04/windows-sharepoint-services-book-online.html' title='Windows Sharepoint Services Book – OnLine'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-4173406677022195188</id><published>2009-04-15T22:32:00.001-07:00</published><updated>2009-04-25T20:37:36.140-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebParts'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView'/><title type='text'>El GridView programático … una triste história</title><content type='html'>&lt;p&gt;Si han seguido un post anterior sobre el gridview programático notaron que todo marchó a pedir de boca.&lt;/p&gt;  &lt;p&gt;Pero cuando habilité la paginación del gridview en la webpart apareció este engendro sobrenatural:&lt;/p&gt;  &lt;h3&gt;Server Error in '/' Application.    &lt;hr width="100%" size="1" /&gt;&lt;/h3&gt;  &lt;h4&gt;&lt;i&gt;Object reference not set to an instance of an object.&lt;/i&gt;&lt;/h4&gt; &lt;b&gt;Description: &lt;/b&gt;An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.   &lt;br /&gt;&lt;b&gt;Exception Details: &lt;/b&gt;System.NullReferenceException: Object reference not set to an instance of an object.   &lt;br /&gt;&lt;b&gt;Source Error:&lt;/b&gt;   &lt;p&gt;&lt;code&gt;An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Stack Trace:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;  &lt;pre&gt;&lt;font color="#ff0000"&gt;[NullReferenceException: Object reference not set to an instance of an object.]&lt;br /&gt;   System.Web.UI.WebControls.GridView.get_StateFormatter() +25&lt;br /&gt;…&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Lo anterior es lo ocurrido cuando el gridview queda configurado para paginación. ¿Pero cómo se logra el error anterior?&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;font face="Verdana" color="#000000"&gt;Antes&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;font face="Verdana" color="#000000"&gt;&lt;br /&gt;  &lt;p&gt;&lt;strong&gt;&lt;font face="Verdana" color="#000000"&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="Verdana" color="#000000"&gt;&lt;font face="Verdana" color="#000000"&gt;&lt;font face="Verdana" color="#000000"&gt;&lt;font face="Verdana" color="#000000"&gt;&lt;font face="Verdana" color="#000000"&gt;&lt;br /&gt;          &lt;p&gt;&lt;font color="#000000"&gt;Protected Overrides Sub CreateChildControls()&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dim customField As New TemplateField&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;          &lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; customField.ItemTemplate = New GridViewTemplate(DataControlRowType.DataRow, &amp;quot;&amp;quot;, Me.Imagen, Me.Titulo, Me.Resumen, Me.Contenido)&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; grvPrueba = New GridView()&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; grvPrueba.AutoGenerateColumns = False&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; grvPrueba .ShowHeader = False&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; grvPrueba .RowStyle.CssClass = Me.EstiloFila&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; grvPrueba .AlternatingRowStyle.CssClass = Me.EstiloAlternado&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If Paginar Then&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; grvPrueba .AllowPaging = Paginar&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If Me.NumeroRegistros &amp;gt; 0 Then&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; grvPrueba .PageSize = Me.NumeroRegistros&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; grvPrueba.Columns.Add(customField)&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; grvPrueba.DataSource = ConsultarLista()&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; grvPrueba.DataBind()&amp;#160; &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AddHandler grvPrueba.PageIndexChanging, AddressOf grvPrueba_PageIndexChanging&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#ff0000"&gt;Me.Controls.Add(grvNoticias)&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Sub&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;br /&gt;&lt;p&gt;¿Si han notado que dejo para el final el agregar el gridview a la colección Controls de la webpart? Pues eso es un grave error cuando el gridview permitirá la paginación y cuesta un par de tasas de café y una tarde entera de trabajo perdido. El por qué del error, creo quedo en deuda con la explicación de fondo porque no sé la razón.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Solución&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;En seguida de la creación del GridView este se debe agregar a la colección Controls de tal forma que nos queda así:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;grvPrueba= New GridView() &lt;br /&gt;  &lt;br /&gt;Me.Controls.Add(grvPrueba) &lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;…&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Feliz GridView programático&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-4173406677022195188?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/4173406677022195188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=4173406677022195188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/4173406677022195188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/4173406677022195188'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2009/04/el-gridview-programatico-una-triste.html' title='El GridView programático … una triste história'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-8847857181832468620</id><published>2009-04-08T15:29:00.001-07:00</published><updated>2009-04-08T15:30:31.315-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arquitectura'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint'/><title type='text'>Una luz en el tunel … Guía Sharepoint</title><content type='html'>&lt;p&gt;Quiero para los que no sepan que existe una guía de Patterns &amp;amp; Practices para Sharepoint darles el siguiente link:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/dd203468.aspx" href="http://msdn.microsoft.com/en-us/library/dd203468.aspx"&gt;http://msdn.microsoft.com/en-us/library/dd203468.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Es muy bueno sentarse a revisar esto antes de tomar desiciones sobre la arquitectura y desarrollos para Sharepoint.&lt;/p&gt;  &lt;p&gt;Y aprovechando esta entrada también darles el link a la revista de Sharepoint en español que me parece una grandiosa entrega del tema. &lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.gavd.net/servers/compartimoss/compartimoss_main.aspx" href="http://www.gavd.net/servers/compartimoss/compartimoss_main.aspx"&gt;&lt;font size="1"&gt;http://www.gavd.net/servers/compartimoss/compartimoss_main.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Felíz arquitectura&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-8847857181832468620?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/8847857181832468620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=8847857181832468620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/8847857181832468620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/8847857181832468620'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2009/04/una-luz-en-el-tunel-guia-sharepoint.html' title='Una luz en el tunel … Guía Sharepoint'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-2598297768918985890</id><published>2009-04-08T14:57:00.001-07:00</published><updated>2009-04-08T15:31:07.073-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebParts'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>TemplateField el Gridview programático</title><content type='html'>&lt;p&gt;Teniendo que hacer una WebPart para WSS 3.0 necesitaba incluir un Gridview como control de la webpart pero con controles dentro de el como lo podemos hacer desde el diseñador de visual studio.&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff" size="1"&gt;&amp;lt;asp:GridView ID=&amp;quot;gvWebPart&amp;quot; runat=&amp;quot;server&amp;quot; AutoGenerateColumns=&amp;quot;false&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Columns&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;asp:TemplateField&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ItemTemplate&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;asp:HyperLink&amp;#160; ID=&amp;quot;lblContenido&amp;quot; runat=&amp;quot;server&amp;quot; Text='&amp;lt;%# Bind(&amp;quot;campo&amp;quot;)&amp;#160; %&amp;gt;'&amp;#160;&amp;#160; &amp;gt;&amp;lt;/asp:HyperLink&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/ItemTemplate&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/asp:TemplateField&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Columns&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/asp:GridView&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;Pero lo anterior solo se logra en un proyecto de tipo ASP.NET, pero en un proyecto tipo Webpart? La respuesta está aquí igualmente para cualquier otro proyecto donde no podemos hacer lo anterior vía el diseñador:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.templatefield.templatefield.aspx" href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.templatefield.templatefield.aspx"&gt;&lt;font size="1"&gt;http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.templatefield.templatefield.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;Felíz Gridview programático&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-2598297768918985890?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/2598297768918985890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=2598297768918985890' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/2598297768918985890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/2598297768918985890'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2009/04/templatefield-el-gridview-programatico.html' title='TemplateField el Gridview programático'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-4444658340372657696</id><published>2009-03-22T16:42:00.001-07:00</published><updated>2009-03-22T16:49:45.844-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VS.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Master Page'/><category scheme='http://www.blogger.com/atom/ns#' term='Code behind'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='GAC'/><title type='text'>Code behind en las páginas maestras o de contenido en Sharepoint</title><content type='html'>&lt;p&gt;Mucho se ha escrito sobre este tema. Pero espero contribuir de manera pr&amp;#225;ctica sin mucho enredo sobre esto.&lt;/p&gt;  &lt;p&gt;1. Lo primero que vamos hacer es crear un proyecto de librer&amp;#237;a de clases en VS.NET 2005 o 2008, da igual al cual llamaremos MasterPageCustom. Les sugiero crear ese proyecto en C#. Las p&amp;#225;ginas de Sharepoint utilizan ese lenguaje por defecto. Aunque en este momento me estoy preguntando qu&amp;#233; pasa si ponemos a trabajar eso con VB.NET, pero si no es molest&amp;#237;a seleccionen C#.&lt;/p&gt;  &lt;p&gt;2. Supongamos que vamos a asignarle un poco de l&amp;#243;gica a nuestra p&amp;#225;gina mestra, que hemos personalizado para nuestro proyecto, y a la que hemos colocado una etiqueta (Label) que deber&amp;#225; desplegar el t&amp;#237;tulo de nuestro sitio din&amp;#225;micamente. El objetivo es que este simple ejemplo, les de pie para construir lo que deseen en su p&amp;#225;gina maestra o p&amp;#225;ginas de contenido (ASPX). Asignenle un nombre al archivo .cs por ejemplo Master.cs, igual utilicen ese nombre para su clase. El caso es que deben tener alg&amp;#243; as&amp;#237;:&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;using System;     &lt;br /&gt;using System.Collections.Generic;      &lt;br /&gt;using System.Text;      &lt;br /&gt;using System.Web.UI;      &lt;br /&gt;using System.Web.UI.WebControls;      &lt;br /&gt;using Microsoft.SharePoint;      &lt;br /&gt;using Microsoft.SharePoint.WebControls ; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;namespace MasterPageCustom     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class Master : MasterPage      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; protected Label&amp;#160; lblTitulo; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; protected override void OnLoad(EventArgs e)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SPSite objSitioActual = SPControl.GetContextSite(Context);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (SPWeb objWeb = objSitioActual.OpenWeb())      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.lblTitulo .Text = objWeb.Title;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Pongan atenci&amp;#243;n a la definici&amp;#243;n del Label, la reescritura del evento Load que escuchar&amp;#225; cuando se carga la Master, y por supuesto la herencia de la clase MasterPage. Lo dem&amp;#225;s es carpinteria del modelo de objetos de Sharepoint.&lt;/p&gt;  &lt;p&gt;3. Compilen y firmen su proyecto de libreria de clases. La firma nos permite arrastar y soltar el assembly en el GAC. Entonces coloquen el assembly en el GAC.&lt;/p&gt;  &lt;p&gt;4. Es momento de decirle a Sharepoint que les permita ejecutar el assembly, esto lo hacen asignando la siguiente entrada en el Web.config asociado con el sitio de sharepoint que est&amp;#225;n trabajando. Busque en su web.config la secci&amp;#243;n adecuada, en este caso &amp;lt;SafeControls&amp;gt;.&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;&amp;lt;SafeControl Assembly=&amp;quot;MasterPageCustom, Version=1.0.0.0, Culture=neutral, PublicKeyToken=254e1a9738d6d566&amp;quot; Namespace=&amp;quot;MasterPageCustom&amp;quot; TypeName=&amp;quot;*&amp;quot; Safe=&amp;quot;True&amp;quot; /&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;5. Con lo anterior configurado finalmente debemos asignar el archivo Master.cs a la p&amp;#225;gina maestra, sencillamente en la siguiente l&amp;#237;nea de su archivo .master asociado a su sitio de Sharepoint hacen el siguiente cambio.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;&amp;lt;%@Master language=&amp;quot;C#&amp;quot; Inherits=&amp;quot;MasterPageCustom.Master,MasterPageCustom,Version=1.0.0.0, Culture=neutral, PublicKeyToken=254e1a9738d6d566&amp;quot; %&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Importante: El valor de PublicKeyToken, obviamente cambiar&amp;#225; seg&amp;#250;n su libreria de clases, y lo pueden ver en el GAC muy f&amp;#225;cilmente viendo las propiedades del archivo ahi mismo.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;Si todo va bien lo anterior estar&amp;#225; funcionando sin problema y desplegandoles el t&amp;#237;tulo asignado a su sitio ra&amp;#237;z o subsitio en el Label que se ha colocado en la Master. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;Adem&amp;#225;s del tema t&amp;#233;cnico, lo que vemos aqu&amp;#237; es la potencia de Sharepoint + .NET, que nos permitir&amp;#225; hacer muchas cosas espectaculares de forma program&amp;#225;tica.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;Feliz code behind!!&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-4444658340372657696?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/4444658340372657696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=4444658340372657696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/4444658340372657696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/4444658340372657696'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2009/03/code-behind-en-las-paginas-maestras-o.html' title='Code behind en las páginas maestras o de contenido en Sharepoint'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-8048877016795120228</id><published>2009-03-21T19:58:00.001-07:00</published><updated>2009-03-21T20:08:54.567-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WSS'/><category scheme='http://www.blogger.com/atom/ns#' term='WebParts'/><category scheme='http://www.blogger.com/atom/ns#' term='Master Page'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Designer'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Libros'/><title type='text'>Sharepoint Tips y Tricks I Parte</title><content type='html'>&lt;p&gt;&lt;strong&gt;Tip 1- Comprando libros&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;El primer consejo que les puedo dar es, compren libros, muchos libros, pero que ojal&amp;#225; y obviamente sean buenos. Para ahorrarles en gastos innecesarios, dejenme recomedarles dos biblias excelentes. Muy claramente un libro es sobre Windows Sharepoint Services 3.0 y el otro es sobre MOSS 2007. Estos dos engendros se han convertido en mi mejor fuente de informaci&amp;#243;n, por su claridad y excelente forma de explicar cada concepto de estos dos sabores de Sharepoint. Les dejo el enlace de Amazon para que detallen y analicen si los adquieren o no, yo lo hice a ojo cerrado:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.amazon.com/Mastering-Windows-SharePoint-Services-3-0/dp/0470127287/ref=sr_1_16?ie=UTF8&amp;amp;s=books&amp;amp;qid=1237687347&amp;amp;sr=1-16" href="http://www.amazon.com/Mastering-Windows-SharePoint-Services-3-0/dp/0470127287/ref=sr_1_16?ie=UTF8&amp;amp;s=books&amp;amp;qid=1237687347&amp;amp;sr=1-16"&gt;http://www.amazon.com/Mastering-Windows-SharePoint-Services-3-0/dp/0470127287/ref=sr_1_16?ie=UTF8&amp;amp;s=books&amp;amp;qid=1237687347&amp;amp;sr=1-16&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.amazon.com/Microsoft-Office-SharePoint-Server-Practices/dp/0735625387/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1237687534&amp;amp;sr=1-1" href="http://www.amazon.com/Microsoft-Office-SharePoint-Server-Practices/dp/0735625387/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1237687534&amp;amp;sr=1-1"&gt;http://www.amazon.com/Microsoft-Office-SharePoint-Server-Practices/dp/0735625387/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1237687534&amp;amp;sr=1-1&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tip 2- Lean estos art&amp;#237;culos antes de...&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;La revista MSDN Magazine llega con un muy interesante art&amp;#237;culo, donde los autores comparten experiencias de la vida real y hacen unas excelentes recomendaciones, que dada mi experiencia uno deber&amp;#237;a tomar en cuenta antes de hacer cualquier cosa con Sharepoint, llamese WSS 3.0 o MOSS 2007.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/es-co/magazine/dd458798.aspx" href="http://msdn.microsoft.com/es-co/magazine/dd458798.aspx"&gt;http://msdn.microsoft.com/es-co/magazine/dd458798.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Igualmente detallen cada uno de los art&amp;#237;culos que el citado enlaza poque son igualmente muy buenos, sobre todo si somos desarrolladores marca Sharepoint.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tip 3- Ya me le&amp;#237; los art&amp;#237;culos y ahora?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Despu&amp;#233;s de tener conceptos claros, por lo menos lo b&amp;#225;sico, es hora de destapar la caja e instalar Sharepoint, aclaro que la instalaci&amp;#243;n debi&amp;#243; ser tema de lectura antes de, porque es todo un proceso de cuidado. Si la intenci&amp;#243;n es un ambiente de desarrollo, les recomiendo mucho tener claro el punto del art&amp;#237;culo recomendado en Tip 2 &amp;quot;Desarrollando sin Servidor&amp;quot;, es decir, que no necesariamente tenemos porque instalar Visual Studio .NET en el servidor donde reside Sharepoint, la idea consumir los Web Services que ofrece la plataforma &lt;a title="http://msdn.microsoft.com/es-co/library/ms458094.aspx" href="http://msdn.microsoft.com/es-co/library/ms458094.aspx"&gt;http://msdn.microsoft.com/es-co/library/ms458094.aspx&lt;/a&gt;. Si es un m&amp;#225;quina virtual lo que ustedes desean pues simplemente instalen todo ahi. Mi recomendaci&amp;#243;n es que dejen la m&amp;#225;quina virtual para juegos con mu&amp;#241;ecas, en un proyecto real, lo mejor es tener un buen servidor donde desarrollador y dise&amp;#241;ador puedan trabajar a la par, ya que las exigencias de negocio de cada cliente exigir&amp;#225;n la presencia de estos dos individuos, porque no hay cosa que el usuario final deteste m&amp;#225;s que el dise&amp;#241;o por defecto de Sharepoint. Quieren comenzar a modificar el dise&amp;#241;o b&amp;#225;sico de Sharepoint? todo un reto, y les recomiendo leer sobre Branding en Sharepoint. Si su dise&amp;#241;ador es h&amp;#225;bil, como en mi afortunado caso, presentenle Sharepoint Designer, aunque igual este se&amp;#241;or los rega&amp;#241;ar&amp;#225;, porque realmente lo que Designer hace con el HTML de las p&amp;#225;ginas, es sencillamente desastrozo, o bueno por lo menos desde la perspectiva del dise&amp;#241;ador, quien est&amp;#225; acostumbrado a ver cosas m&amp;#225;s &amp;quot;limpias&amp;quot;. Pero no habiendo m&amp;#225;s, es hora de explotar Sharepoint designer, as&amp;#237; que una buena idea es comenzar viendo a los mejores: &lt;a title="http://www.microsoft.com/downloads/details.aspx?familyid=5B10F061-41D4-48CE-85CB-01D46772240D&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?familyid=5B10F061-41D4-48CE-85CB-01D46772240D&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=5B10F061-41D4-48CE-85CB-01D46772240D&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;No desperdicien dinero en libros de este engendro, que quede claro, no lo veo nada necesario.&lt;/p&gt;  &lt;p&gt;Mis consejos son:&lt;/p&gt;  &lt;p&gt;- Dejen las p&amp;#225;ginas maestras de Sharepoint quietas, no las modifiquen, creen sus propias p&amp;#225;ginas maestras, ojal&amp;#225; basadas en las por defecto y de ahi comiencen el embellecimiento.&lt;/p&gt;  &lt;p&gt;- Estudien los formularios ASPX propios de Sharepoint, esos utilizan p&amp;#225;ginas maestras por defecto de Sharepoint, y por lo tanto no se renderizan con su p&amp;#225;gina maestra, pero aclaro, pueden ponerlos apuntar a la que ustedes construyan. Sinceramente esos formularios propios de Sharepoint, deber&amp;#237;an tratar de dejarlos como vienen, a no ser que el cliente les exija que debe conservarse el dise&amp;#241;o en todos los rincones, hasta en los m&amp;#225;s reconditos. Esas formas son por ejemplo: DispForm.aspx, EditForm.aspx, NewForm.aspx.&lt;/p&gt;  &lt;p&gt;- Dejen su p&amp;#225;gina mestra global a todo sitio de su proyecto Sharepoint. How To? Primero coloquen su nueva master en el sitio ra&amp;#237;z y en cada subsitio que la requiere sencillamente apunten con esta l&amp;#237;nea en sus p&amp;#225;ginas ASPX: &lt;font color="#ff0000"&gt;MasterPageFile=&amp;quot;~sitecollection/_catalogs/masterpage/miMaestra.master&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;No se inventen m&amp;#225;s de dos p&amp;#225;ginas maestras por sitio, es decir m&amp;#225;ximo yo aconsejo tener la maestra del Home, cuando el cliente requiere que este sea totalmente diferente de lo dem&amp;#225;s, y su maestra global a cada subsitio. Esto ahorrar&amp;#225; dolores de cabeza a ustedes y al adminstrador final. &lt;/p&gt;  &lt;p&gt;- Como para el dise&amp;#241;ador no hay vida despu&amp;#233;s de las hojas de estilo o CSS, sencillamente estas ser&amp;#225;n creadas desde cero para su nueva personalizaci&amp;#243;n y ser&amp;#225; enlazada a trav&amp;#233;s de su p&amp;#225;gina mestra global: &lt;font color="#ff0000"&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;miCSS.css&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;font color="#000000"&gt;Algo que deber&amp;#225;n enfrentar seguramente, si nuevamente cuentan con un gran dise&amp;#241;ador que quiere hacer retoques especiales a cosas como WebParts, es que se debe sobreescribir los estilos definidos en CORE.CSS, la hoja de estilos propia de Sharepoint, lo cual se puede lograr en miCSS.css. Les doy un ejemplo, imaginen que quieren ocultar el header de sus webparts, donde sharepoint coloca los titulos de las columnas que se muestran en cada webpart. Hacen esto en su CSS y listo, el estilo por defecto queda sobreescrito:&lt;/font&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;.default .ms-viewheadertr {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; display:none;      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Pero deben tener cuidado que lo anterior afectar&amp;#225; todos y cada uno de los formularios ASPX que muestran webparts, lo cual no puede ser muy deseable, pero esto ya ser&amp;#225; vuestro problema.&lt;/p&gt;  &lt;p&gt;Esta es mi primera entrada sobre temas relacionados a Sharepoint, que espero poder seguir escribiendo para dar guia y recibir su retroalimentaci&amp;#243;n y as&amp;#237; compartir las lecciones aprendidas.&lt;/p&gt;  &lt;p&gt;Un abrazo!!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-8048877016795120228?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/8048877016795120228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=8048877016795120228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/8048877016795120228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/8048877016795120228'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2009/03/sharepoint-tips-y-tricks-i-parte.html' title='Sharepoint Tips y Tricks I Parte'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-8127084746617672243</id><published>2008-11-29T16:55:00.001-08:00</published><updated>2008-11-29T16:56:36.182-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arquitectura'/><title type='text'>Arquitectura Empresarial</title><content type='html'>&lt;p&gt;Hola de nuevo. No se si han escuchado acerca del tema de Arquitectura Empresarial o EA por sus siglas en ingl&amp;#233;s. Quiero hacer esta peque&amp;#241;a entrada para recomendarles leer y enterarse m&amp;#225;s de este tema, sus metodolog&amp;#237;as, frameworks, y el por qu&amp;#233; est&amp;#225; causando tanto inter&amp;#233;s y aplicaci&amp;#243;n en grandes compa&amp;#241;&amp;#237;as, que actualmente se encuentran en una encrucijada a causa de la cantidad de soluciones inform&amp;#225;ticas, heterogeneidad, y dem&amp;#225;s problemas a causa de la infinidad de proyectos en los que estas grandes compa&amp;#241;&amp;#237;as se embarcan con rumbo desconocido. Para eso aparece la EA, intentado poner orden, pero teniendo en cuenta la Estrategia, Procesos, Infraestructura, y Soluciones Software, entre muchos otros detalles, vitales para tratar de poner orden y establecer una carta de navegaci&amp;#243;n para el futuro tecnol&amp;#243;gico de las empresas.    &lt;br /&gt;Quiero recomendarles leer sobre TOGAF, uno de los frameworks y metodolog&amp;#237;as m&amp;#225;s utilizados actualmente para apoyar los procesos de EA. &lt;/p&gt;  &lt;p align="justify"&gt;&lt;a title="http://www.opengroup.org" href="http://www.opengroup.org"&gt;http://www.opengroup.org&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Fel&amp;#237;z arquitectura.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-8127084746617672243?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/8127084746617672243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=8127084746617672243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/8127084746617672243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/8127084746617672243'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2008/11/arquitectura-empresarial.html' title='Arquitectura Empresarial'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-5112927900147840660</id><published>2007-11-30T21:09:00.001-08:00</published><updated>2007-11-30T21:15:12.748-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>y LinQ?...</title><content type='html'>&lt;p&gt;Hola de nuevo.&lt;/p&gt;  &lt;p&gt;Esta ves demos cabida a un tema que me llama mucho la atenci&amp;#243;n, y ha de ser del gusto de muchos porque es una nueva herramienta sobre el tapete, para consultar y manipular informaci&amp;#243;n, pero no al estilo SQL, no se&amp;#241;ores, un estilo m&amp;#225;s c#, con muchas caracter&amp;#237;sticas interesantes que quiero describir en breve:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Dicen por ahi que LinQ, es el lenguaje de consultas integrado para el Framework de .NET. Es un conjunto de extensiones de C# y VB.NET, con un modelo de programaci&amp;#243;n unificado que extiende el Framework de .NET para ofrecer consulta integrada de objetos, bases de datos, y XML.&lt;/li&gt;    &lt;li&gt;Cualquier colecci&amp;#243;n que soporte la interfaz System.Collections.Generic&lt;i&gt;.&lt;/i&gt;IEnumerable, o la interfaz gen&amp;#233;rica IEnumerable&amp;lt;T&amp;gt;, es considerada una secuencia y puede ser operada utilizando los nuevos operadores de consulta de LINQ.&lt;/li&gt;    &lt;li&gt;Vale la pena mencionar la caracter&amp;#237;stica de inferencia de tipos, entre lo nuevo de C#, ya que le permite a las variables locales ser autom&amp;#225;ticamente tipadas por su expresi&amp;#243;n de inicializaci&amp;#243;n.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Y viendo c&amp;#243;digo en acci&amp;#243;n, simplemente creen un proyecto de consola y escriban lo siguiente, para que ejecuten su primer ejemplo utilizando LINQ, sobre colecciones en memoria.&lt;/p&gt;  &lt;p&gt;using System;   &lt;br /&gt;using System.Collections.Generic;    &lt;br /&gt; using System.Linq;     &lt;br /&gt;using System.Text;     &lt;br /&gt;    &lt;br /&gt;namespace LinQ1     &lt;br /&gt;{     &lt;br /&gt;&amp;#160; class Program     &lt;br /&gt;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; static void Main(string[] args)     &lt;br /&gt;&amp;#160;&amp;#160; {&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NumQuery();&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160; static void NumQuery()     &lt;br /&gt;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160; var numbers = new int[] { 1, 4, 9,&amp;#160; 16,25, 36 };     &lt;br /&gt;&amp;#160;&amp;#160; var evenNumbers = from p in numbers where (p % 2) == 0&amp;#160; select p; Console.WriteLine(&amp;quot;Result:&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; foreach (var val in evenNumbers)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(val);     &lt;br /&gt;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160; }     &lt;br /&gt;}    &lt;br /&gt;    &lt;br /&gt;Si notaron el uso de la expresi&amp;#243;n &lt;em&gt;var,&lt;/em&gt; aqui es donde el compilador de C# hace inferencia, y determina el tipo de dato correcto sobre la variable. Cabe notar tambi&amp;#233;n como la expresi&amp;#243;n &lt;em&gt;foreach&lt;/em&gt; ha sido extendida para utilizar la inferencia de tipos tambi&amp;#233;n.    &lt;br /&gt;    &lt;br /&gt;Por ahora esto es solo el inicio, ya iremos viendo cosas mucho m&amp;#225;s sofisticadas y entendiendo otros temas importantes alrededor de LINQ.&lt;/p&gt;  &lt;p&gt;Feliz consulta!!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-5112927900147840660?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/5112927900147840660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=5112927900147840660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/5112927900147840660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/5112927900147840660'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/11/y-linq.html' title='y LinQ?...'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-236542097704733747</id><published>2007-11-12T18:10:00.001-08:00</published><updated>2007-11-12T18:10:07.186-08:00</updated><title type='text'>Eventos Noviembre 8, 9  y 10  de 2007</title><content type='html'>&lt;p&gt;Hola de nuevo.&lt;/p&gt;  &lt;p&gt;En esta entrada quiero dedicar un poco a los eventos de Office System 2007 y metodologia para desarrollo de aplicaciones, que tuve el placer de dictar en Barranquilla y Popay&amp;#xE1;n.    &lt;br /&gt;Comencemos por Barranquilla, ciudad calurosa para alguien que ya lleva 2 a&amp;#xF1;os en Bogot&amp;#xE1;, con un calor humano estupendo, gente linda que te recibe sin prevenciones y te hacen sentir como en casa. Estuve exactamente en un evento de la Coporaci&amp;#xF3;n Universitaria de la Costa, rodeado de estudiantes y expositores de talla internacional. Estos personajes tocaron temas de alta investigaci&amp;#xF3;n, que me hicieron regresar a tiempos atras cuando estudiaba ingenier&amp;#xED;a f&amp;#xED;sica. Pero entre todo esto, yo entr&amp;#xE9; con una charla de solo 30 minutos sobre programaci&amp;#xF3;n para Office System 2007. Creo que la gente se llev&amp;#xF3; lo que iban buscando, ya que el auditorio estaba lleno, a la expectativa del representante de Microsoft. En fin un dia sensacional en el Hotel Dann Carlton, girando al rededor del hermozo mar y el impresionante rio Magdalena. Un abrazo hermanos barranquilleros y ojala pueda volver por all&amp;#xE1;.    &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://lh6.google.com/jaortizgonzalez/RzkHYZIrN4I/AAAAAAAAAF8/Uy1xN9wbvuY/DSC00163%5B2%5D.jpg"&gt;&lt;img id="id" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="184" alt="DSC00163" src="http://lh5.google.com/jaortizgonzalez/RzkHZJIrN5I/AAAAAAAAAGE/kU6CFY5oOBM/DSC00163_thumb.jpg" width="244" border="0" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;strong&gt;&lt;font size="1"&gt;Antes del suculento pescado en salsa de coco y camarones!!&lt;/font&gt;&lt;/strong&gt;    &lt;br /&gt;    &lt;br /&gt;Con pocas horas de sue&amp;#xF1;o, part&amp;#xED; hac&amp;#xED;a mi linda Popay&amp;#xE1;n, donde me esperaban en el Colegio Mayor, con la charla sobre metodolog&amp;#xED;as para deasrrollo de software. Sin palabras, auditorio lleno, y gente muy entusiasmada por escuchar unos cuantos tips e ideas nuevas que les permitan seguir adelante, desarrollandose en sus carreras. Un abrazo a todos los que me recibieron tan amablemente, Mr JD/C gracias Totales!!    &lt;br /&gt;    &lt;br /&gt;Mis hermanos, amigos, en fin super heroes de la C&amp;#xE9;lula UNICAUCA.NET, un recibiemiento como ningun otro. Que nost&amp;#xE1;lgia pero que alegria, saber que dej&amp;#xE9; ese camino abierto que han continuado abriendo alrededor de la tecnolog&amp;#xED;a .NET. Pero m&amp;#xE1;s que tecnolog&amp;#xED;a se siente un gran calor humano, aunque bastante frio mi Popay&amp;#xE1;n, todo estuvo de maravilla. Gracias por la pizza muchachos. Al dia siguiente una marat&amp;#xF3;n de programaci&amp;#xF3;n sin muchos ganadores, pero nuevamente viendo gente comprometida, y unos super premios que no pudieron ser entregados por falta de ganadores, pero para la pr&amp;#xF3;xima muchachos. A ver si no ponen ejercicios tan d&amp;#xED;ficiles, jejeje, no mentira!!    &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://lh4.google.com/jaortizgonzalez/RzkHa5IrN6I/AAAAAAAAAGM/ppv15gJHlDI/DSC00217%5B2%5D.jpg"&gt;&lt;img id="id" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="DSC00217" src="http://lh5.google.com/jaortizgonzalez/RzkHcJIrN7I/AAAAAAAAAGU/NHyJncU-R6k/DSC00217_thumb.jpg" width="184" border="0" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;font size="1"&gt;&lt;strong&gt;Hablando de Office System 2007&lt;/strong&gt;&lt;/font&gt;    &lt;br /&gt;    &lt;br /&gt;En fin, una marat&amp;#xF3;n de eventos, sensacional, donde creo todos quedaron satisfechos, y ojala podamos seguir unidos alrededor de la tecnolog&amp;#xED;a .NET, un abrazo a todos!!    &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://lh4.google.com/jaortizgonzalez/RzkHd5IrN8I/AAAAAAAAAGc/4hUQW0cb1B4/DSC00233%5B2%5D.jpg"&gt;&lt;img id="id" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="184" alt="DSC00233" src="http://lh6.google.com/jaortizgonzalez/RzkHfZIrN9I/AAAAAAAAAGk/3hqXKNIU-Mo/DSC00233_thumb.jpg" width="244" border="0" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;strong&gt;&lt;font size="1"&gt;De izquierda a derecha, hero&amp;#xE9;s de .NET!!&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Solo me resta decirle a INETA y a Microsoft gracias por esta oportunidad, y ojala sigamos difundiendo la tecnolog&amp;#xED;a .NET para que el nuevo a&amp;#xF1;o sea lleno de satisfacciones. Nilda, Sergio, Zulma, muchas gracias!!&lt;/strong&gt;&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-236542097704733747?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/236542097704733747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=236542097704733747' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/236542097704733747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/236542097704733747'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/11/eventos-noviembre-8-9-y-10-de-2007.html' title='Eventos Noviembre 8, 9  y 10  de 2007'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-9062930056728586404</id><published>2007-10-28T18:29:00.001-07:00</published><updated>2007-10-28T18:30:22.772-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Scott Guthrie'/><title type='text'>Más y más novedades</title><content type='html'>&lt;p&gt;Comenzar&amp;#xE9; por indicarles los sitios espec&amp;#xED;ficos para acceder a todo lo referente con Silverlight 1.0 y 1.1. Descargas, ejemplos, y m&amp;#xE1;s recursos para acomodarse en primera fila, y poder aprender una tecnolog&amp;#xED;a que muy pronto estar&amp;#xE9; compitiendo fuertemente con el ya conocido Flash y dem&amp;#xE1;s engendros!!   &lt;br /&gt;&lt;a href="http://www.microsoft.com/silverlight/halo3.aspx"&gt;http://www.microsoft.com/silverlight/halo3.aspx&lt;/a&gt;    &lt;br /&gt;&lt;a title="http://weblogs.asp.net/scottgu/" href="http://weblogs.asp.net/scottgu/"&gt;http://weblogs.asp.net/scottgu/&lt;/a&gt;    &lt;br /&gt;&lt;a title="http://silverlight.net/" href="http://silverlight.net/"&gt;http://silverlight.net/&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://silverlight.net/learn/learnvideos.aspx"&gt;http://silverlight.net/learn/learnvideos.aspx&lt;/a&gt;    &lt;br /&gt;Ayuda intellisense para Silverlight aqui:    &lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/08/01/vs-2008-javascript-intellisense-for-silverlight.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2007/08/01/vs-2008-javascript-intellisense-for-silverlight.aspx&lt;/a&gt;    &lt;br /&gt;Y si quiere un alfa de Silverlight 1.1 para trabajrlo desde VS.NET    &lt;br /&gt;&lt;a title="http://silverlight.net/getstarted/" href="http://silverlight.net/getstarted/"&gt;http://silverlight.net/getstarted/&lt;/a&gt;    &lt;br /&gt;    &lt;br /&gt;El se&amp;#xF1;or Miguel de Icaza y Su Moonlight, el Silverlight para Linux, mmm.    &lt;br /&gt;&lt;a href="http://mono-project.com/Moonlight"&gt;http://mono-project.com/Moonlight&lt;/a&gt;    &lt;br /&gt;Yo le sugeriria a los de Mono que primero organicen mejor esta p&amp;#xE1;gina.    &lt;br /&gt;    &lt;br /&gt;Y esto si para comprar palomitas. Microsoft libera el Service Pack I de Microsoft .NET Micro Framework SDX 2.0, para todo lo referente con Hardware Miniatura, ofreciendo las siguientes caracter&amp;#xED;sticas:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Integraci&amp;#xF3;n con VS&lt;/li&gt;    &lt;li&gt;Librerias y drivers de c&amp;#xF3;digo manejado&lt;/li&gt;    &lt;li&gt;Emulador extensible&lt;/li&gt;    &lt;li&gt;Protecci&amp;#xF3;nde memoria flash&lt;/li&gt;    &lt;li&gt;Herramienta de gesti&amp;#xF3;n de la memoeria flash&lt;/li&gt;    &lt;li&gt;Herramienta de generaci&amp;#xF3;n de fuentes&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Para mayor informaci&amp;#xF3;n:    &lt;br /&gt;&lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=32f5df20-6c95-4fe8-a76c-0ed56a839ad2&amp;amp;DisplayLang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=32f5df20-6c95-4fe8-a76c-0ed56a839ad2&amp;amp;DisplayLang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=32f5df20-6c95-4fe8-a76c-0ed56a839ad2&amp;amp;DisplayLang=en&lt;/a&gt;&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-9062930056728586404?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/9062930056728586404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=9062930056728586404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/9062930056728586404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/9062930056728586404'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/10/ms-y-ms-novedades.html' title='Más y más novedades'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-1782479053384130000</id><published>2007-10-19T21:40:00.001-07:00</published><updated>2007-10-19T21:40:06.276-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ListBox'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>ListBox Multiselect</title><content type='html'>&lt;p&gt;Hola de nuevo   &lt;br /&gt;    &lt;br /&gt;Hace unos dias, adicion&amp;#xE9; un control ListBox a una de mis p&amp;#xE1;ginas. El control deber&amp;#xED;a utilizar la propiedad SelectionMode = Multiple, permitiendome seleccionar varias opciones del control.&amp;#xA0; Para mi sorpresa, cuando intentaba hacer esto, y en mi c&amp;#xF3;digo detectar las opciones seleccionadas, sencillamente solo me retornaba como seleccionada, la primera opci&amp;#xF3;n.     &lt;br /&gt;Supongamos que cargo mi control en el primer postback de este modo:&lt;/p&gt; &lt;font color="#0000ff" size="2"&gt;   &lt;p&gt;if&lt;/p&gt;   &lt;font size="2"&gt;&lt;font color="#000000"&gt; (!Page.IsPostBack)       &lt;br /&gt;&lt;/font&gt;{      &lt;br /&gt;&amp;#xA0; ListBox1.Items.Add(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ListItem&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Rock and Roll&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;,&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;1&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;));     &lt;br /&gt;&amp;#xA0; ListBox1.Items.Add(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ListItem&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Country&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;,&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;1&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;));     &lt;br /&gt;&amp;#xA0; ListBox1.Items.Add(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ListItem&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Salsa&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;1&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;));     &lt;br /&gt;}      &lt;br /&gt;      &lt;br /&gt;Diganme que notan algo peculiar, porque a m&amp;#xED; me tom&amp;#xF3; medio dia darme cuenta del causante de este problema. Si se&amp;#xF1;ores, el c&amp;#xF3;digo asociado a cada opci&amp;#xF3;n es el mismo, ese es el &amp;quot;problema&amp;quot;. No es cuesti&amp;#xF3;n de fijarle AutoPostback=true al control, como sugieren algunos foros, no es fijar la propiedad SmartNavigation=true en VS.NET 2003, no es la forma de recorrer el control para saber qu&amp;#xE9; opciones est&amp;#xE1;n seleccionadas, no se&amp;#xF1;ores, deben es evitar que el c&amp;#xF3;digo se repita, y de este modo el problema desaparace. Por ejemplo cuando tengan esto en un bot&amp;#xF3;n que me permita imprimir los items seleccionados, el programa debe funcionar sin ningun problema, y sin mostrar como seleccionada solo la primera opci&amp;#xF3;n de su listado.      &lt;br /&gt;&lt;font color="#0000ff" size="2"&gt;       &lt;br /&gt;foreach&lt;/font&gt;&lt;font color="#000000" size="2"&gt; (&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ListItem&lt;/font&gt;&lt;font color="#000000" size="2"&gt; miItem &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;in&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; ListBox1.Items)         &lt;br /&gt;&lt;/font&gt;{        &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;#xA0; if&lt;/font&gt;&lt;font size="2"&gt; (miItem.Selected)       &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; Response.Write(miItem.Text);        &lt;br /&gt;}        &lt;br /&gt;        &lt;br /&gt;Dos moralejas, primera hay foros alimentados por personas realmente perversas que terminan confundiendo a sus usuarios y segunda, a m&amp;#xED; modo de ver aqui hay o un bug o algo que a m&amp;#xED; parecer no deber&amp;#xED;a tener este comportamiento.        &lt;br /&gt;        &lt;br /&gt;Feliz soluci&amp;#xF3;n!!&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-1782479053384130000?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/1782479053384130000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=1782479053384130000' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1782479053384130000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1782479053384130000'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/10/listbox-multiselect.html' title='ListBox Multiselect'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-6595184856138836835</id><published>2007-10-14T19:08:00.001-07:00</published><updated>2007-10-14T19:09:45.904-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ineta'/><category scheme='http://www.blogger.com/atom/ns#' term='Revista'/><title type='text'>Orador INETA Latam Reload!!</title><content type='html'>&lt;p&gt;Es un agrado para m&amp;#xED;, nuevamente ver mi nombre por segundo a&amp;#xF1;o, entre los oradores regionales de INETA Latam, solo decir gracias!!   &lt;br /&gt;&lt;a title="http://www.inetalatam.org/MostrarOradores.aspx?Type=Regionales&amp;amp;Titulo=Regionales" href="http://www.inetalatam.org/MostrarOradores.aspx?Type=Regionales&amp;amp;Titulo=Regionales"&gt;http://www.inetalatam.org/MostrarOradores.aspx?Type=Regionales&amp;amp;Titulo=Regionales&lt;/a&gt;    &lt;br /&gt;    &lt;br /&gt;Invitarlos a que participen de esto y aprovechen esta gran oportunidad para apoyar a las comunidades con su conocimiento, y por supuesto el reconocimiento que todo esto conlleva.    &lt;br /&gt;    &lt;br /&gt;Adem&amp;#xE1;s invitarlos a descagar los n&amp;#xFA;meros de la revista t&amp;#xE9;cnica de INETA, que cada mes est&amp;#xE1; cargada con excelente informaci&amp;#xF3;n que les puede servir en su trabajo cotidiano y nos mantiene al dia con lo que pasa en las comunidades y por supuesto con INETA.    &lt;br /&gt;&lt;a title="http://www.inetalatam.org/Revista/Revista.aspx" href="http://www.inetalatam.org/Revista/Revista.aspx"&gt;http://www.inetalatam.org/Revista/Revista.aspx&lt;/a&gt;    &lt;br /&gt;    &lt;br /&gt;Feliz reelecci&amp;#xF3;n!!&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-6595184856138836835?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/6595184856138836835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=6595184856138836835' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/6595184856138836835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/6595184856138836835'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/10/orador-ineta-latam-reload.html' title='Orador INETA Latam Reload!!'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-4846826474242065740</id><published>2007-10-13T18:54:00.001-07:00</published><updated>2007-10-13T18:54:56.631-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Patrones'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Escribiendo buen código parte I</title><content type='html'>&lt;p&gt;Hola de nuevo&lt;/p&gt;  &lt;p&gt;En esta ocasi&amp;#xF3;n quiero comenzar con una serie de ejemplos que muestren c&amp;#xF3;mo se debe escribir buen c&amp;#xF3;digo en las aplicaciones. Es decir, tener en cuenta los recursos de la m&amp;#xE1;quina en la que se van a ejecutar nuestras aplicaciones, ya que aunque hoy en dia el hardware nos favorece en gran medida nuestras metidas de pata con el software, en cualquier momento nuestras aplicaciones se van a ver seriamente afectadas en rendimiento, y por lo tanto llegar a causar errores o el serio aburrimiento de nuestros usuarios.&lt;/p&gt;  &lt;p&gt;Utilizar propiedades en nuestras aplicaciones es mi primer recomendado:&lt;/p&gt;  &lt;p&gt;1. No m&amp;#xE1;s variables p&amp;#xFA;blicas, no m&amp;#xE1;s m&amp;#xE9;todos al estilo get y set.    &lt;br /&gt;2. Las propiedades son el mejor remedio para la encapsulaci&amp;#xF3;n, si se&amp;#xF1;ores ellas exponen nuestros miembros de datos como parte de una interfaz p&amp;#xFA;blica.     &lt;br /&gt;3. Las propiedades nos permiten acceder nuestras variables y al mismo tiempo manipular su comportamiento, ya que las propiedades utilizan m&amp;#xE9;todos.     &lt;br /&gt;4. Escribiendo propiedades tenemos acceso en un solo punto, para cambiar, o agregar funcionalidad seg&amp;#xFA;n lo necesitemos. Por ejemplo, si decidimos que nuestro cliente no deber&amp;#xE1; aceptar nombres en blanco podemos hacer lo siguiente:&lt;/p&gt;  &lt;p&gt;public class Customer    &lt;br /&gt;{     &lt;br /&gt;&amp;#xA0; private string _name;     &lt;br /&gt;&amp;#xA0; public string Name     &lt;br /&gt;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; get     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; return _name;     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; }     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; set     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; if (( value == null ) ||     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; ( value.Length == 0 ))     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; throw new ArgumentException( &amp;quot;Name cannot be blank&amp;quot;,     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &amp;quot;Name&amp;quot; );     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; _name = value;     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; }     &lt;br /&gt;&amp;#xA0; }     &lt;br /&gt;    &lt;br /&gt;&amp;#xA0; // ...     &lt;br /&gt;}     &lt;br /&gt;    &lt;br /&gt;Con esto ya no tenemos el problema causado por las variables p&amp;#xFA;blicas, donde tendr&amp;#xED;amos que buscar en cada lugar de nuestro mar de c&amp;#xF3;digo, donde esa variable se utiliz&amp;#xF3; para hacer algo similar en muchas partes del c&amp;#xF3;digo.     &lt;br /&gt;    &lt;br /&gt;5. Adicionar manejo de hilos es mucho m&amp;#xE1;s sencillo, o si no que lo diga el ejemplo:     &lt;br /&gt;    &lt;br /&gt;public string Name     &lt;br /&gt;{     &lt;br /&gt;&amp;#xA0; get     &lt;br /&gt;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; lock( this )     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; return _name;     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; }     &lt;br /&gt;&amp;#xA0; }     &lt;br /&gt;&amp;#xA0; set     &lt;br /&gt;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; lock( this )     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; _name = value;     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; }     &lt;br /&gt;&amp;#xA0; }     &lt;br /&gt;}     &lt;br /&gt;    &lt;br /&gt;6. Ya que t&amp;#xE9;cnicamente las propiedades son m&amp;#xE9;todos, estas heredan todas sus caracter&amp;#xED;sticas, por ejemplo poder ser virtuales:     &lt;br /&gt;public class Customer     &lt;br /&gt;{     &lt;br /&gt;&amp;#xA0; private string _name;     &lt;br /&gt;&amp;#xA0; public virtual string Name     &lt;br /&gt;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; get     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; return _name;     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; }     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; set     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; _name = value;     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; }     &lt;br /&gt;&amp;#xA0; }     &lt;br /&gt;    &lt;br /&gt;&amp;#xA0; // remaining implementation omitted     &lt;br /&gt;}     &lt;br /&gt;    &lt;br /&gt;Propiedades abstractas, o quiza ser parte de una definici&amp;#xF3;n de interfaces:     &lt;br /&gt;    &lt;br /&gt;public interface INameValuePair     &lt;br /&gt;{     &lt;br /&gt;&amp;#xA0; object Name     &lt;br /&gt;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; get;     &lt;br /&gt;&amp;#xA0; }     &lt;br /&gt;&amp;#xA0; object Value     &lt;br /&gt;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; get;     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; set;     &lt;br /&gt;&amp;#xA0; }     &lt;br /&gt;}     &lt;br /&gt;    &lt;br /&gt;7. En C# 2.0 podemos establecer diferentes modificadores de acceso para los m&amp;#xE9;todos get y set de nuestras propiedades. Por ejmplo, esto es v&amp;#xE1;lido:     &lt;br /&gt;    &lt;br /&gt;// Legal C# 2.0:     &lt;br /&gt;public class Customer     &lt;br /&gt;{     &lt;br /&gt;&amp;#xA0; private string _name;     &lt;br /&gt;&amp;#xA0; public virtual string Name     &lt;br /&gt;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; get     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; return _name;     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; }     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; protected set     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; _name = value;     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; }     &lt;br /&gt;&amp;#xA0; }     &lt;br /&gt;    &lt;br /&gt;&amp;#xA0; // remaining implementation omitted     &lt;br /&gt;}     &lt;br /&gt;    &lt;br /&gt;8. Igualmente el uso de indexadores en las propiedades es permitido, haciendo de esto algo muy poderoso:     &lt;br /&gt;    &lt;br /&gt;public int this [ int index ]     &lt;br /&gt;{     &lt;br /&gt;&amp;#xA0; get     &lt;br /&gt;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; return _theValues [ index ] ;     &lt;br /&gt;&amp;#xA0; }     &lt;br /&gt;&amp;#xA0; set     &lt;br /&gt;&amp;#xA0; {     &lt;br /&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0; _theValues[ index ] = value;     &lt;br /&gt;&amp;#xA0; }     &lt;br /&gt;}     &lt;br /&gt;    &lt;br /&gt;// Accessing an indexer:     &lt;br /&gt;int val = MyObject[ i ];     &lt;br /&gt;    &lt;br /&gt;9. La legibilidadd del c&amp;#xF3;digo es una ventaja m&amp;#xE1;s, ya que accedemos a nuestros miembros de clases utilizando nombres significativos y f&amp;#xE1;ciles de entender para asignar u obtener la data.     &lt;br /&gt;string name = customerOne.Name;     &lt;br /&gt;customerOne.Name = &amp;quot;This Company, Inc.&amp;quot;; &lt;/p&gt;  &lt;p&gt;Esto y otras consideraciones son muy importantes, y nos pueden ahorrar dolores de cabeza m&amp;#xE1;s adelante. Les queda de tarea analizar por ejemplo qu&amp;#xE9; ocurre con el MSIL generado para nuestras propiedades. Y finalmente decilres que a nivel de desempe&amp;#xF1;o, entre propiedades y m&amp;#xE9;todos normales que accedan campos p&amp;#xFA;blicos, aunque estos &amp;#xFA;ltimos pudieran en algun momento dado ser m&amp;#xE1;s r&amp;#xE1;pidos, la verdad es que el comportamiento inline de los m&amp;#xE9;todos definidos para las propiedades, hace que el JIT o el compilador justo a tiempo del Framework, ponga a la par en rendimiento las diferentes t&amp;#xE9;cnicas. No olviden, los miembros deben ser privados y nuestras propiedades ser&amp;#xE1;n los puntos por los cuales accedemos y modificamos la informaci&amp;#xF3;n de dichos miembros.&lt;/p&gt;  &lt;p&gt;Feliz buena pr&amp;#xE1;ctica!!&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-4846826474242065740?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/4846826474242065740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=4846826474242065740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/4846826474242065740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/4846826474242065740'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/10/escribiendo-buen-cdigo-parte-i.html' title='Escribiendo buen código parte I'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-7631129241880466559</id><published>2007-09-08T23:30:00.000-07:00</published><updated>2007-12-01T13:46:02.475-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='GDI+'/><category scheme='http://www.blogger.com/atom/ns#' term='XAML'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>WPF Video</title><content type='html'>&lt;div align="left"&gt;&lt;span style="font-size: 85%; font-family: arial"&gt;Es la 1:30 am, y el sue&amp;#241;o ya no me venci&amp;#243;. As&amp;#237; que decid&amp;#237; escribir esta entrada sobre WPF y una tonta comparaci&amp;#243;n con GDI+.     &lt;br /&gt;      &lt;br /&gt;Supongamos que quiero dibujar un cubo con algo de pintura en un windows form.      &lt;br /&gt;      &lt;br /&gt;private void Form1_Paint(object sender, PaintEventArgs e)&lt;/span&gt;&lt;/div&gt;  &lt;div align="left"&gt;&lt;span style="font-size: 85%; font-family: arial"&gt;{&lt;/span&gt;&lt;/div&gt;  &lt;div align="left"&gt;&lt;span style="font-size: 85%; font-family: arial"&gt;GraphicsPath miPath = new GraphicsPath();LinearGradientBrush miBrochaGradiente = new LinearGradientBrush(new Rectangle(20, 20, 200, 150),Color.Blue,Color.Black,LinearGradientMode.ForwardDiagonal);Graphics miGrafico = this.CreateGraphics();//Iniciar una figuramiPath.StartFigure();miPath.AddRectangle(new Rectangle(20, 20, 200, 150));miGrafico.FillRectangle(miBrochaGradiente,20,20,200,150);miPath.AddRectangle(new Rectangle(50, 50, 200, 150));miPath.AddLine(20, 20, 50, 50);miPath.StartFigure();miPath.AddLine(220, 20, 250, 50);miPath.StartFigure();miPath.AddLine(220, 170, 250, 200);miPath.StartFigure();miPath.AddLine(20, 170, 50, 200);//Dibujando el pathPen miLapiz = new Pen(Color.Red, 3);miGrafico.DrawPath(miLapiz, miPath);miPath.Dispose();miLapiz.Dispose();miBrochaGradiente.Dispose();&lt;/span&gt;&lt;/div&gt;  &lt;div align="left"&gt;&lt;span style="font-size: 85%; font-family: arial"&gt;}     &lt;br /&gt;&lt;/span&gt;    &lt;br /&gt;&lt;/div&gt;  &lt;div align="left"&gt;&lt;span style="font-size: 85%; font-family: arial"&gt;&lt;img id="BLOGGER_PHOTO_ID_5108099928874139394" style="display: block; margin: 0px auto 10px; cursor: hand; text-align: center" alt="" src="http://bp0.blogger.com/_tP7sdi3BZ2A/RuOd0km9vwI/AAAAAAAAABk/wAiGQfEm11I/s320/cuboGDI%2B.JPG" border="0" /&gt;      &lt;br /&gt;Sencillo cierto? un path, que me permite construir una figura a partir de figuras primitivas, las cuales pueden ser: l&amp;#237;neas, arcos, rect&amp;#225;ngulos, elipses, pol&amp;#237;gonos, y cuantas m&amp;#225;s figuras se les puedan ocurrir como clases trae el framework para esto. Bien la cosa es que todo esto forma una sola entidad, y en mi sencillo ejemplo, es cuesti&amp;#243;n de rect&amp;#225;ngulos y l&amp;#237;neas. Oh claro no olviden hacerle Dispose a cada una de sus instancias gr&amp;#225;ficas, en este caso al objeto que permite hacer el dibujado sobre la forma (miGrafico), el objeto (miPath) quien representa los rect&amp;#225;ngulos y l&amp;#237;neas, y los objetos encargados de ponerle color al asunto (miLapiz y miBrochaGradiente).      &lt;br /&gt;Bueno hasta este punto esto ya se pone aburridor y me comienza a dar sue&amp;#241;o. Pero se me ocurre que puedo rotar mi cubo. Qu&amp;#233;!! Rotar este cubo a estas horas de la madrugada, no se&amp;#241;or, y con GDI+, esto no lo acepto. Y que tal si adem&amp;#225;s de rotarlo, en cada una de sus caras muestro un video. Pues yo creo que esto es una pesadilla. Pues no se&amp;#241;ores es aqu&amp;#237; cuando WPF (Windows presentation foundation) llega al rescate.      &lt;br /&gt;Dejando la tonter&amp;#237;a atr&amp;#225;s quiero mostrarles como se puede lograr esto. Qu&amp;#233; necesitan? Framework 3.0 o 3.5 y de ah&amp;#237; en adelante mucha pero mucha creatividad. Aqu&amp;#237; va y que tengan lindos sue&amp;#241;os. &lt;/span&gt;&lt;/div&gt;  &lt;div align="left"&gt;   &lt;br /&gt;&amp;lt;Window    &lt;br /&gt;&amp;#160; x:Class=&amp;quot;RichContent.Window1&amp;quot;&amp;#160; &lt;br /&gt; xmlns=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160; xmlns:x=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml""&gt;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160; Title=&amp;quot;RichContent&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;Grid MouseLeftButtonDown=&amp;quot;Evento&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;Viewport3D&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Viewport3D.Camera&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PerspectiveCamera     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FarPlaneDistance=&amp;quot;20&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; LookDirection=&amp;quot;0,-0.65,-1&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UpDirection=&amp;quot;0,1,0&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NearPlaneDistance=&amp;quot;1&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Position=&amp;quot;0,2,3&amp;quot; FieldOfView=&amp;quot;40&amp;quot; x:Name=&amp;quot;Camara&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Viewport3D.Camera&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ModelVisual3D&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ModelVisual3D.Content&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Model3DGroup&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;AmbientLight Color=&amp;quot;White&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;GeometryModel3D&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;GeometryModel3D.Geometry&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;MeshGeometry3D     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TriangleIndices=&amp;quot;0,1,2 3,4,5 6,7,8 9,10,11 12,13,14 15,16,17 18,19,20 21,22,23 24,25,26 27,28,29 30,31,32 33,34,35 &amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Normals=&amp;quot;0,0,-1 0,0,-1 0,0,-1 0,0,-1 0,0,-1 0,0,-1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,-1,0 0,-1,0 0,-1,0 0,-1,0 0,-1,0 0,-1,0 1,0,0 1,0,0 1,0,0 1,0,0 1,0,0 1,0,0 0,1,0 0,1,0 0,1,0 0,1,0 0,1,0 0,1,0 -1,0,0 -1,0,0 -1,0,0 -1,0,0 -1,0,0 -1,0,0 &amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TextureCoordinates=&amp;quot;1,1 1,0 0,0 0,0 0,1 1,1 0,1 1,1 1,0 1,0 0,0 0,1 0,1 1,1 1,0 1,0 0,0 0,1 1,1 1,0 0,0 0,0 0,1 1,1 1,0 0,0 0,1 0,1 1,1 1,0 0,0 0,1 1,1 1,1 1,0 0,0 &amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Positions=&amp;quot;-0.5,-0.5,-0.5 -0.5,0.5,-0.5 0.5,0.5,-0.5 0.5,0.5,-0.5 0.5,-0.5,-0.5 -0.5,-0.5,-0.5 -0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5 -0.5,-0.5,-0.5 0.5,-0.5,-0.5 0.5,-0.5,0.5 0.5,-0.5,0.5 -0.5,-0.5,0.5 -0.5,-0.5,-0.5 0.5,-0.5,-0.5 0.5,0.5,-0.5 0.5,0.5,0.5 0.5,0.5,0.5 0.5,-0.5,0.5 0.5,-0.5,-0.5 0.5,0.5,-0.5 -0.5,0.5,-0.5 -0.5,0.5,0.5 -0.5,0.5,0.5 0.5,0.5,0.5 0.5,0.5,-0.5 -0.5,0.5,-0.5 -0.5,-0.5,-0.5 -0.5,-0.5,0.5 -0.5,-0.5,0.5 -0.5,0.5,0.5 -0.5,0.5,-0.5 &amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/GeometryModel3D.Geometry&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;GeometryModel3D.Transform&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;RotateTransform3D&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;RotateTransform3D.Rotation&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;AxisAngleRotation3D     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x:Name=&amp;quot;MyRotation3D&amp;quot; Angle=&amp;quot;45&amp;quot; Axis=&amp;quot;0 1 0&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/RotateTransform3D.Rotation&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/RotateTransform3D&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/GeometryModel3D.Transform&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;GeometryModel3D.Material&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;DiffuseMaterial&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;DiffuseMaterial.Brush&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;VisualBrush&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;VisualBrush.Visual&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;MediaElement LoadedBehavior=&amp;quot;Play&amp;quot; UnloadedBehavior=&amp;quot;Close&amp;quot; Source = &amp;quot;D:\M&amp;#250;sica\Radiohead\Radiohead live at Glastonbury 2003.avi&amp;quot; Name=&amp;quot;Media&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/VisualBrush.Visual&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/VisualBrush&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/DiffuseMaterial.Brush&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/DiffuseMaterial&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/GeometryModel3D.Material&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/GeometryModel3D&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Model3DGroup&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/ModelVisual3D.Content&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/ModelVisual3D&amp;gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Viewport3D.Triggers&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EventTrigger RoutedEvent=&amp;quot;Viewport3D.Loaded&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EventTrigger.Actions&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;BeginStoryboard&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Storyboard&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;DoubleAnimation From=&amp;quot;0&amp;quot; To=&amp;quot;360&amp;quot; Duration=&amp;quot;0:0:5&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Storyboard.TargetName=&amp;quot;MyRotation3D&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Storyboard.TargetProperty=&amp;quot;Angle&amp;quot; RepeatBehavior=&amp;quot;Forever&amp;quot; Name=&amp;quot;Animacion&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Storyboard&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/BeginStoryboard&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/EventTrigger.Actions&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/EventTrigger&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Viewport3D.Triggers&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160; &amp;lt;/Viewport3D&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Button HorizontalAlignment=&amp;quot;Left&amp;quot; Margin=&amp;quot;7,10,0,236&amp;quot; Name=&amp;quot;button1&amp;quot; Width=&amp;quot;58&amp;quot;&amp;#160; Click=&amp;quot;Evento&amp;quot; &amp;gt;Button&amp;lt;/Button&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBox Height=&amp;quot;20&amp;quot; Margin=&amp;quot;11,42,0,0&amp;quot; Name=&amp;quot;textBox1&amp;quot;&amp;#160; VerticalAlignment=&amp;quot;Top&amp;quot; HorizontalAlignment=&amp;quot;Left&amp;quot; Width=&amp;quot;20&amp;quot; TextChanged=&amp;quot;Cambio&amp;quot;&amp;gt;&amp;lt;/TextBox&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBox Height=&amp;quot;20&amp;quot; Margin=&amp;quot;11,72,0,0&amp;quot; Name=&amp;quot;textBox2&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; HorizontalAlignment=&amp;quot;Left&amp;quot; Width=&amp;quot;20&amp;quot; TextChanged=&amp;quot;Cambio&amp;quot;&amp;gt;&amp;lt;/TextBox&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBox Height=&amp;quot;20&amp;quot; Margin=&amp;quot;11,102,0,0&amp;quot; Name=&amp;quot;textBox3&amp;quot;&amp;#160; VerticalAlignment=&amp;quot;Top&amp;quot; HorizontalAlignment=&amp;quot;Left&amp;quot; Width=&amp;quot;20&amp;quot; TextChanged=&amp;quot;Cambio&amp;quot;&amp;gt;&amp;lt;/TextBox&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBox Height=&amp;quot;20&amp;quot; Margin=&amp;quot;11,132,0,0&amp;quot; Name=&amp;quot;textBox4&amp;quot;&amp;#160; VerticalAlignment=&amp;quot;Top&amp;quot; HorizontalAlignment=&amp;quot;Left&amp;quot; Width=&amp;quot;20&amp;quot; TextChanged=&amp;quot;Cambio&amp;quot;&amp;gt;&amp;lt;/TextBox&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Slider Height=&amp;quot;23&amp;quot; Margin=&amp;quot;78,9,83,0&amp;quot; Name=&amp;quot;slider1&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; Maximum=&amp;quot;59&amp;quot; ValueChanged=&amp;quot;Cambio&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Label Height=&amp;quot;24.2766666666667&amp;quot; HorizontalAlignment=&amp;quot;Right&amp;quot; Margin=&amp;quot;0,2.72333333333333,7,0&amp;quot; Name=&amp;quot;label1&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; Width=&amp;quot;72.63&amp;quot;&amp;gt;Label&amp;lt;/Label&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;/Grid&amp;gt;    &lt;br /&gt;&amp;lt;/Window&amp;gt;&lt;/p&gt;  &lt;div align="left"&gt;   &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://bp2.blogger.com/_tP7sdi3BZ2A/RuOeHEm9vxI/AAAAAAAAABs/8q11Phzr8sU/s1600-h/cuboWPF.JPG"&gt;&lt;span style="font-size: 85%; font-family: arial"&gt;&lt;img id="BLOGGER_PHOTO_ID_5108100246701719314" style="display: block; margin: 0px auto 10px; cursor: hand; text-align: center" alt="" src="http://bp2.blogger.com/_tP7sdi3BZ2A/RuOeHEm9vxI/AAAAAAAAABs/8q11Phzr8sU/s320/cuboWPF.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 85%; font-family: arial"&gt; Lo anterior damas y caballeros, es el peque&amp;#241;o fragmento de c&amp;#243;digo XAML que hace toda la tarea que yo quise hacer con GDI+. La verdad es para m&amp;#237; un fragmento de c&amp;#243;digo muy corto, comparado con todo lo que esto hace por nosotros, clases muy potentes que nos proporcionan estos lujos.     &lt;br /&gt;      &lt;br /&gt;Hay unos pocos controles que adicion&amp;#233; para controlar la rotaci&amp;#243;n del cubo, lo cual es otra caracter&amp;#237;stica m&amp;#225;s, adem&amp;#225;s de producir XAML (si cr&amp;#233;anme, producir, y a cargo de dise&amp;#241;adores gr&amp;#225;ficos), nosotros como desarrolladores C#, seguimos escribiendo nuestro code behind como ven&amp;#237;amos haci&amp;#233;ndolo. Y al ritmo de Radio Head aqu&amp;#237; est&amp;#225;:      &lt;br /&gt;      &lt;br /&gt;// Sample event handler:      &lt;br /&gt;private void Evento(object sender, EventArgs e)      &lt;br /&gt;{      &lt;br /&gt;// Media.Source = new Uri(&amp;quot;D:\\M&amp;#250;sica\\James Morrison - The Last Goodbye.mp3&amp;quot;);      &lt;br /&gt;}      &lt;br /&gt;      &lt;br /&gt;private void Cambio(object sender, EventArgs e)      &lt;br /&gt;{      &lt;br /&gt;      &lt;br /&gt;if (textBox1.Text.Length &amp;gt; 0 &amp;amp;&amp;amp; textBox2.Text.Length &amp;gt; 0 &amp;amp;&amp;amp; textBox3.Text.Length &amp;gt; 0)      &lt;br /&gt;{      &lt;br /&gt;Vector3D miV3D = new Vector3D(Double.Parse(textBox1.Text), Double.Parse(textBox2.Text), Double.Parse(textBox3.Text)); MyRotation3D.Axis = miV3D; } if (textBox4.Text.Length &amp;gt; 0) MyRotation3D.Angle = Double.Parse(textBox4.Text); TimeSpan miTs = new TimeSpan(0,0,Convert.ToInt32(slider1.Value)); Duration miDuracion = new Duration(miTs); Animacion.Duration = miDuracion; label1.Content = miTs.Hours.ToString() + &amp;quot;:&amp;quot; + miTs.Minutes.ToString() + &amp;quot;:&amp;quot; + miTs.Seconds.ToString(); Camara.UpDirection = new Vector3D(0, 1, slider1.Value);      &lt;br /&gt;}      &lt;br /&gt;}      &lt;br /&gt;      &lt;br /&gt;Bueno recueden, deberan apuntar a su propio video, tengo comentada la l&amp;#237;nea del manejador Evento(), porque ah&amp;#237; muestro c&amp;#243;mo puedo cargar por ejemplo un archivo de audio. Claro se&amp;#241;ores, no solo de video vive el hombre.      &lt;br /&gt;      &lt;br /&gt;Bueno solo dejo a su imaginaci&amp;#243;n todo lo que puede llegar hacer con esto, no siendo m&amp;#225;s&amp;#8230; WPF los mat&amp;#243; a todos!!      &lt;br /&gt;      &lt;br /&gt;La imaginaci&amp;#243;n es m&amp;#225;s importante que el conocimiento      &lt;br /&gt;Albert Einstein&lt;/span&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-7631129241880466559?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/7631129241880466559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=7631129241880466559' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/7631129241880466559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/7631129241880466559'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/09/wpf-video.html' title='WPF Video'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_tP7sdi3BZ2A/RuOd0km9vwI/AAAAAAAAABk/wAiGQfEm11I/s72-c/cuboGDI%2B.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-2647160185387321670</id><published>2007-09-01T06:32:00.000-07:00</published><updated>2007-10-06T16:35:01.796-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET Show'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>The .NET Show: The Final Episode - Silverlight</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;Es tiempo de decirle adiós a una de las mejores iniciativas de Microsoft, en pro de los desarrolladores. Lastimosamente veo anunciado el episodio final del .NET Show, que lástima pero bueno sus razones tendrán.&lt;br /&gt;&lt;br /&gt;http://blogs.msdn.com/theshow/archive/2007/08/14/the-net-show-the-final-episode-silverlight.aspx&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-2647160185387321670?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/2647160185387321670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=2647160185387321670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/2647160185387321670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/2647160185387321670'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/09/net-show-final-episode-silverlight.html' title='The .NET Show: The Final Episode - Silverlight'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-1575337069057469403</id><published>2007-08-23T16:27:00.001-07:00</published><updated>2007-10-06T16:36:05.470-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Patrones'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitectura'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Digame Patrón</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;Hola de nuevo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Esta ves quiero regresar a bloguear con un tema que definitivamente es de mucha importancia para todos los que tratamos de desarrollar software. Todos ya nos conocemos el tema aquel de análizar, diseñar, construir, probar... Y en cada una de estas etapas, algunos consagrados y juiciosos personajes han encontrado soluciones generales a problemas bastante específicos. Soluciones que no están restringidas a ningún lenguaje, tecnología o herramienta. Si señores, son los patrones, que nos contextualizan, nos emprobleman, pero al final nos dan una solución. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Y espero de aqui en adelante, basado en el documento "Enterprise Solution Patterns Using Microsoft .NET v2.0" de lo señores de Patterns &amp;amp; Practices, regalarles algunos tips de lo que encuentro ahi como lo más relevante. Acerca de esto no se ha dicho la última palabra, pero los patrones aqui expuestos son la base filosofica y metafisica de miles de aplicaciones ejecutandose en el mundo, por qué? porque nos facilitan la vida, cuando esta se vuelve un ocho en aplicaciones de clase empresarial. No siendo más espero sea de su utilidad.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Patrones para soluciones empresariales utilizando Microsoft .NET&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Lo primero es pensar en que todo sistema empresarial debe concebirse simple y crecerá con el tiempo. Esto radica en que cualquier cosa simple trabaja mientras necesite ser reemplazada. La idea es encontrar patrones que sirvan a lo simple y a lo complejo en tiempos distintos. No significa que un patrón lo haga mal y el otro lo haga correctamente, significa que cada patrón se acomoda a un momento dado del proyecto. Muchos objetos en .NET ya implementan varios patrones, así que la idea es utilizarlos y no implementar el patrón desde el principio.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;La idea es presentar 32 patrones que expandan varios puntos de vista, y mostrar como pueden ser integrados en una aplicación empresarial. Visualizar los patrones como un lenguaje para expresar experiencias de diseño. Los patrones proporcionan un lenguaje común a arquitectos y desarrolladores para acortar la brecha entre las dos disciplinas.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Las soluciones de negocio de clase empresarial, son a menudo extremadamente complejas y deben ejecutarse bien frente a las altas expectativas. No solo deben ser altamente disponibles y escalables de cara a lo impredecible, sino también medibles y predecibles en respuesta a requerimientos de negocio que cambian rápidamente.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Los patrones son útiles para arquitectos y desarrolladores porque:&lt;br /&gt;· Documentan mecanismos simples que trabajan&lt;br /&gt;· Proveen un vocabulario y una taxonomía común para desarrolladores y arquitectos&lt;br /&gt;· Habilitan a las soluciones para ser descritas como combinaciones de patrones.&lt;br /&gt;· Habilitan el rehúso de arquitectura, diseño, e implementación de decisiones.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Mecanismo para documentar patrones&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Un patrón describe un problema recurrente que ocurre en un contexto dado y, basado en un conjunto de lineamientos, recomienda una solución. La solución es usualmente un mecanismo simple, una colaboración entre dos o más clases, objetos, servicios, procesos, hilos, componentes, o nodos que trabajan juntos para resolver el problema identificado en el patrón.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Nota. &lt;/strong&gt;Se debe aclarar que la implementación de los patrones puede volverse compleja, y lo mostrado aquí es solo para propósitos de introducción, así que mientras más se estudian los patrones en profundidad, se pueden observar aspectos más detallados y de mayor complejidad.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Patrón Singleton&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Contexto.&lt;/strong&gt; Controlar el acceso a una clase administrando su proceso de instanciación.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Problema.&lt;/strong&gt; Una aplicación contiene un cierto tipo de data que necesita ser globalmente accedida y mantenida. Al mismo tiempo, este tipo de data es a menudo única en el sistema. Cómo proveer una interfaz accesible a una clase, pero controlar el número de instancias dentro del sistema.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Solución.&lt;/strong&gt; La clase en si misma es responsable de crear una instancia simple y proveer acceso global a esa instancia. Crear una clase que contiene una instancia estática del Singleton que es retornada con un método estático.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;public class MiSingleton&lt;br /&gt;{&lt;br /&gt;private static MiSingleton miInstancia = null&lt;br /&gt;private MiSingleton() {}&lt;br /&gt;public static MiSingleton ObtenerInstancia ()&lt;br /&gt;{&lt;br /&gt;if (miInstancia ==null)&lt;br /&gt;{&lt;br /&gt;miInstancia = new MiSingleton ()&lt;br /&gt;}&lt;br /&gt;return miInstancia&lt;br /&gt;}&lt;br /&gt;//... Funciones provistas por MiSingleton&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;El ejemplo anterior define un constructor privado, que hace que ninguna otra clase pueda instanciar a MiSingleton. La clase contiene una instancia estática miInstancia que es retornada con el método ObtenerInstancia().&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Como se puede observar, el anterior es un ejemplo muy simple, pero que muestra la implementación esencial del patrón singleton, su objetivo y toda la utilidad que puede proveer dentro de nuestras aplicaciones. Es importante aclarar que los patrones no tienen una única solución o implementación, y están pensados para ser abiertos a cada tecnología.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Patrones en niveles diferentes&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Los patrones existen en niveles diferentes de abstracción. Consideremos otro ejemplo, esta ves a un nivel más alto de abstracción que el nivel de codificación:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Estamos diseñando una aplicación basada en Web, que contiene una gran cantidad de lógica de negocio y de presentación. Cómo organizar este sistema a alto nivel para que sea flexible, débilmente acoplado, y aun así, altamente cohesivo?&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Una solución a este problema involucra organizar el sistema dentro de una serie de capas, con cada capa conteniendo elementos aproximadamente en el mismo nivel de abstracción. Se identifican las dependencias en cada capa y decidir por una estrategia de capas estricta o relajada. Luego, se decide si se va a crear un esquema de capas personalizado o adoptar un esquema de capas previamente documentado por otros. Supongamos que vamos a usar una estrategia de capas bien conocida, una capa para presentación, para la lógica del negocio y para el acceso a datos.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Si siempre diseñamos sistemas de este modo, estamos empleando un patrón ya existente, independiente de cualquier patrón generalizado. Aún así, hay muchas razones por la que queramos entender los patrones que apoyan esta aproximación de diseño. Podemos ser curiosos y preguntarnos por qué los sistemas frecuentemente se diseñan de esta manera, podemos buscar aproximaciones más óptimas a los problemas que este patrón no resuelve.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Patrón Capas&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Contexto.&lt;/strong&gt; Estamos trabajando, con un sistema grande y complejo, y queremos administrar la complejidad por descomposición.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Problema.&lt;/strong&gt; Cómo estructurar una aplicación para soportar tales requerimientos operacionales, como mantenibilidad, reusabilidad, extensibilidad, escalabilidad, robustez y seguridad?&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Solución. &lt;/strong&gt;Componer la solución dentro de un conjunto de capas. Cada capa debería ser cohesiva, y aproximadamente al mismo nivel de abstracción. Cada capa debería ser débilmente acoplada a las capas de abajo.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Esta simple estrategia, ayuda a organizar las aplicaciones para resolver dos desafíos en desarrollo de software: la administración de dependencias y la necesidad de componentes intercambiables. Construir aplicaciones sin una estrategia bien considerada para administración de dependencias, conlleva a componentes frágiles, los cuales son difíciles y costosos de mantener, extender y substituir.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Patrón de Aplicación de Tres capas&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Contexto. &lt;/strong&gt;Estamos construyendo una solución de negocio, usando capas para organizar nuestra aplicación.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Problema.&lt;/strong&gt; Cómo organizar la aplicación para reutilizar lógica de negocio, proveer flexibilidad en el deployment, y conservar conexión a recursos valiosos.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Solución. &lt;/strong&gt;Crear tres capas: presentación, lógica del negocio (dominio), y acceso a datos. Colocar todos los componentes responsables de la vista en la capa de presentación. Encapsular toda la lógica del negocio en componentes de la capa de dominio que implementan interfaces de componentes bien conocidas. Localice todo el código relacionado a la base de datos, incluyendo clientes de acceso a base de datos, y componentes de utilidad, en la capa de acceso a datos. La capa de datos es responsable por el pool de conexiones cuando acceda los recursos. Asegurarse de eliminar las dependencias entre componentes de acceso a datos, y componentes de la capa de negocio. Eliminar dependencias entre la capa de negocio y la capa de presentación o administrar las dependencias utilizando el patrón observador.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Refinamiento simple&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Cabe notar que Aplicación de tres capas es realmente un refinamiento simple de Capas; el contexto, la importancia, y la solución identificada en Capas se mantiene aplicada en Aplicación de tres capas, pero no al contrario. Esto es, el patrón Capas restringe a Aplicación de tres capas, y el patrón Aplicación de tres capas refina el patrón Capas. Esta relación de patrones es útil para administrar la complejidad. Después de que entendamos un patrón, debemos solo entender las diferencias incrementales entre el patrón inicial y los patrones que lo refinan. Otro ejemplo, esta ves en el área de servicios web, debería ayudar a ilustrar el concepto de refinamiento.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Hemos escrito una aplicación para una empresa exitosa que se expande rápidamente. Ahora queremos extender la aplicación exponiendo su motor de lógica a socios de negocio e integrar los servicios adicionales de los socios (tales como compras) dentro de la aplicación. Cómo estructuramos nuestra aplicación de negocio para proveer y consumir servicios?&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Una solución a este problema es extender el patrón Aplicación de tres capas adicionando responsabilidades relacionadas a servicios adicionales a cada capa. La capa de negocio adiciona la responsabilidad de proveer un conjunto simplificado de operaciones para aplicaciones clientes a través de Interfaces de Servicio. Las responsabilidades de la capa de acceso a datos van más allá de la base de datos e integran hosts para incluir comunicación con otros proveedores de servicios. Esta funcionalidad adicional en la capa de acceso a datos es encapsulada en componentes de Pasarelas de Servicios, los cuales son responsables por conectarse a servicios (tanto sincrónica como asincrónicamente), administrando el estado conversacional básico con el servicio, y notificando a los componentes de procesos de negocio de significativos eventos relacionados a servicios.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Patrón Servicios de tres capas&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Contexto. &lt;/strong&gt;Estamos construyendo una solución de negocio que usa capas de presentación, negocio y acceso a datos para organizar la aplicación. Queremos exponer algo de la funcionalidad central de la organización como servicios que otras aplicaciones puedan consumir y habilitar la aplicación para consumir otros servicios.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Problema. &lt;/strong&gt;Cómo organizar nuestra aplicación para proveer y consumir datos granulares y elementos lógicos de fuentes altamente variables?&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Solución. &lt;/strong&gt;Descomponer la lógica de la aplicación dentro de un conjunto de servicios colaborativos que proveen partes de la funcionalidad completa del sistema. Luego, en la capa de dominio, identificar una Interfaz de Servicios por cada servicio que es independiente de la implementación subyacente. Finalmente, extender la capa de acceso a datos para utilizar Pasarelas de Servicio, para comunicarse con otros proveedores de servicio. Si la lógica de navegación de la aplicación es suficientemente compleja, consideremos usar componentes de proceso de interfaz de usuario como parte de la capa de presentación para encapsular y reutilizar esta lógica.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Es notoria la relación entre estos patrones. Capas introduce una estrategia fundamental para organizar una aplicación de software. Aplicación de tres capas refina esta idea y la restringe a los sistemas de negocio que requieren reutilizar lógica de negocio, flexibilizar el deployment, y uso eficiente de conexiones. Aplicación de servicios de tres capas refina a Aplicación de tres capas y extiende el diseño para proveer y consumir elementos granulares de datos y lógica de fuentes altamente variables. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;Bien para terminar, ya iremos desarrollando algo práctico de todo esto, pero es muy importante iniciarse en la teoría y familiarizarse con la forma de documentar patrones, que realmente no es tan complicado, y tal ves tú, si tú, puedas encontrar nuevos patrones o refinar los existentes.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;Feliz arquitectura&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-1575337069057469403?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/1575337069057469403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=1575337069057469403' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1575337069057469403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1575337069057469403'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/08/digame-patron.html' title='Digame Patrón'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-1473737674618141506</id><published>2007-07-04T20:27:00.001-07:00</published><updated>2007-07-05T20:40:14.214-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSTO'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='AddIn'/><title type='text'>Excel AddIn con C# y VSTO</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;Hola de nuevo&lt;br /&gt;&lt;br /&gt;Retomando uno de los temas que más me gusta, aqui les traigo un ejemplo bastante sencillo acerca de cómo crear addins de Excel 2007, utilizando VSTOs con C#.&lt;br /&gt;&lt;br /&gt;Lo primero es adicionar un nuevo proyecto y seleccionar el template adecuado como le sindico en la siguiente imagen:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5083550059393350546" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp0.blogger.com/_tP7sdi3BZ2A/Roxl2GAOe5I/AAAAAAAAAA0/ffS29PbYYw0/s320/MewProject.JPG" border="0" /&gt; Luego de esto, VS crea para nosotros un proyecto de tipo AddIn de Excel, un proyecto de setup y toda una infraestructura de métodos, eventos y objetos, listos para comenzar a trabajar en el desarrollo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ahora, sobre el proyecto de AddIn, damos clic derecho y seleccionamos Add - New Item... y seleccionamos la opción Ribbon suport:&lt;img id="BLOGGER_PHOTO_ID_5083551124545239970" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp0.blogger.com/_tP7sdi3BZ2A/Roxm0GAOe6I/AAAAAAAAAA8/QjfiRYq87QI/s320/AddNewItem.JPG" border="0" /&gt;Esto de ribbon es un nuevo concepto, introducido en Office 2007, digamos para ordenar las funcionalidades en diferentes pestañas, las cuales hacen parte del Ribbon que es la combinación de las barras de herramientas y el menú, que antes lo veiamos como una fila de botones.&lt;br /&gt;&lt;br /&gt;Ahora bien, las clases sobre las que vamos a trabajar son las creadas por VS para nosotros: ThisAddIn.cs y Ribbon1.cs.&lt;br /&gt;&lt;br /&gt;En la primera se encuentran los eventos ThisAddIn_Startup y ThisAddIn_Shutdown, los cuales son los puntos inicial y final del AddIn. Pero por ahora no los vamos a tocar, más bien creamos un nuevo método que sera el que preste la funcionalidad:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void TestExcelRanges()&lt;br /&gt;{&lt;br /&gt;Excel.Range miRango = null;&lt;br /&gt;Excel.Worksheet miSheet = null;&lt;br /&gt;miSheet = this.Application.ActiveSheet as Excel.Worksheet;&lt;br /&gt;miRango = miSheet.get_Range("A1", "A1");&lt;br /&gt;miRango.set_Value(Missing.Value,10);&lt;br /&gt;miRango = miSheet.get_Range("B1", "D5");&lt;br /&gt;miRango.set_Value(Missing.Value, 100);&lt;br /&gt;miRango = miSheet.get_Range("E:E",Missing.Value);&lt;br /&gt;miRango.set_Value(Missing.Value, 200);&lt;br /&gt;miRango = miSheet.get_Range("F1;G2;H3;I4", Missing.Value);&lt;br /&gt;miRango.set_Value(Missing.Value, 400);&lt;br /&gt;}&lt;br /&gt;Es un método bastante sencillo que fija valores, basado en el establecimiento de rangos sobre la hoja de trabajo. Lo realmente importante es la definición de las instancias de tipo Range y Worksheet, que son el punto de inicio para todo el trabajo. Lo demás es ir descubriendo la funcionalidad de la gran cantidad de métodos, propiedades, etc etc. Entre las cosas que tenemos aca es la clase Missing. No se maten la cabeza, simplemente adicionen el namespace System.Reflection, para que tengan acceso a Missing.Value. Recuerden este método va en la clase ThisAddIn.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ahora en la clase de tipo Ribbon, la idea es quitar los comentarios del método RequestService() y en la sección CallBacks deberia quedar así:&lt;br /&gt;&lt;br /&gt;public void OnButton1(Office.IRibbonControl control)&lt;br /&gt;{&lt;br /&gt;Globals.ThisAddIn.TestExcelRanges();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;En el archivo XML que se agregó al proyecto, debe quedar así:&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5083560809696492498" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp3.blogger.com/_tP7sdi3BZ2A/Roxvn2AOe9I/AAAAAAAAABU/McI1QD1SbFM/s320/xml.JPG" border="0" /&gt; Básicamente en ese archivo se define una imagén asociada al AddIn, el manejador del evento disparado por el botón adicionado al Ribbon, y otras propiedades más. Solo basta ejecutar la aplicación, y debe entonces abrirse Excel desplegando los valores asociados para cada rango establecido, como se muestra en la figura:&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5083560942840478690" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp2.blogger.com/_tP7sdi3BZ2A/RoxvvmAOe-I/AAAAAAAAABc/1njA-swVj_k/s320/Excel.JPG" border="0" /&gt;&lt;br /&gt;Felices lineas de código&lt;/span&gt;!!&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-1473737674618141506?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/1473737674618141506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=1473737674618141506' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1473737674618141506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1473737674618141506'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/07/excel-addin-con-c-y-vsto.html' title='Excel AddIn con C# y VSTO'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_tP7sdi3BZ2A/Roxl2GAOe5I/AAAAAAAAAA0/ffS29PbYYw0/s72-c/MewProject.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-1414079981442274374</id><published>2007-06-18T20:04:00.000-07:00</published><updated>2007-10-06T16:37:01.617-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ineta'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Revista'/><category scheme='http://www.blogger.com/atom/ns#' term='Crystal Reports'/><title type='text'>Revista INETA LATAM</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;Hola&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Rápidamente, y ya que tengo un par de artículos en la grandiosa revista de INETA, quiero recomendarles visitar:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.inetalatam.org/Revista/Revista.aspx"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://www.inetalatam.org/Revista/Revista.aspx&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Leanla, es el grano de arena que algunos ponemos para que .NET siga creciendo en el ámbito latinoaméricano. Y ahora que está descargable ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Felíz lectura!!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-1414079981442274374?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/1414079981442274374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=1414079981442274374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1414079981442274374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1414079981442274374'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/06/revista-ineta-latam.html' title='Revista INETA LATAM'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-1907529854751685078</id><published>2007-06-18T19:49:00.000-07:00</published><updated>2007-10-06T16:37:37.151-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='Architecture Journal'/><title type='text'>No lo digo yo</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Hola de nuevo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Esta es una pequeña entrada para algo que vengo escuchando ya hace unos años. Perdidas y ganancias, solo un pequeño porcentaje de proyectos de software dan buenos resultados, el resto...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;De acuerdo al Standish Group [Sta94], las empresas en los Estados Unidos de América, invierten US$ 250 mil millones en el desarrollo de software para aproximadamente 200 proyectos cada año. Sólo el 16% finaliza a tiempo y dentro del presupuesto. El 31% se anula, debido a problemas de calidad generando pérdidas de aproximadamente US$ 81 mil millones. Otro 53% excede el presupuesto por un promedio de 189%, generando pérdidas aproximadas de US$ 58 mil millones. Los proyectos que se completan promedian sólo el 42% de los que se planificaron en un principio.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;No se asusten, más bien lean el Journal de Microsoft sobre aruqitectura, que me sorprende ahora encontarlo en español, o más bien me emociona, así se gasta menos tiempo teniendo que traducir, se digiere más rápido. A lo que hago referencia lo encuentran en el número 3, a partir de ahi la revista tiene todos sus números en español. Así que si quieren saber de arquitectura de la mano de los mejores, ya no se pueden quejar por falta de información!!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://msdn2.microsoft.com/en-us/arcjournal/bb201656.aspx#spanish"&gt;&lt;span style="font-size:85%;"&gt;http://msdn2.microsoft.com/en-us/arcjournal/bb201656.aspx#spanish&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Un abrazo y feliz arquitectura!!&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-1907529854751685078?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/1907529854751685078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=1907529854751685078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1907529854751685078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/1907529854751685078'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/06/no-lo-digo-yo.html' title='No lo digo yo'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-3294407816213115899</id><published>2007-06-03T13:12:00.000-07:00</published><updated>2007-10-06T16:38:32.406-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Process'/><title type='text'>Qué alguien me muestre los procesos</title><content type='html'>Hola de nuevo&lt;br /&gt;&lt;br /&gt;La clase Process es mi invitada para esta entrada, con la cual quiero mostrarles un ejemplo muy simple. La idea, listar los procesos que se están ejecutando localmente en nuestra máquina. Es bueno saber también que está clase me permite listar los procesos de una máquina remota. Además puedo, iniciar y detener procesos. En fin aqui les dejo el ejemplo.&lt;br /&gt;&lt;br /&gt;Primero, crearse un proyecto de tipo Consola, en las plantillas de C#&lt;br /&gt;&lt;br /&gt;Luego en su método Main() escriben lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5071934580665721314" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp2.blogger.com/_tP7sdi3BZ2A/RmMhoPyZoeI/AAAAAAAAAAs/NetHCsHzdOQ/s320/Code.JPG" border="0" /&gt;&lt;br /&gt;Bastante simple la cosa, y en la salida de este ejemplo, podran ver listados todos los procesos ejecutandose actualmente, mostrandose su PID y su nombre.&lt;br /&gt;De todos modos, si buscan más en la clase Process, encontrarán muchas más propiedades y métodos bastante interesantes que pueden servir para llaver a cabo otra serie de tareas.&lt;/p&gt;&lt;p&gt;Felices líneas de código.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-3294407816213115899?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/3294407816213115899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=3294407816213115899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/3294407816213115899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/3294407816213115899'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/06/qu-alguien-me-muestre-los-procesos.html' title='Qué alguien me muestre los procesos'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_tP7sdi3BZ2A/RmMhoPyZoeI/AAAAAAAAAAs/NetHCsHzdOQ/s72-c/Code.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-3174925411564655670</id><published>2007-06-01T21:02:00.000-07:00</published><updated>2007-06-01T21:04:27.693-07:00</updated><title type='text'>Microsoft Technology Day: Ciclo de vida de Aplicaciones</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;Nuevo evento en Colombia, donde se va a mostrar todo lo que Microsoft tiene para ofrecernos en herramientas que ayudan a administrar todo el ciclo de desarrollo de aplicaciones.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;Vean más información en el blog del señor Ivanov Cepeda de Microsoft Colombia.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/devcolombia/archive/2007/05/24/microsoft-technology-day-ciclo-de-vida-de-aplicaciones.aspx"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://blogs.msdn.com/devcolombia/archive/2007/05/24/microsoft-technology-day-ciclo-de-vida-de-aplicaciones.aspx&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-3174925411564655670?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/3174925411564655670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=3174925411564655670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/3174925411564655670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/3174925411564655670'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/06/microsoft-technology-day-ciclo-de-vida.html' title='Microsoft Technology Day: Ciclo de vida de Aplicaciones'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-3900177193989438678</id><published>2007-05-08T20:37:00.000-07:00</published><updated>2007-10-06T16:40:02.084-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='XmlHTTPRequest'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>XMLHttpRequest AJAX Introducción</title><content type='html'>Hola de nuevo&lt;br /&gt;&lt;br /&gt;Esta es una de mis primeras entradas, que quiero dedicar a lo que tiene que ver con AJAX.&lt;br /&gt;Si quieren saber por donde va lo de AJAX y demás pueden visitar http://ajax.asp.net/default.aspx?tabid=47 donde vana&lt;br /&gt;Encontrar toda clase de material para iniciarse en el tema.&lt;br /&gt;&lt;br /&gt;Yo quiero que veamos AJAX desde un lado práctico, tocando ciertas partes fundamentales en la teoría.&lt;br /&gt;Para esto comencemos con el objeto XmlHttpRequest, que dicen por ahí, es el corazón de la maquinaria de AJAX. Sin este Objeto volveríamos a los aburridos y viejos sitios estáticos. La idea es que veamos cómo va la movida de instanciar este objeto, sus sutiles diferencias, dependiendo de un browser y otro, y lo sencillo que es enviar una petición "server side", lo cual cómo apreciaremos es bastante sencillo para ser cierto.&lt;br /&gt;&lt;br /&gt;Entonces aquí pueden ver el video, en uno de mis sitios favoritos, si señores YouTube, que se ha convertido en una Tool más de aprendizaje y por supuesto esparcimiento.&lt;br /&gt;&lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/66jvCfew384"&gt;&lt;embed src="http://www.youtube.com/v/66jvCfew384" type="application/x-shockwave-flash" width="525" height="450"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Ahora bien, que está pasando ahí debajo.&lt;br /&gt;&lt;br /&gt;Si señores ese JavaScript, que si quieren probarlo deben colocar después de su etiqueta HTML y antes de su HEAD.&lt;br /&gt;El método getHTTPRequestObject(), se encarga de instanciar adecuadamente el objeto XMLHttpRequest. La idea radica en que para IE, este se comporta como un objeto tipo ActiveX, pero ya todos conocemos los problemas de compatibilidad con los&lt;br /&gt;otros browser. Por lo tanto la tarea de instanciamiento difiere un poco. Por ejemplo en el caso de IE actual, la línea que crea el objeto es xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); Si se fijan en mi video tengo un pequeño error y&lt;br /&gt;es que me falta una P al instanciar dentro del primer catch(), así que simplemente disculpas. Pero bueno para la versión de mi IE, mi isntancia se crea en el segundo Try.&lt;br /&gt;Ahora miren que si nuestra página es accedida por un browser tipo Mozilla o Safari, se utiliza:&lt;br /&gt;xmlhttp = new XmlHttpRequest(); Esto es porque para esos browsers, el objeto es nativo, pre-construido.&lt;br /&gt;&lt;br /&gt;En la página default.aspx, he puesto dentro del DIV un simple mensaje&lt;br /&gt;XmlHttpRequest trabajando!!&lt;br /&gt;Y finalmente he adicionado el archivo de texto "TextFile.txt" al proyecto web, el cual le inserto un texto cualquiera.&lt;br /&gt;&lt;br /&gt;Por favor coloquen mucha atención a esta parte del script, donde está lo interesante:&lt;br /&gt;xmlhttp.onreadystatechange = function()&lt;br /&gt;{&lt;br /&gt;if(xmlhttp.readyState == 4)&lt;br /&gt;{&lt;br /&gt;alert(xmlhttp.responseText);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;Si señores, es una llamada asíncrona, donde el valor 4 indica que la llamada se ha realizado con éxito. La función onreadystatechange sirve para monitorear el estado actual de la llama asíncrona.&lt;br /&gt;&lt;br /&gt;Los posibles valores de este estado son:&lt;br /&gt;&lt;br /&gt;0:Uninitialized&lt;br /&gt;1:Loading&lt;br /&gt;2:Loaded&lt;br /&gt;3:Interactive&lt;br /&gt;4:Complete&lt;br /&gt;&lt;br /&gt;Bien, lentamente iremos viendo más cosas sobre este interesante objeto y por supuesto todo lo que trae AJAX para nosotros en este mar de información y tecnologías que están ahí esperando a que las explotemos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-3900177193989438678?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/3900177193989438678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=3900177193989438678' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/3900177193989438678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/3900177193989438678'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/05/xmlhttprequest-ajax-introduccin.html' title='XMLHttpRequest AJAX Introducción'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-987562392652791217</id><published>2007-05-07T19:13:00.000-07:00</published><updated>2007-10-06T16:41:54.542-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Mis recomendados de la semana</title><content type='html'>Hola de nuevo&lt;br /&gt;&lt;br /&gt;Bueno esta ves quiero comentar un poco acerca de mi actualización y gastos varios en nuevos libros referentes a todo lo nuevo con .NET. Entre mis nuevas adquisiciones les quiero recomendar tres libros sensacionales. Pro C# with .NET 3.0, edición especial, del señor Andrew Troelsen. La verdad es lo más reciente que me llega, pero lo recomiendo, primero porque toca temas fundamentales de C# sobre Framewrok 3.0, así como los nuevos temas referentes a WCF, WPF y LINQ. Ahora está este otro libro bastante bueno, Pro Ajax and the .NET 2.0 Plattform, del señor Daniel Woolston, bastante bueno para iniciarse en AJAX, buenos ejemplos, y bien explicada cada cosa importante que se trata en cada una de sus páginas. Por último tengo en mis manos Expert Service-Oriented Architecture in C# 2005. La verdad creo que el título queda un poco grande a este libro, por cierto bastante delgado, le faltan vitaminas, pero como sea, no soy experto en el tema y está bueno para ganar conceptos básicos. Lo que si es rescatable, es que los ejemplos se basan en WSE 3.0, lo que si me ha parecido muy práctico. Este engendro es de los señores Jeffrey Hasan y Mauricio Duran.&lt;br /&gt;&lt;br /&gt;Lo que si es importante en esto, es tener bastante lectura, aunque hay mucho en internet, yo prefiero tener mi biblioteca personal, y con estos nuevos visitantes, mi biblioteca crece dia con dia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-987562392652791217?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/987562392652791217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=987562392652791217' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/987562392652791217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/987562392652791217'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/05/mis-recomendados-y-ms.html' title='Mis recomendados de la semana'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-7727027439867659940</id><published>2007-04-28T08:36:00.000-07:00</published><updated>2007-10-06T16:42:54.590-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crqe.dll'/><category scheme='http://www.blogger.com/atom/ns#' term='Load Report Failed'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='DLL Hell'/><category scheme='http://www.blogger.com/atom/ns#' term='Crystal Reports'/><title type='text'>DLL Hell? ustedes deciden</title><content type='html'>&lt;span style="font-size:85%;"&gt;Hola de nuevo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;No habia publicado esto mientras daba solución al problema:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;"Load Report Failed" {"Not enough memory for operation."}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;etc etc&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Sip todo comenzó en nuestro servidor de pruebas, y luego por arte de magia me ocurrió en mi máquina de desarrollo. Los reportes lanzaban la excepción comentada y ya nada funcionaba.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Como dijo Willy Marroquin, todos los caminos conducen a GooGle y claro, después de 2 semanas de búsqueda y pruebas infructuosas, me encontré con una solución simple.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Correr el comenado regsvr32 para la DLL "crqe.dll" y todo volvió a la normalidad...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Un caso más del infierno de las DLLs? ustedes diran, yo pienso que sip. El problema grave es encontrar la solución pronta a problemas de este tipo.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Felices lineas de código!!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-7727027439867659940?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/7727027439867659940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=7727027439867659940' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/7727027439867659940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/7727027439867659940'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/04/dll-hell-ustedes-deciden.html' title='DLL Hell? ustedes deciden'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-3320759513482563527</id><published>2007-04-28T07:42:00.000-07:00</published><updated>2007-10-06T16:44:22.770-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VS.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Field Explorer'/><category scheme='http://www.blogger.com/atom/ns#' term='Crystal Reports'/><title type='text'>Jugamos a las escondidas?</title><content type='html'>&lt;span style="font-size:85%;"&gt;Hola de nuevo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Esta es una entrada muy breve acerca de un "defecto" en VS.NET respecto de la ventana Field Explorer de Crystal Reports. Si señores, les ha pasado? estamos editando nuestro reporte desde VS.NET y el Field Explorer se oculta y "nunca jamas" como dice Poe en su gran poema, volvemos a ver el Field Explorer.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Les cuento que estando en VS.NET podemos ir a la opción Ver(View) del menú y seleccionar la opción Otras Ventanas y ahi buscar la opción "Esquema del documento" y bingo, ahi aparecerá el Field Explorer como por arte de magia.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Un abrazo y felices lineas de código!!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-3320759513482563527?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/3320759513482563527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=3320759513482563527' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/3320759513482563527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/3320759513482563527'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/04/jugamos-las-escondidas.html' title='Jugamos a las escondidas?'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-8182847576945122537</id><published>2007-02-28T18:31:00.000-08:00</published><updated>2007-10-06T16:45:04.516-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MSDN Radio'/><category scheme='http://www.blogger.com/atom/ns#' term='IIS7'/><category scheme='http://www.blogger.com/atom/ns#' term='Scott Guthrie'/><title type='text'>Artículo recomendado y algo más</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;Hola, en esta ocasión quiero recomendarles un artículo que me ha parecido excelente, totalmente en español, tema del número de MSDN Magazine de Marzo de 2007, donde el autor habla de manera muy interesante acerca de las nuevas caracteristicas de IIS 7.0. en resumen, tenemos un servidor Web que viene en su versión completa con Windows Vista, la misma que se utilizará en el Servidor Windows "LongHorn", un IIS totalmente modular, interrelacionado con nuestras aplicaciones ASP.NET, desde las cuales podemos automatizar casi por completo las funcionalidades existentes del IIS, y por supuesto crear nuestros propios modulos. Solo quiero decirles que le doy un 10 ha este artículo y sería bueno que le den un vistaso.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/03/IIS7/default.aspx?loc=es"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://msdn.microsoft.com/msdnmag/issues/07/03/IIS7/default.aspx?loc=es&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;Quiero invitarlos nuevamente a escuchar MSDN radio&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.microsoft.com/spanish/msdn/latam/mediacenter/radio/default.aspx"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://www.microsoft.com/spanish/msdn/latam/mediacenter/radio/default.aspx&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Pueden encontrar mi entrada acerca de las ventanas de VS.NET, su utilidad y teclas rápidas y mucho más.&lt;br /&gt;&lt;br /&gt;Para los amantes de ASP.NET no olviden visitar el Blog del señor Scott Guthrie, tiene unas entradas excelentes.&lt;br /&gt;&lt;/span&gt;&lt;a href="http://weblogs.asp.net/scottgu/rss.aspx"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://weblogs.asp.net/scottgu/rss.aspx&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-8182847576945122537?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/8182847576945122537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=8182847576945122537' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/8182847576945122537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/8182847576945122537'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/02/artculo-recomendado-y-algo-ms.html' title='Artículo recomendado y algo más'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-117091081330058347</id><published>2007-02-07T20:56:00.000-08:00</published><updated>2007-10-06T16:45:23.320-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MSDN Radio'/><title type='text'>MSDN Radio</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;Amigos, les quiero compartir un link a un sitio de MSDN latinoámerica, que presenta contenido muy bueno y variado acerca de la tecnología .NET y totalmente en español, justo para la comunidad latinoaméricana.&lt;br /&gt;http://www.microsoft.com/spanish/msdn/latam/mediacenter/default.aspx&lt;br /&gt;&lt;br /&gt;Quiero invitarlos a escuchar una de mis entradas en MSDN Radio en:&lt;br /&gt;http://www.microsoft.com/spanish/msdn/latam/mediacenter/radio/default.aspx&lt;br /&gt;donde toco el tema de los Proyectos de SQL Server 2005 y su integración con el CLR.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-117091081330058347?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/117091081330058347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=117091081330058347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/117091081330058347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/117091081330058347'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/02/msdn-radio.html' title='MSDN Radio'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-117054838462472767</id><published>2007-02-03T13:29:00.000-08:00</published><updated>2007-10-06T16:46:10.693-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSTO'/><category scheme='http://www.blogger.com/atom/ns#' term='Outlook AddIn'/><title type='text'>Programando OutlookAddin con VSTOs</title><content type='html'>&lt;span style="font-size:85%;"&gt;Hola, esta ves quiero mostrarles cómo podemos programar fácilmente un addin para outlook.&lt;br /&gt;&lt;br /&gt;Para los que no saben qué es un addin, básicamente es funcionalidad extra que podemos añadirle a las aplicaciones como Word, Excel, Oulook y todas las demás herramientas de la suite office, incluso el mismo Visual Studio .NET, para que se ejecute dentro del ambiente de estas aplicaciones y provea tareas que nosotros mismos programamos, y podemos ejecutar desde alguna de las opciones del menú de cada una de estas aplicaciones, como si fuera una funcionalidad cualquiera.&lt;br /&gt;&lt;br /&gt;En esta ocasión quiero mostrales cómo crear un proyecto de addin de outlook y con esto adicionar una funcionalidad extra a esta herramienta de office system 2003, con la cual se ejecuta este ejemplo.&lt;br /&gt;&lt;br /&gt;Para esto es necesario instalar las Visual Stuio Tools for Office, con lo cual podemos crear proyectos para office System 2003 e incluso office system 2007. En esta ocasión utilizo OutLook 2003 para correr el ejemplo.&lt;br /&gt;&lt;br /&gt;Habiendo instalado las VSTOs, procedemos a crear un proyecto de Office y seleccionamos la plantilla Complemento de Outlook, como se puede apreciar en la figura.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div align="center"&gt;&lt;a href="http://photos1.blogger.com/x/blogger/559/2798/1600/892306/projectaddin.jpg"&gt;&lt;span style="font-size:85%;"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/x/blogger/559/2798/320/677201/projectaddin.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;Cómo con cualquier proyecto de Visual Studio .NET podemos asignarle un nombre, una ubicación y un nombre para la solución del proyecto.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;Al dar clic en aceptar, visual studio crea para nosotros un archivo .cs llamado ThisApplication, en el cual adiciona dos métodos que son los puntos de entrada y salida de nuestro AddIn respectivamente:&lt;br /&gt;ThisApplication_Startup y ThisApplication_Shutdown.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;Lo primero que vamos a crear son 2 atributos privados de la clase:&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;private Office.CommandBarPopup miAddinMenu;&lt;br /&gt;private Office.CommandBarButton miMostrarVentana;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;El primero de tipo CommandBarPopup, sirve para asociar en cualquiera de las opciones del menú de OutLook, nuestro addin. El segundo de tipo CommandBarButton, nos sirve para asociar una de las opciones del menú del Addin.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;A continuación creamos un método para que cree el menú del Addin, utilizando como contenedor, el menú Tools del Outlook.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;private void CrearMenu()&lt;br /&gt;{&lt;br /&gt;// Obtiene una referencia a la ventana del explorador de outlook activa.&lt;br /&gt;Outlook.Explorer miExplorador = this.ActiveExplorer();&lt;br /&gt;// La adci¢n se hace al men£ tools&lt;br /&gt;Office.CommandBar miMenu = miExplorador.CommandBars["Tools"];&lt;br /&gt;// Crea el item en el men£ para el AddIn&lt;br /&gt;miAddinMenu = miMenu.Controls.Add(Office.MsoControlType.msoControlPopup, 1, "", 1, true) as&lt;br /&gt;Office.CommandBarPopup;&lt;br /&gt;miAddinMenu.Visible = true;&lt;br /&gt;miAddinMenu.Caption = "Mi primer Addin";&lt;br /&gt;// Crea una opci¢n del men£.&lt;br /&gt;miMostrarVentana = miAddinMenu.CommandBar.Controls.Add(Office.MsoControlType.msoControlButton, 1,&lt;br /&gt;"", 1, true) as Office.CommandBarButton;&lt;br /&gt;miMostrarVentana.Caption = "Mi opci¢n";&lt;br /&gt;miMostrarVentana.Style = Office.MsoButtonStyle.msoButtonIconAndCaption;&lt;br /&gt;//Despliega un icono de opciones&lt;br /&gt;miMostrarVentana.FaceId = 1664;&lt;br /&gt;miMostrarVentana.Click += new Office._CommandBarButtonEvents_ClickEventHandler(MiEventoButtonClick);&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;El método anterior se puede invocar desde el método ThisApplication_Startup, con esto tendremos nuestro Addin desplegado en el OutLook como una funcionalidad más del menú Tools.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;Ya que se ha asociado un evento a la opción del AddIn, es necesario adicionar el siguiente evento a la clase:&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;private void MiEventoButtonClick(Office.CommandBarButton ctrl, ref bool cancelDefault)&lt;br /&gt;{&lt;br /&gt;//MessageBox.Show("Mi primer Addin de Outlook");&lt;br /&gt;using (FormularioAddin miForma = new FormularioAddin())&lt;br /&gt;{&lt;br /&gt;if (miForma.ShowDialog() == DialogResult.OK)&lt;br /&gt;{&lt;br /&gt;Application.Exit();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;Para el evento se debe haber creado una forma de windows con un botón, al cual se le asocia la propiedad DialogResult con el valor OK. La forma es instanciada dentro de la clausula using, la cual indica que todo recurso utilizado será liberado, como si fuera un bloque Try-Finally, y al dar click en el botón sobre la forma, simplemente se cierra el OutLook con la llamada al método Exit.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;El poder adicionar formas de windows, hace de nuestro Addin una herramienta muy poderosa para extender la funcionalidad de Outlook, además el poder enlazar eventos y tener a mano todo el poder de programación del .NET Framework.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;Espero este sencillo ejemplo pueda servirles para iniciar proyectos más complejos que aprovechen la funcionalidad de OutLook e igualmente la extiendan.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="250" width="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/I0GckN1PCxg"&gt;&lt;embed src="http://www.youtube.com/v/I0GckN1PCxg" type="application/x-shockwave-flash" width="600" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-117054838462472767?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/117054838462472767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=117054838462472767' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/117054838462472767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/117054838462472767'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/02/programando-outlookaddin-con-vstos.html' title='Programando OutlookAddin con VSTOs'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-116931637585870873</id><published>2007-01-20T08:52:00.000-08:00</published><updated>2007-01-20T10:11:58.656-08:00</updated><title type='text'>.NET News y algo más</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;En esta entrada dejo un lado lo técnico parar referirles enlaces a temás importantes que nos mantienen al dia con todo o que está pasando con la tecnología .NET.&lt;br /&gt;&lt;br /&gt;Para los seguidores de desarrollador 5 Estrellas 2005, ya está la 4ta estrella disponible, con muy buen material acerca&lt;br /&gt;de los temás relevantes del .NET Framwork 3.0&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.mslatam.com/latam/msdn/comunidad/dce2005/"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://www.mslatam.com/latam/msdn/comunidad/dce2005/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;Algo que me ha llamado la tención y habia estado esperando es el show para televisión de MSDN latinoamérica. Con temas&lt;br /&gt;de bastante interés es una opción más de aprendizaje a la que tenemos acceso.&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.microsoft.com/spanish/msdn/latam/mediacenter/msdntv/default.aspx"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://www.microsoft.com/spanish/msdn/latam/mediacenter/msdntv/default.aspx&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;Imagina un mundo donde la tecnología facilite el acceso a la educación a todo el mundo...Este es el lema para el Imagine Cup 2007, ya ya está listo para que los estudiantes de todo el mundo se inscriban y participen en el evento tecnológico a nivel de Universidades que Microsoft realiza cada año.&lt;br /&gt;&lt;br /&gt;El sitio recomendado para hoy es: &lt;/span&gt;&lt;a href="http://www.theserverside.net/"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://www.theserverside.net/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;, uno de mis sitios favoritos por las grandiosas entradas que hacen expertos en los diferentes temas de la tecnología .NET, además de poder conseguir apartes de libros, artículos, conversatorios, y mucho más.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-116931637585870873?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/116931637585870873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=116931637585870873' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/116931637585870873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/116931637585870873'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/01/net-news-y-algo-ms.html' title='.NET News y algo más'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-116931144062504547</id><published>2007-01-20T07:02:00.000-08:00</published><updated>2007-01-20T08:45:24.213-08:00</updated><title type='text'>Más TIPS sobre Crystal Reports</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;Continuando con la entrada anterior, acerca de tips de interés cuando utilizamos Crystal reports desde nuestras aplicaciones .NET (Windows Forms o ASP.NET), estas son algunas soluciones a ciertos problemas que se pueden presentar:&lt;br /&gt;&lt;br /&gt;1. Supongamos que tenemos un reporte el cual contiene varios subreportes. Nuestro reporte principal tiene la orientación del papel de manera vertical, pero uno de los subreportes es demasiado ancho y necesita estar orientado de manera horizontal. Qué se puede hacer en este caso? Aqui está el código y el evento que debemos programar del CrystalReportViewer para alcanzar esta solución:&lt;br /&gt;&lt;br /&gt;private void CrystalReportViewer1_DrillDownSubreport(object source, CrystalDecisions.Web.DrillSubreportEventArgs e)&lt;br /&gt;{&lt;br /&gt;if(e.NewSubreportName == "Subreport1")&lt;br /&gt;{&lt;br /&gt;ReportePrincipal.PrintOptions.PaperOrientation = PaperOrientation.Landscape;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Capturando el evento DrillDownSubreport, le estamos indicando en ese instante al subreporte que tiene asignado en su propiedad "name" el valor Subreport1, que debe utilizar el valor "Landscape" para la orientación del papel. Esta solución es muy efectiva para alcanzar el resultado esperado, además que podemos hacerlo con 1 o más subreportes adicionados al principal.&lt;br /&gt;&lt;br /&gt;2. Cunado necesitamos agrupar información dentro de nuestro reporte, y mostrar cada grupo en una página diferente del reporte, Crystal ofrece un solución bastante simple, pero efectiva, que nos lleva a programar los eventos disparados por las diferentes secciones del reporte. En este caso vamos a programar el evento "New Page After" de las secciones GroupHeader y GroupFooter.&lt;br /&gt;&lt;br /&gt;Lo primero entonces es indicarle al Group Header, que despligue la información del mismo grupo mientras no encuentre el último registro y el siguiente registro sea igual al que se está leyendo en el momento. Si no se cumple, entonces se ejecutaré el evento "New Page After", causando que se crea la nueva página para el nuevo grupo.&lt;br /&gt;&lt;br /&gt;if(NOT OnLastRecord AND {sales.ord_num}=Next ({sales.ord_num}))then false&lt;br /&gt;&lt;br /&gt;Pero esta solución causa un problema en el reporte y es que siempre se crea una página en blanco adicional, pero esto tiene una solución igualmente simple.&lt;br /&gt;En la sección Group Footer, en el evento "New Page After" adicionamos la línea:&lt;br /&gt;&lt;br /&gt;OnLastRecord&lt;br /&gt;&lt;br /&gt;Con esto entonces tenemos dos simples soluciones a algo que en primera instancia parece ser un problema díficil de resolver. Como les decía en la entrada anterior sobre Crystal, esto es solo cuestión de conocer la herramienta y las capacidades que oferece a nível de programación.&lt;br /&gt;&lt;br /&gt;Quiero recomendarles:&lt;br /&gt;&lt;/span&gt;&lt;a href="http://aspadvice.com/blogs/rjdudley/archive/tags/Crystal+Reports+.NET/default.aspx"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://aspadvice.com/blogs/rjdudley/archive/tags/Crystal+Reports+.NET/default.aspx&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.crystalreportsbook.com/"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://www.crystalreportsbook.com/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Dos exelentes sites, de dos personajes que aportan bastante a dar soluciones efectivas a problemas con Crystal Reports utilizado desde nuestras aplicaciones .NET&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-116931144062504547?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/116931144062504547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=116931144062504547' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/116931144062504547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/116931144062504547'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/01/ms-tips-sobre-crystal-reports.html' title='Más TIPS sobre Crystal Reports'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-116930514460351300</id><published>2007-01-20T05:58:00.000-08:00</published><updated>2007-01-20T07:00:18.450-08:00</updated><title type='text'>SQLServer 2005 Administrado</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;En esta entrada hablaremos un poco acerca de la inclusión del CLR dentro de SQL Server 2005, y cómo esto nos permite exponer elementos administrados dentro del motor. Por ejemplo, procedimientos almacenados, funciones, triggers, UDTs(tipos definidos por el usuario), entre otros, escritos en un lenguaje administrado por el CLR (C#, VB.NET) y desplegados como objetos de la base de datos, pero administrados por el CLR para su ejecución, como cualquier ensamblado que se crea después de su compilación.&lt;br /&gt;&lt;br /&gt;Para crear un proyecto desde Visual Studio .NET 2005 para SQL Server, se escoge la opción SQL Server Project:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://photos1.blogger.com/x/blogger/559/2798/1600/410521/sqlserverproject.jpg"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/x/blogger/559/2798/320/814997/sqlserverproject.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Esta template, nos permite un proyecto de SQL Server, desde el cual podremos adicionar los siguientes items:&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/x/blogger/559/2798/320/206936/itmsproyecto.jpg" border="0" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Seleccionando cualquiera de los items anteriores, visual studio crea por nosotros la clase en la cual podemos adicionar el método, que finalmente será desplegado dentro del motor como un objeto de la base de datos que puede ejecutarse como cualquiera de sus contrapartes escritos en Transact SQL.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Por ejemplo, veamos lo que sería un método administrado que SQL Server 2005 entiende como un procedimiento almacenado, con los elementos necesarios para que funcione como tal:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;using (SqlConnection conexion = new SqlConnection("context connection = true"))&lt;br /&gt;{&lt;br /&gt;SqlCommand comando = new SqlCommand();&lt;br /&gt;comando.CommandText = "SELECT LastName" + Convert.ToChar("+").ToString() + "' '" +&lt;br /&gt;Convert.ToChar("+").ToString() + "FirstName, Title, BirthDate, Address, City " +&lt;br /&gt;"FROM dbo.Employees";&lt;br /&gt;comando.Connection = conexion;&lt;br /&gt;conexion.Open();&lt;br /&gt;SqlContext.Pipe.ExecuteAndSend(comando);&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Es una consulta muy sencilla, donde se pueden evidenciar algunos elementos de importancia como son: &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;1. Al constructor de la clase SqlConnection ahora le pasamos el valor "context connection = true" que está indicando que nuestro código se va a ejecutar dentro del contexto de SQL Server, administrado por el CLR. Esto significa que no van a ejecutarse todos los mecánismos de conexión utilizados por SQLConnection a través del SQLDataProvider.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;2. El método Send de la propiedad Pipe es equivalente a un PRINT en Transact SQL. La propiedad Pipe es de tipo SQLPipe, y permite insertar información en la corriente de salida utilizando para esto el protocolo TDS(Tabular Data String), con el cual SQL Server habla con un cliente. TDS permite poner ResultSets y Mensajes en el camino.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Bien este método entonces será desplegado como un procedimiento almacenado dentro del motor. Y el despliegue? sencillo, simplemente ejecutar el proyecto y con esto ya tenemos desplegado nuestro procedimiento almacenado administrado como un objeto del motor. Hay comandos propios de Transact SQL que se pueden también ejecutar desde SQL Server 2005, pero eso es tema para otra entrada. Es importante que antes de ejecutar cualquiera de estos comandos, el CLR debe estar activado dentro de SQL Server, ya que por seguridad viene deshabilitado por defecto.&lt;br /&gt;&lt;br /&gt;Desde visual studio .NET podemos hacer uso del Server Explorer para ir viendo lo que está ocurriendo con nuestros elementos administrados dentro del motor, ahi en diferentes carpetas podemos desplegar la de "Stored Procedures" y entonces el procedimiento almacenado tendrá el nombre que le hayamos dado al método escrito en C#. Otra carpeta que se encuentra es Assemblies, en la cual queda desplegado el ensamblado el cual toma por defecto el nombre de nuestro proyecto.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;En conclusión, con SQL Server - CLR, tenemos muchas ventajas como por ejemplo: poder extender la funcionalidad del motor, porque podemos escribir nuestra lógica utilizando lenguajes de alto nivel y no Transact SQL. Aunque SQL Server no sea un motor orientado a objetos, estas características le añaden orientación a objetos de cierto modo, pero debemos tener cuidado, ya que ciertas características de la POO, no pueden ser entendidas dentro del SQL Server 2005. Es muy importante saber que no puedo tomar todos mis objetos escritos en Transact-SQL y cambiarlos por objetos administrados, esto no es solución de ninguna manera. La idea de tener hospedado el CLR dentro de SQL Server, es para escribir cierta clase de objetos que con transact SQL pueden llegar a ser demasiado complejos y no tener el mismo desempeño que escritos con lengaujes administrados. Por ejemplo, funciones matemáticas, operaciones de encripción y desencripción, todo lo referente al trabajo con cadenas (lo cual tiene un desempeño pobre con Transact SQL), operaciones como envio de coreo electrónico. Pero entonces nunca podremos suplir el gran desempeño que Transact ofrece para lo que tiene que ver con operaciones de tipo conjunto, es decir consultas sobre la información almacenada dentro de nuestra base de datos, en este contexto, los objetos escritos con lenguajes administrados, van a arrojar un desempeño mucho menor que los de transact. y finalmente cabe resaltar la depuración sobre obejetos escritos en Transact SQL desde el entrono de Visual Studio .NET, con lo cual tengo un elemnto más a favor para poder verificar que está ocurriendo con la jecución de mis elementos no administrados.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-116930514460351300?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/116930514460351300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=116930514460351300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/116930514460351300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/116930514460351300'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/01/sqlserver-2005-administrado.html' title='SQLServer 2005 Administrado'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-116927535335120456</id><published>2007-01-19T22:40:00.000-08:00</published><updated>2007-01-19T22:42:33.376-08:00</updated><title type='text'>Programando Crystal Reports I, una mirada práctica</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;Desde hace ya unos meses atrás vengo trabajando con la herramienta Crystal Reports para mi aplicación ASP.NET, y si algo es muy cierto, la versión actual de Crystal, la XI, es definitivamente una herramienta muy evolucionada para la creación de reportes que requieren un alto grado de complejidad, y que además de poder organizar los elementos para presentar la información con buena presentación gráfica, podamos automatizar y programar tareas que hacen de esos reportes elementos realmente útiles para el usuario final. Y es finalmente el usuario quien nos pide cosas que a veces parecen casi que imposibles de resolver, pero que al conocer un poco más las herramientas, estas resultan proveyendo toda una gama de características para hacer que esas tareas se vuelvan una realidad en código.&lt;br /&gt;&lt;br /&gt;Quiero en esta oportunidad compartir con ustedes ciertos tips de código y diseño, que me han gastado varias horas de investigación y desarrollo, para poder plasmar el problema de negocio del cliente en una serie de reportes que resultan ser al final muy satisfactorios.&lt;br /&gt;&lt;br /&gt;Subreportes:&lt;br /&gt;Este es quizás uno de los temas, por los cuales la gente tiene muchos problemas cuando está construyendo reportes de nivel profesional, los cuales requieren diferentes elementos y jerarquías de cierta complejidad, las cuales pueden ser resueltas con esta característica provista por Cristal de una manera sencilla de utilizar. En esta parte entonces veamos cómo puedo desde mi aplicación ASP.NET y utilizando lenguaje C#, acceder a estos elementos, y adicionalmente poder enviar parámetros, tanto a su reporte contenedor, como a estos subreportes.&lt;br /&gt;&lt;br /&gt;Las dos primeras instancias van a ser de tipo SubreportObject y ReportDocument. La primera nos permite definir el representante en código de nuestro subreporte que ya hemos adicionado en diseño al reporte contenedor. La segunda nos permite trabajar con nuestro subreporte, tal como si estuviéramos accediendo un reporte común y corriente, pudiendo acceder a propiedades para fijar por ejemplo la fuente de datos y parámetros si son necesarios.&lt;br /&gt;&lt;br /&gt;SubreportObject subreportObject;&lt;br /&gt;ReportDocument subReporte;&lt;br /&gt;Reporte miReporte = new Reporte();&lt;br /&gt;DataSet miDs = new DataSet ()&lt;br /&gt;miDs = Consultar();&lt;br /&gt;subReporte = new ReportDocument();&lt;br /&gt;subreportObject = miReporte.ReportDefinition.ReportObjects["subReporte"] as SubreportObject;&lt;br /&gt;subReporte = miReporte.OpenSubreport(subreportObject.SubreportName);&lt;br /&gt;subReporte.SetDataSource(miDs.Tables[0]);&lt;br /&gt;&lt;br /&gt;Adicionalmente a las dos instancias mencionadas, se tiene entonces un objeto de tipo DataSet, el cual servirá como contenedor para la data devuelta por el método que consulte la información desde algún repositorio, por ejemplo una base de datos.  Es importante observar la colección ReportObjects, en la cual le indicamos al objeto subreportObject que será el contenedor de un subreporte llamado “subReporte”, nombre asignado en la propiedad Name del subreporte. Si no se tiene cuidado con el nombre asociado al subreporte, al ejecutar la aplicación, el Sistema lanza una excepción que indica que el índice está fuera del rango. Se utiliza un el operador “as”, el cual ofrece seguridad y eficiencia en este proceso,  y adicionalmente no tenemos que hacer ni tratamiento de NULL ni manipular excepciones, pero esto será tema de otra entrada.&lt;br /&gt;Entonces es claro que el objeto subreportObject, se ha vuelto el representante en código del subreporte, y por ejmplo lo pasamos como parámetro al método OpenSubreport() con el cual abrimos el subreporte y lo asignamos al objeto subReporte, con el cual finalmente asignamos la fuente de datos al subreporte. Es claro que cuando tenemos un reporte principal, con diferentes subreportes, podemos tener diferentes fuentes de datos para alimentar cada elemento del reporte principal, incluyendo la fuente de este último.&lt;br /&gt;&lt;br /&gt;Finalmente podemos entonces consultar la información para el reporte principal.&lt;br /&gt;&lt;br /&gt;miDs = new DataSet();&lt;br /&gt;miDs = ConsultarPrincipal();&lt;br /&gt;miReporte.SetDataSource(miDs.Tables[0]);&lt;br /&gt;this.crvVisorReporte.ReportSource = miReporte;&lt;br /&gt;this.crvVisorReporte.DataBind();&lt;br /&gt;&lt;br /&gt;El objeto crvVisorReporte es una instanacia de la clase CrystalReportVoewer, que es el visor o control que encontramos en el ToolBox de Visual Studio .NET, el cual nos permite visualizar nuestros reportes en las páginas .aspx o Windows forms.&lt;br /&gt;Quiero anotar algo, y es que en el método SetDataSource(), le pasamos el DataSet y se le indica el objeto Table de la colección que se va a utilizar. Si no se hace esto y si le pasamos solamente el objeto DataSet, inmediatamente el objeto crvVisorReporte, despliega uso campos para ejecutar logon contra la base de datos.&lt;br /&gt;&lt;br /&gt;Pasar parámetros al Reporte y Subreportes&lt;br /&gt;&lt;br /&gt;Primero que todo es importante conocer las posibles razones por las que ocurre el error más típico cuando se utilizan parámetros en Crystal reports que se envian desde el código de nuestra aplicación. Básicamente el error es Missing Parameter Value y Referencia a objeto no establecida. Esto es lo único que Crystal nos muestra en el visor. Ocurre cuando se han declarado parámetros en el reporte y subreportes, y no se les está enviando ningún valor. También puede ser que desde código estamos asignando un valor a un parámetro que no se ha definido aún en los reportes. Entonces se debe tener un poco de cuidado y así evitar este error que es difícil de depurar algunas veces.&lt;br /&gt;&lt;br /&gt;miReporte.SetParameterValue("anio", 2004);&lt;br /&gt;miReporte.SetParameterValue("mes", 1);&lt;br /&gt;&lt;br /&gt;El código anterior está asignando los valores a 2 parámetros que deberán estar definidos en nuestro reporte principal y sus subreportes, bueno si es que los subreportes los necesitan, es decir si se requiere utilizar los parámetros en el subreporte deben definirse en el mismo. La manera de pasar los valores enviados desde código entre el reporte principal y sus subreportes es fijando en la opción Change subreports links, que se puede acceder en tiempo de diseño, parándose sobre el subreporte y haciendo clic derecho. Se abre entonces una ventana donde podemos seleccionar uno o más campos sobre los cuales se enlazan los parámetros que hayamos fijado en el reporte principal y sus subreportes. Esto es porque no podemos asignar valores a parámetros de subreportes directamente desde código.&lt;br /&gt;&lt;br /&gt;En conclusión, una tarea que puede volverse dispendiosa cuando se hace por primera ves, realmente con el modelo de objetos de Crystal reports desde C#, realmente es sencilla y muy poderosa. Por ejemplo podemos asignar desde código valores a los parámetros, de acuerdo a determinada opción, y ya en el reporte, el valor de ese parámetro determinara el comportamiento del reporte, por ejemplo mostrar u ocultar una de sus secciones.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-116927535335120456?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/116927535335120456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=116927535335120456' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/116927535335120456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/116927535335120456'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2007/01/programando-crystal-reports-i-una.html' title='Programando Crystal Reports I, una mirada práctica'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-115941471393224483</id><published>2006-09-27T20:20:00.000-07:00</published><updated>2006-09-27T21:08:59.506-07:00</updated><title type='text'>Ruby Tuesday</title><content type='html'>&lt;span style="font-size:85%;"&gt;Bueno, esta entrada no hablará exactamente de la famosa canción de los Stones, con la que he titulado esta nueva entrada del blog. Más bien dedicaré algo de tiempo a hablar acerca de un lenguaje que está causando furor, y que vale la pena probar, ya que está basado en una filosofia págmatica, es decir hacer de la programación algo fácil y divertido, como mejor lo dice su propio autor &lt;/span&gt;&lt;a href="http://pickaxe.ruby.org.es/foreword.html"&gt;&lt;span style="font-size:85%;"&gt;http://pickaxe.ruby.org.es/foreword.html&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;.&lt;br /&gt;&lt;br /&gt;Primero aclarar que Ruby es el lenguaje, ya que en la red comienzan a desprenderce diferentes nombres los cuales son: Ruby on Rails, Rails es un Framework construido sobre Ruby, el cual ha hecho de este lenguaje algo verdaderamente importante. Cuando escuchen de Ruby in Steel, básicamente es el AddIn que hace que podamos programar proyectos basados en Ruby utilizando Visual Studio .NET 2005.&lt;br /&gt;&lt;br /&gt;Qué se necesita para utilizar Ruby desde Visual Studio .NET 2005?&lt;br /&gt;Primero conseguirse el interprete de Ruby, el cual pueden descargarse de: &lt;/span&gt;&lt;a href="http://www.rubyonrails.org/down"&gt;&lt;span style="font-size:85%;"&gt;http://www.rubyonrails.org/down&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Luego descargarse Ruby in Steel, que habilita a nuestro IDE para que tengamos plnatillas para Ruby: &lt;/span&gt;&lt;a href="http://www.sapphiresteel.com/"&gt;&lt;span style="font-size:85%;"&gt;http://www.sapphiresteel.com/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;Con esa tarea completa podran entonces iniciar a programar con Ruby dentro de Visual Studio .NET 2005.&lt;br /&gt;&lt;br /&gt;Bien que este sea el inicio de varias entradas acerca de Ruby in Steel, Ruby on Rails, en fin Ruby, para usar un lenguaje verdaderamente potente y que facilite nuestro trabajo. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-115941471393224483?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/115941471393224483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=115941471393224483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/115941471393224483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/115941471393224483'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2006/09/ruby-tuesday.html' title='Ruby Tuesday'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-115086324221171948</id><published>2006-06-20T20:21:00.000-07:00</published><updated>2006-06-20T21:15:00.133-07:00</updated><title type='text'>Ambiguedad en Interfaces</title><content type='html'>&lt;span style="font-family:arial;font-size:78%;"&gt;Si señores, respecto a la pregunta de un amigo, quise ver como solucionar el problema de ambiguedad en el tema de interfaces.&lt;br /&gt;&lt;br /&gt;Me encontré con una técnica, que alivia este problema, y básicamente lo que se hace es un nombramiento completo, usando el nombre de la interfaz (IMiInterface1.Metodo), esto le dice al compilador que método Metodo() está siendo implementado.&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;public interface IMiInterface1&lt;br /&gt;{&lt;br /&gt;void Metodo(int x);&lt;br /&gt;}&lt;br /&gt;public interface IMiInterface2&lt;br /&gt;{&lt;br /&gt;void Metodo(int x);&lt;br /&gt;}&lt;br /&gt;public class MiClase: IMiInterface1, IMiInterface2&lt;br /&gt;{&lt;br /&gt;void IMiInterface1.Metodo(int x)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Llamando al método...{0}",x);&lt;br /&gt;}&lt;br /&gt;void IMiInterface2.Metodo(int x)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Llamando al método...{0}",x);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;class App&lt;br /&gt;{&lt;br /&gt;public static void Main()&lt;br /&gt;{&lt;br /&gt;MiClase obj= new MiClase();&lt;br /&gt;&lt;br /&gt;((IMiInterface1)obj).Metodo(1);&lt;br /&gt;((IMiInterface2)obj).Metodo(2);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Debe tenerse en cuenta que cada llamada a Metodo() en el cliente necesita su respectivo Cast a la interfaz de la cual se va a usar el método.&lt;br /&gt;&lt;br /&gt;En conclusión el nombramiento explicito, es una buen técnica, para evitar la ambiguedad entre interfaces implementadas por una clase, las cuales definen un método igual.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-115086324221171948?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/115086324221171948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=115086324221171948' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/115086324221171948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/115086324221171948'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2006/06/ambiguedad-en-interfaces.html' title='Ambiguedad en Interfaces'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-115007163811780490</id><published>2006-06-11T14:39:00.000-07:00</published><updated>2006-06-11T17:47:16.130-07:00</updated><title type='text'>TypeForwardedToAttribute</title><content type='html'>&lt;span style="font-family:arial;font-size:78%;"&gt;En la entrada anterior, analicé un poco acerca del tema de Generics, ahora vamos con una nueva característica ofrecida por el Framework 2.0.&lt;br /&gt;&lt;br /&gt;El atributo TypeForwardedToAttribute, permite básicamente poder mover los tipos definidos en nuestros assemblies, a nuevos assemblies, y que las aplicaciones clientes, simplemente sean redirecionadas a las nuevas localizaciones de los tipos que esten usando del assemblie, del cual han sido movidos estos tipos. Permitiendo de este modo, simplemente compilar los assemblies pero no las aplicaciones clientes.&lt;br /&gt;&lt;br /&gt;Veamos esto en marcha, con un ejemplo muy sencillo.&lt;br /&gt;&lt;br /&gt;Nuestro assemblie que llamaré "Original" tiene un tipo llamado Ejemplo:&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;&lt;br /&gt;namespace Probando&lt;br /&gt;{&lt;br /&gt;class Ejemplo&lt;br /&gt;{&lt;br /&gt;static Ejemplo()&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Estoy en el ensamblado original.");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;para compilar el código anterior simplemente copienlo en su NotePad, nombren el archivo como original.cs y usando el Command Promp de VS.NET, escribimos el siguiente comando:&lt;br /&gt;&lt;br /&gt;css /t:library original.cs&lt;br /&gt;&lt;br /&gt;Bien con esto ya tenemos el ensamblado "original" con una clase llamada Ejemplo. Recuerden /t:library, le indica al compilador que el resultado va a ser una libreria de clases, no una aplicación ejecutable, ya que nuestro primer ensamblado no contendrá ningún método main().&lt;br /&gt;&lt;br /&gt;Ahora creemeos un pequeño cliente que referencie el ensamblado y utilice su clase:&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using Original;&lt;br /&gt;&lt;br /&gt;namespace Aplicacion&lt;br /&gt;{&lt;br /&gt;class Prueba&lt;br /&gt;{&lt;br /&gt;static void Main()&lt;br /&gt;{&lt;br /&gt;Ejemplo obj = new Ejemplo();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Copien el código anterior al bloc de notas y nombren el archivo como prueba.cs.&lt;br /&gt;En este pequeño cliente, se puede apreciar que se está creando una instancia de la clase Ejemplo, definida en el ensamblado "original".&lt;br /&gt;La compilación del código anterior la pueden ejecutar de la siguiente mandera:&lt;br /&gt;&lt;br /&gt;csc /r:original.dll prueba.cs&lt;br /&gt;&lt;br /&gt;/r le indica al compilador que se está haciendo referencia al ensamblado original.dll, el cual contiene la definición de la clase Ejemplo, que estamos usando en nuestro cliente. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;La salida de prueba.exe será: "Estoy en el ensamblado Original."&lt;br /&gt;&lt;br /&gt;Supongamos que hemos decidido mover el tipo definido en el ensamblado "original" a otro ensamblado que llamaremos NuevaVersion. Entonces cortamos la definición de la clase Ejemplo del ensamblado "original" y la pegamos en un nueco archivo que llamaremos nuevaversion.cs. Compilamos original.cs como lo habiamos hecho antes c&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;on lo cual al ejecutar nuestro cliente obtendremos el siguiente error:&lt;br /&gt;&lt;br /&gt;prueba.cs(2,7): error CS0246: The type or namespace name 'Original' could not be found (are you missing a using directive or an assembly reference?)&lt;br /&gt;&lt;br /&gt;Es obvio lo anterior ya que hemos movido el tipo Ejemplo al nuevo ensamblado que ha quedado así;&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;namespace Probando&lt;br /&gt;{&lt;br /&gt;public class Ejemplo&lt;br /&gt;{&lt;br /&gt;public Ejemplo()&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Estoy en el ensamblado Nueva Versión.");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Copiamos el anterior código en el bloc de notas, y nombramos el archivo como NuevaVersion.cs, y se compila así:&lt;br /&gt;&lt;br /&gt;css /t:library nuevaversion.cs&lt;br /&gt;&lt;br /&gt;Ahora entonces que debemos hacer, para evitar recompilar la aplicación cliente y que siga funcionando aunque haya sido movido el tipo al nuevo ensamblado?&lt;br /&gt;&lt;br /&gt;Agregamos el siguiente atributo, al ensamblado Original, con lo que el código de original.cs queda así:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;using System;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;using System.Runtime.CompilerServices;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;[assembly: TypeForwardedTo(typeof(Probando.Ejemplo))]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;namespace Probando&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;Primero noten el nuevo NameSpace agregado System.Runtime.CompilerServices; para poder hacer uso del atributo [assembly: TypeForwardedTo(typeof(Probando.Ejemplo))].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;Con lo anterior, el cliente seguirá llamando al ensamblado original, pero este internamente redireccionará al ensamblado NuevaVersion para acceder al tipo Ejemplo, que previamente ya habiamos movido a ese nuevo ensamblado.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;Con esto el cliente ahora recibirá el mensaje:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;"Estoy en el ensamblado Nueva Versión."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;Esta es una grandiosa característica, que puede servir mucho para los que se dediquen a crear librerias de clases y necesiten realizar este tipo de actualizaciones, y quieran no tocar nada en las aplicaciones cliente.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-115007163811780490?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/115007163811780490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=115007163811780490' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/115007163811780490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/115007163811780490'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2006/06/typeforwardedtoattribute.html' title='TypeForwardedToAttribute'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-114990262945234680</id><published>2006-06-09T18:01:00.000-07:00</published><updated>2006-06-09T19:15:33.650-07:00</updated><title type='text'>Generics</title><content type='html'>&lt;div align="left"&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;Dandole una mirada al Framework 2.0, este viene con el tema de los tipos genéricos. Básicamente una forma de expresar un tipo, de una manera tal que permita trabajar con cualquier tipo de dato. Por ejemplo: &lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;Si queremos definir un tipo, llamado stack (pila), no generico tenemos algo como esto:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;class Stack {&lt;br /&gt;private object[] store;&lt;br /&gt;private int size;&lt;br /&gt;public Stack()&lt;br /&gt;store=new object[10]; size=0;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;&lt;br /&gt;Ahora si lo quieren genérico, aqui está lo interesante del asunto:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;class Stack&lt;t&gt; {&lt;br /&gt;private T[] store;&lt;br /&gt;private int size;&lt;br /&gt;public Stack()&lt;br /&gt;store=new T[10]; size=0;&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;Fijense que sería como una especie de plantilla, para la cual definiremos cualquier tipo de dato, consiguiendo una clase stack de tipos genéricos. En el caso no genérico tenemos por ejemplo un arreglo store como tipo object, lo que supone recibir cualquier tipo de datos, pero incurriendo obviamente en la costosa operación de boxing y unboxing.&lt;br /&gt;Por el contrario, con nuestro modelo genérico el arreglo store, está habilitado para ser del tipo que le definamos sin incurrir en operaciones de boxing y unboxing.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;Hasta el momento el ejemplo nos muestra que podemos definir tanto Clases como sus miembros de tipo genérico.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;Pero ahora veamos la implementación de los métodos de ingreso y sacada de elementos de la pila en el modo no genérico:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;public void Push(object x) {&lt;br /&gt;if (size&gt;=store.Size) {&lt;br /&gt;object[] tmp = new object[size*2];&lt;br /&gt;Array.Copy(store,tmp,size);&lt;br /&gt;store = tmp;&lt;br /&gt;}&lt;br /&gt;store[size++] = x;&lt;br /&gt;}&lt;br /&gt;public object Pop() {&lt;br /&gt;return store[--size];&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;Es de observar el uso de object como forma de recibir cualquier tipo de dato, pero si le pasamos tipos primitivos, incurrimos en la no bienvenida operación de box, por ejemplo, compilemos lo anterior y analicemos un poco el IL generado.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:78%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/559/2798/1600/generics1.7.jpg"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/559/2798/400/generics1.3.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;En la ventana generada gracias al ILDASM.EXE en la línea IL_000a: box, se aprecia una clara llamada a una operación de box. Ahora imaginense esto ocurriendo por cada elemento que entre a la pila de tipo primitivo, en este caso un entero, que deberá ser casteado a Object.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;Ahora observermos la versión genérica mirada a través de la lupa del ILDASM:&lt;br /&gt;&lt;br /&gt;public void Push(T x)&lt;br /&gt;{&lt;br /&gt;if (size&gt;=store.Length)&lt;br /&gt;{&lt;br /&gt;T[] tmp = new T[size*2];&lt;br /&gt;Array.Copy(store,tmp,size);&lt;br /&gt;store = tmp;&lt;br /&gt;}&lt;br /&gt;store[size++] = x;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public T Pop()&lt;br /&gt;{&lt;br /&gt;return store[--size];&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/559/2798/1600/generics2.jpg"&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/559/2798/400/generics2.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;Alguien me puede ayudar a buscar la operación de Box que no la veo. Si señores, una ventaja de Generics vista en puro C# convertido a IL.&lt;br /&gt;&lt;br /&gt;Como se puede observar, igualmente nuestra clase genérica puede también tener Métodos genéricos, el caso de Pop() y métodos no genéricos que reciben tipos genéricos el caso de Push().&lt;br /&gt;&lt;br /&gt;Este ejmplo lo tome del artículo &lt;/span&gt;&lt;a href="http://research.microsoft.com/projects/clrgen/generics.pdf"&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;http://research.microsoft.com/projects/clrgen/generics.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;&lt;br /&gt;y quise comprobar a través del ILDASM, para ver de cerca una de las ventajas claras de Generics Types.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-114990262945234680?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/114990262945234680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=114990262945234680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/114990262945234680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/114990262945234680'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2006/06/generics.html' title='Generics'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-114990125143008366</id><published>2006-06-09T17:56:00.000-07:00</published><updated>2006-06-09T20:11:18.410-07:00</updated><title type='text'>UNICAUCA en Imagine Cup 2006</title><content type='html'>&lt;span style="font-family:arial;font-size:78%;"&gt;Si señores, nuevamente mi amada Universidad, en la final del Imagine Cup 2006, esta ves a realizarse en la India.&lt;br /&gt;&lt;br /&gt;Cuatro estudiantes con muchas ganas, se dieron a la tarea de hacer un desarrollo utilizando tecnología .NET, para cumplir con el lema del evento que reza "Imagina un mundo donde la tecnología nos permite vivir vidas mas saludables", consiguiendo un producto que basado en la Electro-Acupuntura, logran determinar el estado de salud de una persona, de acuerdo a ciertos rangos establecidos, según la información electrica recogida a través de un dispositivo hardware conectado al puerto serie, y logrando así una gran intereacción a través de una aplicación de Windows Forms, y usando también clientes Pocket y ASP.NET.&lt;br /&gt;&lt;br /&gt;Mis más sinceras felicitaciones, y esperemos que se traigan una buena posición en la final, sino la primera.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-114990125143008366?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/114990125143008366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=114990125143008366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/114990125143008366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/114990125143008366'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2006/06/unicauca-en-imagine-cup-2006.html' title='UNICAUCA en Imagine Cup 2006'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-114827120667281023</id><published>2006-05-21T20:27:00.000-07:00</published><updated>2006-05-22T18:36:08.110-07:00</updated><title type='text'>Microsoft Andean Developer Days</title><content type='html'>&lt;span style="font-family:arial;font-size:78%;"&gt;Hola de nuevo.&lt;br /&gt;&lt;br /&gt;Si señores, los dias 15 y 16 de Mayo se celebró en la ciudad de Bogotá en el Hotel COSMOS este magnanimo evento. Con la oportunidad de reunirse con los expositores ya conocidos: Miguel Mendoza, Willy Marroquin y el señor Ricardo González, por su participación como Comunidad, pero manteniendo su libertad por no ser workers de Microsoft.&lt;br /&gt;&lt;br /&gt;El Señor Rocardo González presentó el tema de los Gadgets en Windows Vista. Muy interesante, básicamente pequeñas aplicaciones residentes en algo que se conoce como el SideBar, pero que prestan bastante potencial para ofrecer información instantánea a los usuarios de este grandioso Sistema Operativo.&lt;br /&gt;Revisen &lt;/span&gt;&lt;a href="http://microsoftgadgets.com/"&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;http://microsoftgadgets.com/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;Por su parte Mr Willy mostró esta cosa de SOA, aluciendo como siempre su simpática forma de presentar los temás, que lo colocan de 2do en mi ranking de los mejores expositores que se vieron en el evento. Esto de SOA pues si estuvo muy interesante, sobre todo lo referente a la cosa Enterprise, donde lo veo con la fuerza y el estilo muy CMMI. Hablando de niveles de madurez y mostrando 5 o 6 niveles no recuerdo, de la misma forma que lo hace CMMI.&lt;br /&gt;Además requiere de la participación de todos los personajes de la Enterprise, y su sustento final, obviamente serán los Web Services, por la cosa heterogenea que pretende atacar esta maravillosa forma de ver las arquitecturas.&lt;br /&gt;&lt;br /&gt;Bien, continuando, ahora llegan personajes nuevos a quienes no había podido escuchar en charlas: de perú Segundo Leon, con la cosa del Office 12, para que pero estuvo muy interesante, mostró todo de forma muy didáctica y dejo ver realmente las nuevas potencialidades del Office 12, basado plenamente en XML. El señor David Parra consultor de Microsoft, con el tema de Web Services, muy bueno, mostrando la cosa desde un enfoque más Guideline, es decir basó su charla en lo que la gente de Patterns and Practices han sacado para mostrar las diferentes formas de asegurar nuestra infraestructura en la parte de Web Services y sus respectivos clientes. Recomendado: &lt;/span&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=3E02A6C8-128A-47C2-9F39-4082582F3FE1&amp;displaylang=en"&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=3E02A6C8-128A-47C2-9F39-4082582F3FE1&amp;amp;displaylang=en&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;El señor Mauricio Alvarez, con quien he tenido la oportunidad de estar en Cali en sesiones de Arquitectura, se lució en su presentación, haciendola como siempre muy amena y tratando el tema alrededor del ciclo de vida del desarrollo, tocando la cosa de: requerimientos, arquitectura, desarrollo, pruebas, y técnicas usadas por las diferentes empresas en las cuales cada uno participamos jugando roles que se mostraron en la charla, y se dejaron ver como aca en Bogotá se usan de una u otra cosa para tratar de mantener los proyectos marchando de manera adecuada. La principal conclusión quiza, es el no uso de técnicas eficientes de Estimación, algo que puede incidir en el aumento en los retrasos y obviemnte los costes de los proyectos.&lt;br /&gt;&lt;br /&gt;Y el gran señor, expositor internacional de INETA, y mi idolo en esto de .NET, de la hermana Argentina, el señor Dani Seara. Hasta ahora no he visto mejor expositor que este señor. En todo momento manteniendo atento a su público nos deleitó con 2 horas acerca de Windows Workflow Foundation. Mostrando la cosa teórica y llevando cada tema a la práctica con ejemplos claros usando obviamente VS.NET 2005. Gracias Dani porque tú Universidad.NET me inció en este cuento. Lástimosamente me acerqué a hablar con él de por qué no ha continuado la cosa de la Universidad.NET y muy simpáticamente me mandó a preguntarle a los señores de Microsoft, responsables directos de que el proyecto esté detenido.&lt;br /&gt;&lt;br /&gt;Ah no se me puede escapar el señor Ruben Sanchéz, lucido con el tema de Windows Presentation Foundation, mostró la cosa nueva de las herramientas para diseñadores que traerá Microsoft, en la parte de gráficos Pixelados y Vectoriales, y la animáción de todo esto, que en futuro vendrá integrado para dar toda la productividad del caso. La conclución, todo esto basado en XAML, del que se puede sacar mucho provecho desde nuestras aplicaciones.&lt;br /&gt;&lt;br /&gt;En resumen, un DevDays maravilloso, donde yo creo que la inmensa mayoría quedamos muy satisfechos y a la espera de todo lo que viene de la mano de Microsoft y sus grandiosos productos.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-114827120667281023?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/114827120667281023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=114827120667281023' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/114827120667281023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/114827120667281023'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2006/05/microsoft-andean-developer-days.html' title='Microsoft Andean Developer Days'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-114687433095493494</id><published>2006-05-05T17:08:00.000-07:00</published><updated>2006-05-05T17:12:10.966-07:00</updated><title type='text'>ATLAS llega con fuerza</title><content type='html'>&lt;span style="font-size:78%;"&gt;Si señores, ésto si que es bien interesante, y tiene por nombre ATLAS. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Que es algo así como un framework, que encapsula a alto nivel lo referente a eso que se conoce como AJAX. Quieren tener buena información del asunto? pues aqui está el punto de entrada para estar al dia con esta nueva tecnología: &lt;/span&gt;&lt;a href="http://atlas.asp.net/Default.aspx?tabid=47"&gt;&lt;span style="font-size:78%;"&gt;http://atlas.asp.net/Default.aspx?tabid=47&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Por lo demás pues vamos traduciendo algunas de sus características para que vayamos dando juicios de esta nueva ayuda tecnologíca a las manos de los que andamos en el cuento del desarrollo usando ASP.NET. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;“Atlas” habilita a los sitios para tomar completa ventaja de los browsers modernos. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;“Atlas” da via libre a los desarrolladores ASP.NET para crear experiencias web muy ricas para los clientes. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;“Atlas” incluye un Framework de Javascript del lado del cliente para facilitar la creación y reusos de scripts. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;“Atlas” hace muy fácil el consumo de servicios desde ASP.NET.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Si señores Atlas llega con fuerza, y yo por mi parte comenzaré a actualizarme en el tema para mantenerlos al tanto.&lt;br /&gt;Sería bueno iniciar una discusión alrededor de esta causa, para sacarle bastante provecho. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-114687433095493494?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/114687433095493494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=114687433095493494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/114687433095493494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/114687433095493494'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2006/05/atlas-llega-con-fuerza.html' title='ATLAS llega con fuerza'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-114678995617633430</id><published>2006-05-04T17:35:00.000-07:00</published><updated>2006-05-04T17:45:56.190-07:00</updated><title type='text'>Delphi .NET, GDI+ y un poco más</title><content type='html'>&lt;span style="font-size:78%;"&gt;Reencontrandome con un colectivo de personajes con los cuales nos dedicabamos hace un tiempo a escribir para la comunidad de developers que usan herramientas tipo Borland, hemos retomado la cosa, y queriendo participar en la causa, pues escogí como tema Delphi.NET, para programar cosas con GDI+.&lt;br /&gt;Lo que quiero es ir mostrando a paso lento pero seguro, cómo es la situación esta del Object Pascal for .NET.&lt;br /&gt;Por ejemplo ahora en la sección Uses pueden ver cosas como estas:&lt;br /&gt;uses System.Drawing;&lt;br /&gt;Si señores, ahi le indicamos a Mr Delphi que vamos a necesitar acceso a las clases de este namespace, y finalmente poder utilizarlas.&lt;br /&gt;Luego dicen por ahi que Private y Protected en Delphi.NET no son como los pintan. Si señores, si ustedes usan&lt;br /&gt;private intXo: integer;&lt;br /&gt;Le cuento que además de ser usado dentro de la clase, a ese engendro lo pueden ver desde afuera. Cómo la ven? a mí la verdad a merced de que esto sea por mera casualidad o por resolver chicharrones para el equipo de la Borland Corporation, pues me parece una falta de atrevimiento querer hacer llover hacia arriba.&lt;br /&gt;Quiere entonces que lo privado sea verdaderamente privado? pues teneis que usar:&lt;br /&gt;strict private&lt;br /&gt;Cómo les queda el ojo? un poco borroso, pues amí me quedo así cuando vi eso, y lo mismo haganle al protected si quieren que sea verdaderamente protected.&lt;br /&gt;Quieren ver otra critica a los MRs de Borland? &lt;/span&gt;&lt;a href="http://thenetrix.blogspot.com/2006/04/anda-qu-chulo-y-quin-trabaja.html"&gt;&lt;span style="font-size:78%;"&gt;http://thenetrix.blogspot.com/2006/04/anda-qu-chulo-y-quin-trabaja.html&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Bueno aqui además de criticar a Borland, pues tambièn vamos a lo que vinimos:&lt;br /&gt;Supongase que quieren pintar un tablero de ajedrez en su Windows Forms, aqui esta el code:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;type  TGraficos = class  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;  private   &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt; { &lt;/span&gt;&lt;span style="font-size:78%;"&gt;Private Declarations }    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;  intXo: integer;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;  intYo: integer;   &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;   intAncho: integer;  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;  public    constructor Create;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;  procedure PintarTablero(objGraficos: Graphics);    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;end;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;implementation&lt;br /&gt;constructor TGraficos.Create;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;begin  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;   inherited Create;  // TODO: Add any constructor code here  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;   intXo := 80;  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;   intYo := 0; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;   intAncho := 60;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;end;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;procedure TGraficos.PintarTablero;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;var  objPen: Pen;  objBrushNegro: Brush;  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;objBrushBlanco:  Brush;  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;intContador1: integer; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt; intContador2: integer;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;begin&lt;br /&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;for intContador1 := 0 to 7 do    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;  for intContador2 := 0 to 7 do      &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;    if ((intContador1 + intContador2) mod 2) = 1 then        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;       objGraficos.FillRectangle(objBrushNegro, intXo + intContador2 *        intAncho, intYo + intContador1 *    intAncho, intXo + intContador1 * intAncho +        intAncho, intYo + intContador2 * intAncho + intAncho)           &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;   else        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;     objGraficos.FillRectangle(objBrushBlanco, intXo + intContador2 * intAncho,        intYo + intContador1 *   intAncho, intXo + intContador2 * intAncho + intAncho,        intYo + intContador1 * intAncho + intAncho);&lt;br /&gt;  objPen.Dispose();  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;  objBrushBlanco.Dispose();  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;  objBrushNegro.Dispose();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;TGraficos, recuerden, uno de los 10 mandamientos dice: "Colocaras una T antecediendo el nombre de tú &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;clase", vaya que en esto si soy responsable y no he olvidado los mandamientos tipo Borland.&lt;br /&gt;Fijense el uso de var para declarar variables locales al procedimiento. Ah si, además esto funciona como Mr VB, toca decirle al señor compilador, vea esto es un procedure, o esto es una function. Sencillo el primero no retorna nada, el segundo si retorna. Ah cosas raras, yo prefiero C#.&lt;br /&gt;El famoso Begin, esto me recuerda al viejo pseudocódigo, pero en fin hace las veces de las {} para los Javeros, C++, y C#reros, podría decirse?&lt;br /&gt;Pero bueno, finalmente, llegamos a la conclusión. A parte de toda esta parafernalia heredada del object pascal comun y corriente, llegamos al punto del uso de nuestras queridas clases del .NET Framework, que eso si es totalmente transparente para los que le dedicamos 9 hrs al dia y un poco más a .NET. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Fijense como el procedure recibe un tipo Graphics, muy simple, instancian TGraficos, y al constructor le asiganan por ejemplo el Graphics devuelto por la forma, al estilo, self.CreateGraphics(), o hacen el llamdo en el evento Paint de la forma y le pasan e.Graphics. El primero como ven es un método como tal, el segundo una propiedad del tipo (e) de la clase PaintEventArgs. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Adicionalmente pueden ponerse en su Form un control tipo pictureBox, y lo usan para retornar el tipo Graphics, de la misma forma como lo hacen con el Form.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Recuerden que esto es uso de GDI+, entre más complejos son lo gráficos y las utilidades que usamos, debemos estar al pendiente de liberar los recursos, para no tener sobrecarga en recursos de memory y procesamiento. Para esto, en mi sencillo ejemplo invoco el método Dispose() de cada uno de los objetos que han o están ocupando recursoso de mi máquina.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Si señores esto es &lt;/span&gt;&lt;span style="font-size:78%;"&gt;Delphi.NET, un lenguaje más que se une a la liga de la justicia, por qué? sencillo, para estar  a la moda. No mentira, porque saben que deben estar al dia con lo que se trabaja actualmente y así no quedarse resagados en relación a IDEs como VS.NET 2005. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;Una cosa si les digo, quieren invertir bien la plata? Comprense un VS.NET, la verdad es que Delphi 8 for Microsoft .NET Frameowrk, deja mucho que desear.&lt;br /&gt;Un abrazo&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-114678995617633430?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/114678995617633430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=114678995617633430' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/114678995617633430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/114678995617633430'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2006/05/delphi-net-gdi-y-un-poco-ms.html' title='Delphi .NET, GDI+ y un poco más'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26706176.post-114567665045101616</id><published>2006-04-21T20:27:00.000-07:00</published><updated>2006-04-21T21:24:57.963-07:00</updated><title type='text'>Bienvenida</title><content type='html'>Por razones insolitas y salidas de mis manos, mi blog anterior ha visto su tumba y ha quedado enterrado en los confines del ciberespacio.&lt;br /&gt;Es momento entonces de crearme un nuevo blog, esta ves en honor a mi hija Sofia. Por eso la url del Blog.&lt;br /&gt;&lt;br /&gt;Como siempre este espacio está dedicado a .NET y todos sus intringulis.&lt;br /&gt;Espero que sean de utilidad cada una de las cosas que pretendo colgar aqui, básicamente sacadas del dia a dia en mi trabajo, y en el trabajo de muchos que hacen de .NET una tecnología digna de ser investigada y transmitida a muchos más.&lt;br /&gt;&lt;br /&gt;Bienvenidos!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26706176-114567665045101616?l=dotnetsofi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetsofi.blogspot.com/feeds/114567665045101616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26706176&amp;postID=114567665045101616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/114567665045101616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26706176/posts/default/114567665045101616'/><link rel='alternate' type='text/html' href='http://dotnetsofi.blogspot.com/2006/04/bienvenida.html' title='Bienvenida'/><author><name>Andrés Ortíz</name><uri>http://www.blogger.com/profile/14130990108743741246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_tP7sdi3BZ2A/ScbQPlZROmI/AAAAAAAAAJc/bN-TLPeJnt0/S220/DSC01092.JPG'/></author><thr:total>0</thr:total></entry></feed>
