<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>NetCódigo</title>
	<atom:link href="http://netcodigo.webinfo.es/feed/" rel="self" type="application/rss+xml" />
	<link>http://netcodigo.webinfo.es</link>
	<description>Blog cuya única intención es compartir conocimientos. El conocimiento es un bien que crece a medida que se comparte</description>
	<lastBuildDate>Mon, 06 Apr 2009 10:34:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Virtual Earth Map Control</title>
		<link>http://netcodigo.webinfo.es/2009/04/06/virtual-earth-map-control/</link>
		<comments>http://netcodigo.webinfo.es/2009/04/06/virtual-earth-map-control/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 10:33:38 +0000</pubDate>
		<dc:creator>Felipe Santana</dc:creator>
				<category><![CDATA[ASP.Net Ajax]]></category>
		<category><![CDATA[Headline]]></category>
		<category><![CDATA[Windows Live]]></category>
		<category><![CDATA[live]]></category>

		<guid isPermaLink="false">http://netcodigo.webinfo.es/?p=746</guid>
		<description><![CDATA[Como ya comenté en el último post, veremos en sucesivos cómo integrar servicios de Windows Live en nuestros proyectos de Visual Studio. Hoy veremos el control Virtual Earth Map.
Lo primero que debemos hacer es instalarnos Windows Live Tools for Visual Studio. La última release es de Noviembre del 2008. Esta herramienta nos habilitará los distintos controles que hasta esa fecha incluye. También instalará plantillas para nuevos proyectos aunque esto solo será posible si usamos la versión inglesa de Visual Studio. Si no es así, no hay problema, simplemente no podremos ...]]></description>
			<content:encoded><![CDATA[<p>Como ya comenté en el último <a href="http://netcodigo.webinfo.es/2009/04/03/windows-live-dev/" target="_self">post</a>, veremos en sucesivos cómo integrar servicios de Windows Live en nuestros proyectos de Visual Studio. Hoy veremos el control <a href="http://msdn.microsoft.com/en-us/library/cc788749.aspx" target="_blank">Virtual Earth Map</a>.</p>
<p>Lo primero que debemos hacer es instalarnos <a href="http://dev.live.com/tools/" target="_blank">Windows Live Tools for Visual Studio</a>. La última release es de Noviembre del 2008. Esta herramienta nos habilitará los distintos controles que hasta esa fecha incluye. También instalará plantillas para nuevos proyectos aunque esto solo será posible si usamos la versión inglesa de Visual Studio. Si no es así, no hay problema, simplemente no podremos elegir la plantilla de Windows Live Web Site, no tiene mayor importancia.</p>
<p>Para utilizar Virtual Earht Map control lo único que tenemos que hacer es arrastrar dicho control a nuestra página.<br />
<img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/mapcontrol1.gif" alt="" /><br />
Esta acción incluirá una referencia en nuestra página a Microsoft.Live.ServerControls. Además, hay que incluir en la página un ScriptManager para hacer posible la funcionalidad Ajax que brinda el control. Tan sencillo como esto. Este sería el código de la página.</p>
<blockquote><p>&lt;%@ Page Language=&#8221;VB&#8221; AutoEventWireup=&#8221;false&#8221; CodeFile=&#8221;Default.aspx.vb&#8221; Inherits=&#8221;_Default&#8221; %&gt;</p>
<p>&lt;%@ Register Assembly=&#8221;Microsoft.Live.ServerControls.VE&#8221; Namespace=&#8221;Microsoft.Live.ServerControls.VE&#8221;<br />
TagPrefix=&#8221;ve&#8221; %&gt;</p>
<p>&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; &#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221;&gt;</p>
<p>&lt;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221;&gt;<br />
&lt;head runat=&#8221;server&#8221;&gt;<br />
&lt;title&gt;&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;form id=&#8221;form1&#8243; runat=&#8221;server&#8221;&gt;<br />
&lt;asp:ScriptManager ID=&#8221;ScriptManager1&#8243; runat=&#8221;server&#8221;&gt;<br />
&lt;/asp:ScriptManager&gt;<br />
&lt;div&gt;<br />
&lt;ve:Map ID=&#8221;Map1&#8243; runat=&#8221;server&#8221; Height=&#8221;400px&#8221; Width=&#8221;400px&#8221; ZoomLevel=&#8221;9&#8243; Center-Longitude=&#8221;-15.5925&#8243; Center-Latitude=&#8221;27.958611&#8243; Locale=&#8221;es_es&#8221; ScaleBarDistanceUnit=&#8221;Kilometers&#8221; /&gt;<br />
&lt;/div&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p></blockquote>
<p>Con simplemente este código conseguimos esto:<br />
<img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/mapcontrol2.gif" alt="" /><br />
Sencillito ¿no?</p>
<p>El control viene muy bien, tiene bastantes propiedades para su personalización, a destacar:</p>
<ul>
<li><strong>ID</strong>. Obligatorio. Id del control.</li>
<li><strong>Height</strong>. Opcional. Altura, por defecto 400px</li>
<li><strong>Width</strong>. Opcional. Ancho, por defecto 400px</li>
<li><strong>ZoomLevel</strong>. Opcional. Zoom por defecto</li>
<li><strong>Altitude</strong>. Opcional. Altitud en metros</li>
<li><strong>Center-Latitude</strong>. Opcional.  Latitud en grados</li>
<li><strong>Center-Longitude</strong>. Opcional.  Longitud en grados. Desde -180 a 180</li>
</ul>
<p>El resto de propiedades las puede ver <a href="http://msdn.microsoft.com/en-us/library/cc788749.aspx" target="_blank">aquí</a>.</p>
<p>Pero para mí, lo más interesante del control es la posibilidad de controlar eventos del mismo. En el link anterior pueden ver la lista completa de los mismos.</p>
<p>Como pueden observar muy sencillito añadir a una página este tipo de servicios. Hasta otra.</p>
]]></content:encoded>
			<wfw:commentRss>http://netcodigo.webinfo.es/2009/04/06/virtual-earth-map-control/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Windows Live Dev</title>
		<link>http://netcodigo.webinfo.es/2009/04/03/windows-live-dev/</link>
		<comments>http://netcodigo.webinfo.es/2009/04/03/windows-live-dev/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 17:15:47 +0000</pubDate>
		<dc:creator>Felipe Santana</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Windows Live]]></category>
		<category><![CDATA[live]]></category>

		<guid isPermaLink="false">http://netcodigo.webinfo.es/?p=737</guid>
		<description><![CDATA[ Supongo que todos sabrán qué es Windows Live Dev, como tengo la intención de escribir algún que otro post al respecto he pensado hacer uno describiendolo de manera somera.
Windows Live Dev es una plataforma pensada para desarrolladores de software. Ofrece una serie de herramientas para poder integrar nuestras aplicaciones con servicios ofrecidos por Microsoft.
En cuanto a servicios ofrece ya unos cuantos, entre otros:

Alertas
Contactos
Messenger
Photo Gallery
Search
SilverLight Streaming
Spaces
Virtual Earht
Windows Live Id

En cuanto a herramientas y evidentemente para Visual Studio ofrece unas Tools con controles para ASP.Net y Templates para hacer más sencillo ...]]></description>
			<content:encoded><![CDATA[<p><img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/windowslive.png" alt="" /> Supongo que todos sabrán qué es <a href="http://dev.live.com/" target="_blank">Windows Live Dev</a>, como tengo la intención de escribir algún que otro post al respecto he pensado hacer uno describiendolo de manera somera.</p>
<p>Windows Live Dev es una plataforma pensada para desarrolladores de software. Ofrece una serie de herramientas para poder integrar nuestras aplicaciones con servicios ofrecidos por Microsoft.</p>
<p>En cuanto a servicios ofrece ya <a href="http://dev.live.com/about/" target="_blank">unos cuantos</a>, entre otros:</p>
<ul>
<li><a href="http://dev.live.com/alerts/" target="_blank">Alertas</a></li>
<li><a href="http://dev.live.com/contacts/" target="_blank">Contactos</a></li>
<li><a href="http://dev.live.com/messenger/" target="_blank">Messenger</a></li>
<li><a href="http://dev.live.com/photogallery/" target="_self">Photo Gallery</a></li>
<li><a href="http://dev.live.com/livesearch/" target="_blank">Search</a></li>
<li><a href="http://dev.live.com/silverlight/" target="_blank">SilverLight Streaming</a></li>
<li><a href="http://dev.live.com/spaces/" target="_blank">Spaces</a></li>
<li><a href="http://dev.live.com/virtualearth/" target="_blank">Virtual Earht</a></li>
<li><a href="http://dev.live.com/liveid/" target="_blank">Windows Live Id</a></li>
</ul>
<p>En cuanto a herramientas y evidentemente para Visual Studio ofrece unas <a href="http://dev.live.com/tools/" target="_blank">Tools</a> con controles para ASP.Net y Templates para hacer más sencillo el desarrollo.</p>
<p>Además:</p>
<ul>
<li> <a href="http://dev.live.com/blogs/bloglist.aspx" target="_blank">blogs oficiales</a><a href="http://dev.live.com/forums/" target="_blank"></a></li>
<li><a href="http://dev.live.com/forums/" target="_blank">foros</a><a href="http://msdn.microsoft.com/en-us/library/bb264574.aspx" target="_blank"></a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/bb264574.aspx" target="_blank">documentación</a><a href="http://dev.live.com/quickapps/" target="_blank"></a></li>
<li><a href="http://dev.live.com/quickapps/" target="_blank">Quick Applications</a></li>
</ul>
<p>A grosso esto es Windows Live Dev. Creo que suficiente para los (teóricamente) futuros post.</p>
<p>Saludos</p>
]]></content:encoded>
			<wfw:commentRss>http://netcodigo.webinfo.es/2009/04/03/windows-live-dev/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agrupando con ListView, JQuery y ASP.Net Ajax</title>
		<link>http://netcodigo.webinfo.es/2009/03/23/agrupando-con-listview-jquery-y-aspnet-ajax/</link>
		<comments>http://netcodigo.webinfo.es/2009/03/23/agrupando-con-listview-jquery-y-aspnet-ajax/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 12:16:59 +0000</pubDate>
		<dc:creator>Felipe Santana</dc:creator>
				<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[ASP.Net Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[listview]]></category>

		<guid isPermaLink="false">http://netcodigo.webinfo.es/?p=728</guid>
		<description><![CDATA[Hace unas semanas vimos un post en el que se mostraba como agrupar el típico maestro-detalle utilizando GridView. Hoy veremos esto mismo pero utilizando JQuery, AJAX y el control ListView.
Este control, a mí personalmente, me parece un control espectacular, te permite hacer todo lo que no se puede hacer con un GridView y más.
En el ejemplo que veremos no me he complicado la vida dejándolo &#8220;bonito&#8221;, la idea es que vean que se puede hacer. ¿Qué conseguimos? Pues lo mismo que en el post comentado, mostrar las cabeceras en una ...]]></description>
			<content:encoded><![CDATA[<p>Hace unas semanas vimos un <a href="http://netcodigo.webinfo.es/2009/03/02/agrupando-con-gridview-y-aspnet-ajax/" target="_blank">post</a> en el que se mostraba como agrupar el típico maestro-detalle utilizando GridView. Hoy veremos esto mismo pero utilizando JQuery, AJAX y el control ListView.<br />
Este control, a mí personalmente, me parece un control espectacular, te permite hacer todo lo que no se puede hacer con un GridView y más.</p>
<p>En el ejemplo que veremos no me he complicado la vida dejándolo &#8220;bonito&#8221;, la idea es que vean que se puede hacer. ¿Qué conseguimos? Pues lo mismo que en el post comentado, mostrar las cabeceras en una tabla y que al pulsar sobre cada una de ellas nos muestre el detalle. Tal que así:<br />
<img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/listviewagrup1.gif" alt="" /></p>
<p>Y al pinchar en cualquier fila muestra su detalle correspondiente.</p>
<p><img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/listviewagrup2.gif" alt="" /></p>
<p>¿Cómo se logra? Como hemos dicho, las rows para las cabeceras están en un ListView, y en el detalle de este ListView incluiremos otro para mostrar las filas correspondientes. Como siempre, vamos por partes.</p>
<p>El HTML</p>
<blockquote><p>&lt;asp:SqlDataSource ID=&#8221;SqlDataSource1&#8243; runat=&#8221;server&#8221; SelectCommand=&#8221;SELECT SalesOrderID, OrderDate, TotalDue FROM Sales.SalesOrderHeader ORDER BY OrderDate&#8221; ConnectionString=&#8221;&lt;%$ ConnectionStrings:AwBD %&gt;&#8221;&gt;&lt;/asp:SqlDataSource&gt;</p>
<p>&lt;asp:ScriptManager ID=&#8221;ScriptManager1&#8243; runat=&#8221;server&#8221; /&gt;<br />
&lt;h2&gt;Ventas&lt;/h2&gt;<br />
&lt;asp:UpdatePanel ID=&#8221;UPListView&#8221; runat=&#8221;server&#8221;&gt;<br />
&lt;ContentTemplate&gt;<br />
&lt;asp:ListView ID=&#8221;ListView1&#8243; runat=&#8221;server&#8221; DataSourceID=&#8221;SqlDataSource1&#8243;&gt;<br />
&lt;LayoutTemplate&gt;<br />
&lt;table&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;&lt;/th&gt;<br />
&lt;th&gt;Número&lt;/th&gt;<br />
&lt;th&gt;Fecha&lt;/th&gt;<br />
&lt;th&gt;Importe&lt;/th&gt;<br />
&lt;/tr&gt;<br />
&lt;tr runat=&#8221;server&#8221; ID=&#8221;itemPlaceholder&#8221;&gt;&lt;/tr&gt;<br />
&lt;/table&gt;</p>
<p>&lt;asp:DataPager runat=&#8221;server&#8221; ID=&#8221;AfterListDataPager&#8221;<br />
PagedControlID=&#8221;ListView1&#8243;<br />
PageSize=&#8221;8&#8243;&gt;<br />
&lt;Fields&gt;<br />
&lt;asp:TemplatePagerField&gt;<br />
&lt;/asp:TemplatePagerField&gt;<br />
&lt;asp:NextPreviousPagerField ButtonType=&#8221;Button&#8221;<br />
ShowFirstPageButton=&#8221;false&#8221;<br />
ShowNextPageButton=&#8221;false&#8221;<br />
ShowPreviousPageButton=&#8221;false&#8221; /&gt;<br />
&lt;asp:NumericPagerField ButtonCount=&#8221;10&#8243; /&gt;<br />
&lt;asp:NextPreviousPagerField ButtonType=&#8221;Button&#8221; ShowLastPageButton=&#8221;false&#8221; ShowNextPageButton=&#8221;false&#8221;<br />
ShowPreviousPageButton=&#8221;false&#8221; /&gt;</p>
<p>&lt;/Fields&gt;<br />
&lt;/asp:DataPager&gt;</p>
<p>&lt;/LayoutTemplate&gt;<br />
&lt;ItemTemplate&gt;<br />
&lt;tr class=&#8221;RowsHead&#8221; id=&#8217;&lt;%# Eval(&#8221;SalesOrderID&#8221;) %&gt;&#8217;&gt;<br />
&lt;td&gt;&lt;img id=&#8217;imgplus&lt;%# Eval(&#8221;SalesOrderID&#8221;)%&gt;&#8217; src=&#8221;img/mas.gif&#8221; alt=&#8221;" title=&#8221;" /&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;asp:Label ID=&#8221;SalesOrderID&#8221; runat=&#8221;server&#8221; Text=&#8217;&lt;%# Eval(&#8221;SalesOrderID&#8221;) %&gt;&#8217; /&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;asp:Label ID=&#8221;Label1&#8243; runat=&#8221;server&#8221; Text=&#8217;&lt;%# String.Format(Eval(&#8221;OrderDate&#8221;),&#8221;dd/mm/yyyy&#8221;) %&gt;&#8217; /&gt;&lt;/td&gt;<br />
&lt;td style=&#8221;text-align:right;&#8221;&gt;&lt;asp:Label ID=&#8221;Label2&#8243; runat=&#8221;server&#8221; Text=&#8217;&lt;%# Eval(&#8221;TotalDue&#8221;,&#8221;{0:n}&#8221;) %&gt;&#8217; /&gt;&lt;/&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr id=&#8217;Detail&lt;%# Eval(&#8221;SalesOrderID&#8221;)%&gt;&#8217; class=&#8221;oculto&#8221;&gt;<br />
&lt;td colspan=&#8221;3&#8243;&gt;<br />
&lt;div&gt;<br />
&lt;asp:SqlDataSource ID=&#8221;SqlDataSource2&#8243; runat=&#8221;server&#8221; SelectCommand=&#8221;SELECT ProductID, OrderQty, UnitPrice FROM Sales.SalesOrderDetail where SalesOrderID= @SalesOrderID ORDER BY ProductID&#8221; ConnectionString=&#8221;&lt;%$ ConnectionStrings:AwBD %&gt;&#8221;&gt;<br />
&lt;SelectParameters&gt;<br />
&lt;asp:Parameter Type=&#8221;String&#8221; DefaultValue=&#8221;" Name=&#8221;SalesOrderID&#8221; /&gt;<br />
&lt;/SelectParameters&gt;<br />
&lt;/asp:SqlDataSource&gt;<br />
&lt;asp:ListView ID=&#8221;ListView2&#8243; runat=&#8221;server&#8221; DataSourceID=&#8221;SqlDataSource2&#8243;&gt;<br />
&lt;LayoutTemplate&gt;<br />
&lt;h2&gt;Detalle&lt;/h2&gt;<br />
&lt;table&gt;<br />
&lt;tr&gt;<br />
&lt;th runat=&#8221;server&#8221; &gt;ProductID&lt;/th&gt;<br />
&lt;th runat=&#8221;server&#8221; &gt;Cantidad&lt;/th&gt;<br />
&lt;th runat=&#8221;server&#8221; &gt;PVP&lt;/th&gt;<br />
&lt;/tr&gt;<br />
&lt;tr ID=&#8221;itemPlaceholder&#8221; runat=&#8221;server&#8221;&gt;&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/LayoutTemplate&gt;<br />
&lt;ItemTemplate&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;asp:Label ID=&#8221;ProductID&#8221; runat=&#8221;server&#8221; Text=&#8217;&lt;%# Eval(&#8221;ProductID&#8221;) %&gt;&#8217; /&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;asp:Label ID=&#8221;OrderQty&#8221; runat=&#8221;server&#8221; Text=&#8217;&lt;%# Eval(&#8221;OrderQty&#8221;) %&gt;&#8217; /&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;asp:Label ID=&#8221;UnitPrice&#8221; runat=&#8221;server&#8221; Text=&#8217;&lt;%# Eval(&#8221;UnitPrice&#8221;) %&gt;&#8217; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/ItemTemplate&gt;<br />
&lt;/asp:ListView&gt;<br />
&lt;/div&gt;<br />
&lt;/td&gt;<br />
&lt;/tr&gt;</p>
<p>&lt;/ItemTemplate&gt;<br />
&lt;/asp:ListView&gt;</p>
<p>&lt;/ContentTemplate&gt;<br />
&lt;/asp:UpdatePanel&gt;</p></blockquote>
<p>A tener en cuenta:</p>
<ol>
<li>Para cada row del ListView de cabecera, se le asigna como id el número de documento para conseguir ids únicos</li>
<li>También a cada row de cabecera se le asigna una clase css que se usará con JQuery</li>
<li>A la imagen que queremos que cambie cuando se expanda o contraiga cada cabecera también le asignamos como id un literal más el número de documento para conseguir también un id único.</li>
</ol>
<p>De resto no tiene nada especial más que la inclusión del segundo ListView en el ItemTemplate del primero.</p>
<p>Para recuperar las filas de detalle se ha creado un SQLDataSource con un párametro, el cual es rellenado para cada row de la cabecera. Esto lo conseguimos controlando el evento ItemDataBound del ListView de la cabecera. Este evento se dispara para cada fila.</p>
<blockquote><p>Protected Sub ListView1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs) Handles ListView1.ItemDataBound<br />
&#8216; COMPONE SELECT DEL DETALLE PARA CADA ROW DE LA CABECERA<br />
If e.Item.ItemType = ListViewItemType.DataItem Then<br />
Dim _SqlDataSource As SqlDataSource<br />
Dim _SalesOrderID As String = CType(e.Item.FindControl(&#8221;SalesOrderID&#8221;), Label).Text.ToString<br />
_SqlDataSource = CType(e.Item.FindControl(&#8221;SqlDataSource2&#8243;), SqlDataSource)<br />
_SqlDataSource.SelectParameters(&#8221;SalesOrderID&#8221;).DefaultValue = _SalesOrderID<br />
_SqlDataSource.SelectCommand = &#8220;SELECT ProductID, OrderQty, UnitPrice FROM Sales.SalesOrderDetail where SalesOrderID=&#8217;&#8221; &amp; _SalesOrderID &amp; &#8220;&#8216; ORDER BY ProductID&#8221;</p>
<p>End If</p>
<p>End Sub</p></blockquote>
<p>Bien, solo nos queda ver el código JQuery que permitirá expandir y contraer las rows de la cabecera para mostra su detalle correspondiente.</p>
<p>Este es el código JQuery.</p>
<blockquote><p>jQuery(document).ready(function() {<br />
// ASOCIA CLICK CABECERA DE ORDERS<br />
jQuery(&#8221;.RowsHead&#8221;).live(&#8221;click&#8221;, function() {<br />
// CONSTRUYE ID PARA CADA ROW<br />
var currentId = jQuery(this).attr(&#8217;id&#8217;);            // ID DE LA ROW<br />
var currentCSS = jQuery(this).attr(&#8217;class&#8217;);        // ID DE LA CLASE<br />
currentId = &#8220;#Detail&#8221; + jQuery(this).attr(&#8217;id&#8217;);    // ID DE LA IMAGEN<br />
currentimgId = &#8220;#imgplus&#8221; + jQuery(this).attr(&#8217;id&#8217;);<br />
if (jQuery(currentId).is(&#8221;:hidden&#8221;)) {<br />
jQuery(currentId).show();<br />
jQuery(currentimgId).attr(&#8217;src&#8217;, &#8216;img/subs.gif&#8217;);</p>
<p>}<br />
else {<br />
jQuery(currentId).hide();<br />
jQuery(currentimgId).attr(&#8217;src&#8217;, &#8216;img/mas.gif&#8217;);<br />
}</p>
<p>});<br />
});</p></blockquote>
<p>Este código lo único que hace es mostrar u ocultar el listview del detalle y cambiar la imagen. Noten que hemos utilizado la función <a href="http://docs.jquery.com/Events/live#typefn" target="_blank">live</a> de JQuery que nos permite que no solo se asocia el evento cuando se carga el dom, sino para todo lo que se genere a posteriori, esta función está disponible desde la última versión de JQuery.</p>
<p>Les dejo el fuente.<br />
<span class="iconsource"><a href="http://netcodigo.webinfo.es/wp-content/plugins/wp-downloadMonitor/download.php?id=27" title="Downloaded 362 times" >GroupListView</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://netcodigo.webinfo.es/2009/03/23/agrupando-con-listview-jquery-y-aspnet-ajax/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Set de iconos gratuitos</title>
		<link>http://netcodigo.webinfo.es/2009/03/12/set-de-iconos-gratuitos/</link>
		<comments>http://netcodigo.webinfo.es/2009/03/12/set-de-iconos-gratuitos/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 21:45:40 +0000</pubDate>
		<dc:creator>Felipe Santana</dc:creator>
				<category><![CDATA[Gratis]]></category>
		<category><![CDATA[iconos]]></category>

		<guid isPermaLink="false">http://netcodigo.webinfo.es/?p=723</guid>
		<description><![CDATA[Seguimos con recursos gratutitos que nos pueden ayudar en nuestro quehacer diario.
Free web development icons #4 SE

Milky Part 8

Simplicio

Free hand pointer icons

Free web development icons #2

]]></description>
			<content:encoded><![CDATA[<p>Seguimos con recursos gratutitos que nos pueden ayudar en nuestro quehacer diario.</p>
<p>Free web development icons #4 SE<br />
<a href="http://www.icojoy.com/lj/free/34al3/34al_3.zip"><img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/icons_app_7.jpg" alt="" /></a></p>
<p>Milky Part 8<br />
<a href="http://min.frexy.com/article/milky_part_8/"><img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/icons_app_15.jpg" alt="" /></a></p>
<p>Simplicio<br />
<a href="http://neurovit.deviantart.com/art/simplicio-92311415"><img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/icons_app_16.jpg" alt="" /></a></p>
<p>Free hand pointer icons<br />
<a href="http://icojoy.com/lj/free/pointers/pointers.zip"><img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/iconhands.jpg" alt="" /></a></p>
<p>Free web development icons #2<br />
<a href="http://www.icojoy.com/lj/free/webdev2/webdev2.zip"><img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/webdev2.jpg" alt="" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://netcodigo.webinfo.es/2009/03/12/set-de-iconos-gratuitos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MSDN Respuestas</title>
		<link>http://netcodigo.webinfo.es/2009/03/09/msdn-respuestas/</link>
		<comments>http://netcodigo.webinfo.es/2009/03/09/msdn-respuestas/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 21:11:08 +0000</pubDate>
		<dc:creator>Felipe Santana</dc:creator>
				<category><![CDATA[Gratis]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://netcodigo.webinfo.es/?p=718</guid>
		<description><![CDATA[ Microsoft sigue mejorando en su afán de proporcionar fuentes de ayuda a los programadores que han elegido su tecnología para realizar sus desarrollos. En esta ocasión han creado una herramienta que han llamado MSDN Respuestas. Esta es la definición que le dan:
MSDN Respuestas es un complemento para Visual Studio que te permite encontrar la información que necesitas mientras estás desarrollando, desde el propio entorno e integrando múltiples fuentes de información como la referencia de MSDN, los principales buscadores, sitios web de desarrollo y las respuestas más populares a las ...]]></description>
			<content:encoded><![CDATA[<p><img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/msdnrespuestas.gif" alt="" /> Microsoft sigue mejorando en su afán de proporcionar fuentes de ayuda a los programadores que han elegido su tecnología para realizar sus desarrollos. En esta ocasión han creado una herramienta que han llamado MSDN Respuestas. Esta es la definición que le dan:</p>
<blockquote><p>MSDN Respuestas es un complemento para Visual Studio que te permite encontrar la información que necesitas mientras estás desarrollando, desde el propio entorno e integrando múltiples fuentes de información como la referencia de MSDN, los principales buscadores, sitios web de desarrollo y las respuestas más populares a las consultas que realice.</p></blockquote>
<p>La idea fundamental es no tener que salir de la herramienta para buscar información sobre cualquier respuesta que necesitemos.<br />
<img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/msdnrespuestas1.png" alt="" /></p>
<p>Se integra perfectamente con el ide de Visual Studio y permite acceder a distintos sitios preconfigurados además de poder añadir los que queramos. Entre estos sitios se encuentran  la referencia de MSDN, Google, Live, Yahoo, etc.</p>
<p>Bien por Microsoft. Pueden encontrar la herramienta <a href="http://msdn.microsoft.com/es-es/msdnrespuestas.aspx" target="_blank">aquí</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://netcodigo.webinfo.es/2009/03/09/msdn-respuestas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agrupando con GridView y ASP.Net Ajax</title>
		<link>http://netcodigo.webinfo.es/2009/03/02/agrupando-con-gridview-y-aspnet-ajax/</link>
		<comments>http://netcodigo.webinfo.es/2009/03/02/agrupando-con-gridview-y-aspnet-ajax/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 18:15:39 +0000</pubDate>
		<dc:creator>Felipe Santana</dc:creator>
				<category><![CDATA[ASP.Net Ajax]]></category>
		<category><![CDATA[GridView]]></category>

		<guid isPermaLink="false">http://netcodigo.webinfo.es/?p=699</guid>
		<description><![CDATA[Veremos hoy cómo agrupar datos dentro de un GridView utilizando ASP.Net Ajax. La idea es utilizar dos tablas maestro-detalle, utilizaremos la base de datos de ejemplo de SQL 2005 AdventureWorks. En esta base de datos tenemos entre otras dos tablas de facturas, la cabecera, SalesOrderHeader, y la de detalle, SalesOrderDetail. En la primera tenemos los datos de la cabecera de facturas, y en la segunda, los artículos que corresponden a cada una de las mismas.
Pues bien, el planteamiento es mostrar un grid con información de la cabecera y al pinchar ...]]></description>
			<content:encoded><![CDATA[<p>Veremos hoy cómo agrupar datos dentro de un GridView utilizando ASP.Net Ajax. La idea es utilizar dos tablas maestro-detalle, utilizaremos la base de datos de ejemplo de SQL 2005 <a href="http://www.codeplex.com/MSFTDBProdSamples/Release/ProjectReleases.aspx?ReleaseId=4004" target="_blank">AdventureWorks</a>. En esta base de datos tenemos entre otras dos tablas de facturas, la cabecera, SalesOrderHeader, y la de detalle, SalesOrderDetail. En la primera tenemos los datos de la cabecera de facturas, y en la segunda, los artículos que corresponden a cada una de las mismas.</p>
<p>Pues bien, el planteamiento es mostrar un grid con información de la cabecera y al pinchar en cada uno de sus registros, mostrar, dentro del mismo grid el detalle de la factura seleccionada.<br />
Este sería el resultado:<br />
<img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/groupgridviewajax.gif" alt="" /><br />
<img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/groupgridviewajax1.gif" alt="" /> </p>
<p>Lo veremos por partes. Primero el Grid principal, es un gridview normal salvo que utilizaremos un ItemTemplate encerrado en un panel. Tal como:</p>
<pre name="code" class="vb.net">
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:AdventureWorksConnectionString %>"
SelectCommand="SELECT  OrderDate, SalesOrderID, CustomerID, SubTotal FROM Sales.SalesOrderHeader"></asp:SqlDataSource>
<asp:UpdatePanel ID="UpGridView1" runat="server">
<ContentTemplate>
<asp:GridView ID="GridView1" runat="server" CssClass="grid" AlternatingRowStyle-CssClass="altrow"
DataKeyNames="SalesOrderID" ShowHeader="false"
AllowPaging="True" AutoGenerateColumns="False" PageSize="5"
DataSourceID="SqlDataSource1" Caption="Ventas"  Width="50%">
<PagerStyle CssClass="pagerstyle" />
<Columns>
<asp:TemplateField ItemStyle-HorizontalAlign="Left">
<ItemTemplate>
<asp:Panel ID="POrderHeader" runat="server">
<asp:Image ImageUrl="~/images/expand.jpg" runat="server" id="imgplus"/>
<asp:label id="OrderData" runat="server" text=""></asp:label>
<asp:label id="SalesOrderID" runat="server" text='<%#Eval("SalesOrderID")%>' Visible="false"></asp:label>
<asp:label id="OrderDate" runat="server" text='<%#Eval("OrderDate")%>' Visible="false"></asp:label>
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<AlternatingRowStyle CssClass="altrowstyle"></AlternatingRowStyle>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</pre>
<p>Si se fijan, lo único especial es que en vez de utilizar el típico asp:BoundField para mostrar las columnas en el grid utilizamos un itemtemplate, lo importante es encerrarlo dentro de un panel porque, para el segundo gridview utilizaremos un <a href="http://www.asp.net/AJAX/AjaxControlToolkit/Samples/CollapsiblePanel/CollapsiblePanel.aspx" target="_blank">CollapsiblePanelExtender</a> de Ajax.<br />
Insertaremos ahora el segundo GridView, para ello lo colocaremos también dentro de un panel y dentro del ItemTemplate del primer GridView, este es el código del segundo GridView.</p>
<pre name="code" class="vb.net">
<asp:Panel Style="margin-left: 20px; margin-right: 20px" ID="OrdersDetailPanel" runat="server">
<asp:GridView AutoGenerateColumns="false" CssClass="grid" ID="GridOrdersDetail" DataSourceID="SqlDataSource2" runat="server" ShowHeader="true" EnableViewState="false">
<Columns>
<asp:BoundField HeaderText="Cantidad" DataField="OrderQty" DataFormatString="{0:n}" ItemStyle-Width="50px" />
<asp:BoundField HeaderText="Precio" DataField="UnitPrice" DataFormatString="{0:n}" ItemStyle-Width="50px" />
<asp:BoundField HeaderText="Total" DataField="LineTotal"  DataFormatString="{0:n}" ItemStyle-Width="50px" />
</Columns>
</asp:GridView>
</asp:Panel>
</pre>
<p>Si se fijan es otro GridView normal y corriente, lo único especial es que el DataSource asociado está en blanco ya que lo construiremos en codebehind.<br />
A continuación incrustramos el CollapsiblePanelExtender. Este apuntará al panel del GridView principal para que actúe como cabecera del segundo grid, utilizándolo para que al hacer click sobre él muestre los datos del segundo GridView.</p>
<p>A continuación muestro todo el código de los gridviews y el collapsiblepanelextender juntos:</p>
<pre name="code" class="vb.net">
        <asp:UpdatePanel ID="UpGridView1" runat="server">
        <ContentTemplate>
            <asp:GridView ID="GridView1" runat="server" CssClass="grid" AlternatingRowStyle-CssClass="altrow" DataKeyNames="SalesOrderID" ShowHeader="false" AllowPaging="True" AutoGenerateColumns="False" PageSize="5" DataSourceID="SqlDataSource1" Caption="Ventas"  Width="50%">
                <PagerStyle CssClass="pagerstyle" />
                <Columns>
                <asp:TemplateField ItemStyle-HorizontalAlign="Left">
                <ItemTemplate>
                    <asp:Panel ID="POrderHeader" runat="server">
                        <asp:Image ImageUrl="~/images/expand.jpg" runat="server" id="imgplus"/>
                        <asp:label id="OrderData" runat="server" text=""></asp:label>
                        <asp:label id="SalesOrderID" runat="server" text='<%#Eval("SalesOrderID")%>' Visible="false"></asp:label>
                        <asp:label id="OrderDate" runat="server" text='<%#Eval("OrderDate")%>' Visible="false"></asp:label>
                    </asp:Panel>
                     <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:AdventureWorksConnectionString %>" SelectCommand=""></asp:SqlDataSource>
                        <asp:Panel Style="margin-left: 20px; margin-right: 20px" ID="OrdersDetailPanel" runat="server">
                            <asp:GridView AutoGenerateColumns="false" CssClass="grid" ID="GridOrdersDetail" DataSourceID="SqlDataSource2"
                                runat="server" ShowHeader="true" EnableViewState="false">
                                <Columns>
                                    <asp:BoundField HeaderText="Cantidad" DataField="OrderQty" DataFormatString="{0:n}" ItemStyle-Width="50px" />
                                    <asp:BoundField HeaderText="Precio" DataField="UnitPrice" DataFormatString="{0:n}" ItemStyle-Width="50px" />
                                    <asp:BoundField HeaderText="Total" DataField="LineTotal"  DataFormatString="{0:n}" ItemStyle-Width="50px" />
                                </Columns>
                            </asp:GridView>
                        </asp:Panel>

                        <cc1:CollapsiblePanelExtender ID="cpe" runat="Server" TargetControlID="OrdersDetailPanel"
                            CollapsedSize="0" Collapsed="True" ExpandControlID="POrderHeader" CollapseControlID="POrderHeader"
                            AutoCollapse="False" AutoExpand="False" ScrollContents="false" ImageControlID="imgplus"
                            ExpandedImage="~/images/collapse.jpg" CollapsedImage="~/images/expand.jpg"
                            ExpandDirection="Vertical" />
                </ItemTemplate>
                </asp:TemplateField>
                </Columns>
                <AlternatingRowStyle CssClass="altrowstyle"></AlternatingRowStyle>
            </asp:GridView>
        </ContentTemplate>
        </asp:UpdatePanel>
</pre>
<p>Bien, lo único que nos queda es fabricar la select del segundo GridView.<br />
Para ello utilizaremos el evento <a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.gridview.rowdatabound(VS.80).aspx">RowDataBound</a>, este evento se dispara para cada row del gridview principal.<br />
Tal que:</p>
<pre name="code" class="vb.net">
    Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
        If e.Row.RowType = DataControlRowType.DataRow Then
            Dim _SqlDataSource As SqlDataSource = e.Row.FindControl("SqlDataSource2")
            Dim _SalesOrderID As String = CType(e.Row.FindControl("SalesOrderID"), Label).Text.ToString
            Dim _OrderData As Label = CType(e.Row.FindControl("OrderData"), Label)
            Dim _OrderDate As String = CType(e.Row.FindControl("OrderDate"), Label).Text.ToString

            _OrderData.Text = "Orden: " &#038; _SalesOrderID &#038; " de fecha " &#038; Format(CDate(_OrderDate), "dd/MM/yyyy")
            If Not _SalesOrderID Is Nothing Then
                _SqlDataSource.SelectCommand = "SELECT SalesOrderID, OrderQty, UnitPrice,  LineTotal FROM Sales.SalesOrderDetail WHERE (SalesOrderID = " &#038; _SalesOrderID &#038; ")"
            End If
        End If
    End Sub
</pre>
<p>Este código lo que hace es mostrar en el primer gridview los datos que queremos que se muestren y, a continuación, construye la select del segundo GridView para cada row del primero.</p>
<p>Esto es todo. Les dejo el fuente.<br />
<span class="iconsource"><a href="http://netcodigo.webinfo.es/wp-content/plugins/wp-downloadMonitor/download.php?id=26" title="Version 1 downloaded 1102 times" >GroupGridViewAjax</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://netcodigo.webinfo.es/2009/03/02/agrupando-con-gridview-y-aspnet-ajax/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Set de iconos gratutios</title>
		<link>http://netcodigo.webinfo.es/2009/02/19/set-de-iconos-gratutios/</link>
		<comments>http://netcodigo.webinfo.es/2009/02/19/set-de-iconos-gratutios/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 22:02:47 +0000</pubDate>
		<dc:creator>Felipe Santana</dc:creator>
				<category><![CDATA[Gratis]]></category>
		<category><![CDATA[iconos]]></category>

		<guid isPermaLink="false">http://netcodigo.webinfo.es/?p=696</guid>
		<description><![CDATA[Continuando con la línea de publicar recursos gratuitos que te pueden ayudar en tu labor diaria, hoy le toca el turno a iconos. Les dejo con unos cuantos sets que por supuesto son gratuitos.
Jonas Rask Design icons for developers

Diagona Icons

FAMFAMFAM Silk

Coquette icons

Que los disfruten
]]></description>
			<content:encoded><![CDATA[<p>Continuando con la línea de publicar recursos gratuitos que te pueden ayudar en tu labor diaria, hoy le toca el turno a iconos. Les dejo con unos cuantos sets que por supuesto son gratuitos.</p>
<p>Jonas Rask Design icons for developers<br />
<a href="http://jonas.seph.ws/stuff/drf.zip"><img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/icons_app_9.jpg" alt="" /></a></p>
<p>Diagona Icons<br />
<a href="http://www.pinvoke.com/icon/download/diagona.zip"><img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/icons_app_2.jpg" alt="" /></a></p>
<p>FAMFAMFAM Silk<br />
<a href="http://www.famfamfam.com/lab/icons/silk/famfamfam_silk_icons_v013.zip"><img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/icons_app_4.jpg" alt="" /></a></p>
<p>Coquette icons<br />
<a href="http://dryicons.com/free-icons/preview/coquette-icons-set/#coquette-icons-set_icons_preview"><img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/icons_app_6.jpg" alt="" /></a></p>
<p>Que los disfruten</p>
]]></content:encoded>
			<wfw:commentRss>http://netcodigo.webinfo.es/2009/02/19/set-de-iconos-gratutios/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Autenticar usuarios con Ajax y JQuery y BD</title>
		<link>http://netcodigo.webinfo.es/2009/02/14/autenticar-usuarios-con-ajax-y-jquery-y-bd/</link>
		<comments>http://netcodigo.webinfo.es/2009/02/14/autenticar-usuarios-con-ajax-y-jquery-y-bd/#comments</comments>
		<pubDate>Sat, 14 Feb 2009 12:27:52 +0000</pubDate>
		<dc:creator>Felipe Santana</dc:creator>
				<category><![CDATA[ASP.Net Ajax]]></category>
		<category><![CDATA[VB.Net]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://netcodigo.webinfo.es/?p=678</guid>
		<description><![CDATA[Veremos en este post cómo autenticar usuarios usando una base de datos, en este caso SQL Server (o Express), JQuery y Ajax.
En cuanto al Ajax comentar que como voy a usar JQuery usaré el Ajax que viene intengrado con este framework y así no cargar el ASP.Net Ajax con el fin de no recargar la página.
El ejemplo versará en cómo llamar a las funciones JQuery y desde estas invocar al WebMethod necesario desde código del lado del cliente. Esto es la más interesante en mi opinión, cómo hacer que desde ...]]></description>
			<content:encoded><![CDATA[<p>Veremos en este post cómo autenticar usuarios usando una base de datos, en este caso SQL Server (o Express), JQuery y Ajax.</p>
<p>En cuanto al Ajax comentar que como voy a usar JQuery usaré el Ajax que viene intengrado con este framework y así no cargar el ASP.Net Ajax con el fin de no recargar la página.</p>
<p>El ejemplo versará en cómo llamar a las funciones JQuery y desde estas invocar al WebMethod necesario desde código del lado del cliente. Esto es la más interesante en mi opinión, cómo hacer que desde el lado del cliente se pueda llamar a servicios webs. Microsoft tiene un artículo sobre este tema que pueden leer <a href="http://msdn.microsoft.com/es-es/library/bb398998.aspx" target="_blank">aquí</a>. Empezamos.</p>
<p>Primero, creamos un fichero de configurarción global, el típico Global.asax. En el procedimiento Session_Start inicializaremos nuestras variables de sesión. En este ejemplo solo tenemo una. El nombre de usuario</p>
<pre name="code" class="vb.net">    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
        HttpContext.Current.Session("NomUsu") = ""
    End Sub</pre>
<p>Segundo, en nuestro web.config definiremos la conección con nuestra base de datos.</p>
<pre name="code" class="vb.net">
	<connectionStrings>
		<add name="LoginDBJQuery" connectionString="Data Source=instanciabd;Initial Catalog=nombrebd;Integrated Security=True;" providerName="System.Data.SqlClient"/>
	</connectionStrings>
</pre>
<p>Esto es todo en cuanto a la configuración del sitio. Ahora veremos el html.<br />
En el head, incluiremos las referencias al core de JQuery y a nuestro javascript que controlará el login, lo he llamado login.js en un subdirectorio llamado js. En cuanto al CSS, también sencillo, una clase para ocultar el típico &#8220;Cargando &#8230;&#8221; y otra para esto mismo con una imagen que muestre que estamos conectando con nuestra base de datos para el login.</p>
<pre name="code" class="html">
    <script src="js/jquery-1.3.1.min.js" type="text/javascript"></script>
    <script src="js/Login.js" type="text/javascript"></script>
<style type="text/css" media="screen">
    .oculto {display:none}
    /* CLASE PARA CARGANDO */
    .loading {font-size:100%; height: 17px;background:transparent url(../img/ajax-loader.gif) no-repeat scroll 0% 0%;padding-left:19px;}
    </style>
</pre>
<p>El body, muy fácil, un formulario para solicitar usuario y contraseña y un botón para enviar los datos, además una label para mostrar el nombre del usuario que hace login y el div para mostrar el mensaje de conección mientras se hace la llamada.</p>
<pre name="code" class="vb.net">
<form id="form1">

        <fieldset><legend>Inicio de sesión</legend>

        <label for="codusu">Nombre</label>
<input id="codusu" title="Introducir nombre de usuario" name="codusu" size="30" type="text" />

        <label for="password">Contraseña</label>
<input id="password" title="Introducir contraseña" name="password" size="30" type="password" />

        </fieldset>

        <button id="EnviarBtn">Login</button>
<div id="Sending" class="loading oculto">
            <span>Enviando solicitud ....</span></div>

<label id="NomUsu"></label>
</form>
</pre>
<p>Si se fijan, en todo este código no hay ningún control de servidor, todos son puro tags html.</p>
<p>Bien ahora queda la parte de jquery. Lo explicaré por partes.</p>
<pre name="code" class="javascript">$(document).ready(function() {
    // ASOCIAMOS FUNCION DE LOGIN AL EVENTO CLICK DEL BOTON
    $("#EnviarBtn").bind("click", function(e) {
        e.preventDefault();
        if (jQuery.trim($("#codusu").val()) == '' || jQuery.trim($("#password").val()) == '')
        {
            alert("Debe rellenar usuario y contraseña");
        }
        else
        {
            ConfigFormLogin();
        }
    });

});</pre>
<p>Cuando se carga todo el DOM de la página asociamos al botón de login el código mostrado. Primero desactivamos el comportamiento por defecto del botón, que es hacer submit, esto lo logramos con el método e.preventDefault. A continuación comprobamos si se ha tecleado código de usuario y contraseña, si no es así mostramos alerta y en caso contrario llamamos a la función que se va a encargar de comprobar los datos, ConfigFormLogin.</p>
<p>La función de llamada al WebMethod, como dije al principio del post, usaremos las funciones <a href="http://docs.jquery.com/Ajax">Ajax</a> que incluye JQuery. Incluye una serie de eventos para controlar cómo se producen estas llamadas, una lista completa con todos los eventos que incluye podemos encontrarlos <a href="http://docs.jquery.com/Ajax_Events">aquí</a>. Estos eventos nos dan un control total para manipular el código.</p>
<p>Veamos primero, solo la llamada al WebMethod</p>
<pre name="code" class="javascript">function ConfigFormLogin() {
    // ENVIA SOLICITUD
    $.ajax({
        type: "POST",
        data: "{ _CodUsu: '" + $("#codusu").val() + "', _Passwd: '" + $("#password").val() + "'}",
        url: "Default.aspx/DoLogin",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        cache: false,
        beforeSend: function() { OnStart() },
        complete: function() { OnEnd() },
        success: function(msg) { OnOK(msg) },
        error: function(msg) { OnErr(); }
    });
}</pre>
<ol>
<li>type: El tipo de llamada lógicamente debe ser post.</li>
<li>data: aquí pasaremos los parámetros que necesita el servicio web para el login. La sintaxis es {nomvar:valor,nomvar:valor &#8230;)</li>
<li>url: aquí indicaremos la url del servicio web. En nuestro caso está en la misma página que hace el login. Default.aspx. En el codebehind de esta tenermos un webmethod llamado DoLogin</li>
<li>dataType: serializaremos los datos con json.</li>
<li>cache: lo pondremos a false porque no queremos usar cache</li>
<li>El resto son los eventos que queremos manipular con la llamada, creo que se explican por sí solos.</li>
</ol>
<p>Estas son las funciones que disparan los eventos mencionados. En comentarios su explicación</p>
<pre name="code" class="javascript">
// AL COMENZAR SOLICITUD
function OnStart(){
    // DESHABILITA BOTON
    $("#EnviarBtn").attr("disabled", "disabled");
    // MUESTRA IMAGEN DE CONECTANDO
    $("#Sending").removeClass("oculto");
// LIMPIA NOMBRE DE USUARIO
    $("#NomUsu").text("");

}

// AL FINALIZAR SOLICITUD
function OnEnd(){
    // OCULTA SENDING
    $("#Sending").addClass("oculto");
    $("#logindialog img").css("display", "inline");
    // HABILITA BOTON
    $("#EnviarBtn").removeAttr("disabled");
}

// ERROR EN EL METODO DE LOGIN
function OnErr() {
    // MUESTRA MENSAJE DE ERROR EN LA CONECCION CON EL SERVICIO WEB
    alert("No se ha podido contactar con Servidor de Autenticación");
}

// OK METODO DE LOGIN
function OnOK(msg) {
    if (msg == "false") {
        // SI EL SERVICIO WEB DEVUELVE false ES QUE LA AUTENTICACIÓN HA SIDO INVALIDA
        alert("Nombre de Usuario o contraseña invalido");
    }
    else {
        // EN CASO CONTRARIO EL SERVICIO WEB DEVUELVE EL NOMBRE DE USUARIO Y LO MUESTRA EN EL LABEL
        $("#NomUsu").text(msg);
    }
}
</pre>
<p>Por último nos queda solo ver el servicio web. Como ya dijimos está en el codebehind de la misma página aspx que realiza el login. Lo importante es que el servicio web hay que declararlo como una función estática y pública. El resto es una llamada normal a una base de datos.</p>
<pre name="code" class="vb.net">
Imports System.Web.Services
Imports System.Data.SqlClient

Partial Class _Default
    Inherits System.Web.UI.Page
    <WebMethod()> _
    Public Shared Function DoLogin(ByVal _CodUsu As String, ByVal _Passwd As String) As String
        ' REALIZA LOGIN

        ' INICIAMOS VARIABLES DE SESION
        HttpContext.Current.Session("NomUsu") = ""
        ' CONSTRUYE SELECT Y CONECCION
        Dim _SQLConnection As New SqlConnection(Web.Configuration.WebConfigurationManager.ConnectionStrings("LoginDBJQuery").ToString)
        Dim _SQLCommand As New SqlCommand("SELECT password, nombre FROM empleados WHERE dni = '" &#038; _CodUsu &#038; "'", _SQLConnection)

        Dim _SQLDataReader As SqlDataReader
        Try
            _SQLConnection.Open()
            _SQLDataReader = _SQLCommand.ExecuteReader
            If _SQLDataReader.HasRows = False Then
                ' LOGIN ERRONEO
                Return "false"
            End If
           ' COMPRUEBA PASSWORD
            _SQLDataReader.Read()
            If _SQLDataReader.GetString(0).Trim <> _Passwd Then
                ' LOGIN ERRONEO
                Return "false"
            End If
            ' GUARDA VARIABLE DE SESION
            HttpContext.Current.Session("NomUsu") = _SQLDataReader.GetString(1)
        Catch ex As Exception
            ' SI HA HABIDO ERROR DEVUELVE ERROR
            Throw New Exception(ex.ToString)
        Finally
            _SQLCommand.Dispose()
            _SQLConnection.Close()
        End Try

        ' SI LA AUTENTICACION HA SIDO CORRECTA DEVUELVE NOMBRE DE USUARIO
        Return HttpContext.Current.Session("NomUsu")

    End Function

End Class
</pre>
<p>Y esto es todo. Les dejo el fuente.<br />
<span class="iconsource"><a href="http://netcodigo.webinfo.es/wp-content/plugins/wp-downloadMonitor/download.php?id=25" title="Version 1 downloaded 527 times" >LoginDBJQuery</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://netcodigo.webinfo.es/2009/02/14/autenticar-usuarios-con-ajax-y-jquery-y-bd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Libro gratis virtualización</title>
		<link>http://netcodigo.webinfo.es/2009/02/13/libro-gratis-virtualizacion/</link>
		<comments>http://netcodigo.webinfo.es/2009/02/13/libro-gratis-virtualizacion/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 17:20:42 +0000</pubDate>
		<dc:creator>Felipe Santana</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[libros gratis]]></category>

		<guid isPermaLink="false">http://netcodigo.webinfo.es/?p=672</guid>
		<description><![CDATA[ Si estás interesado en virtualización, que sepas que Microsoft Press ha publicado un EBook gratuito titulado &#8220;Understanding Microsoft Virtualization Solutions&#8221;.
Cuenta con 452 páginas en formato pdf. Como su nombre indica versa sobre las distintas tecnologías de Microsoft para virtualizar los siguientes entornos:

Virtualización de servidores.
Virtualización de aplicaciones.
Virtualización del desktop.
Virtualización de presentación.
Virtualización de profiles de usuario.

Sin duda merece la pena su descarga.
Lo encontraréis aquí.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://netcodigo.webinfo.es/wp-content/uploads/imgposts/bookvirtualize.jpg" alt="" /> Si estás interesado en virtualización, que sepas que Microsoft Press ha publicado un EBook gratuito titulado &#8220;Understanding Microsoft Virtualization Solutions&#8221;.</p>
<p>Cuenta con 452 páginas en formato pdf. Como su nombre indica versa sobre las distintas tecnologías de Microsoft para virtualizar los siguientes entornos:</p>
<ul>
<li>Virtualización de servidores.</li>
<li>Virtualización de aplicaciones.</li>
<li>Virtualización del desktop.</li>
<li>Virtualización de presentación.</li>
<li>Virtualización de profiles de usuario.</li>
</ul>
<p>Sin duda merece la pena su descarga.</p>
<p>Lo encontraréis <a href="http://csna01.libredigital.com/?urmvs17u33">aquí</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://netcodigo.webinfo.es/2009/02/13/libro-gratis-virtualizacion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generadores de datos para pruebas</title>
		<link>http://netcodigo.webinfo.es/2009/02/10/generadores-de-datos-para-pruebas/</link>
		<comments>http://netcodigo.webinfo.es/2009/02/10/generadores-de-datos-para-pruebas/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 23:38:57 +0000</pubDate>
		<dc:creator>Felipe Santana</dc:creator>
				<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[sql server]]></category>

		<guid isPermaLink="false">http://netcodigo.webinfo.es/?p=668</guid>
		<description><![CDATA[¿Cuantas veces has tecleado datos en tablas para hacer pruebas?
Probablemente muchas. Además mal (sin ofender). Para hacer pruebas que realmente midan la capacidad de, por ejemplo, rendimiento, hace falta trabajar con miles o decenas de miles de registros. Y claro, esto no lo habrás tecleado nunca. Como máximo, te habrás creado el típico bucle para hacer inserciones masivas.
Pues resulta que me he encontrado en una situación en la que tenía que rellenar unos cuantos cientos de miles de registros en una base de datos y me negaba a realizarlo a ...]]></description>
			<content:encoded><![CDATA[<p>¿Cuantas veces has tecleado datos en tablas para hacer pruebas?<br />
Probablemente muchas. Además <span style="text-decoration: line-through; font-style: italic;">mal</span> (sin ofender). Para hacer pruebas que realmente midan la capacidad de, por ejemplo, rendimiento, hace falta trabajar con miles o decenas de miles de registros. Y claro, esto no lo habrás tecleado nunca. Como máximo, te habrás creado el típico bucle para hacer inserciones masivas.</p>
<p>Pues resulta que me he encontrado en una situación en la que tenía que rellenar unos cuantos cientos de miles de registros en una base de datos y me negaba a realizarlo a pelo. Pues nada, como siempre san google y al rescate. Me he encontrado bastantes herramientas que liberan de tan ardua tarea. Les muestro unas cuantas.</p>
<ul>
<li><a href="http://sourceforge.net/projects/datagenerator/">Datagenerator</a>. (ADOdb, Firebird/InterBase, Microsoft SQL Server, MySQL, Oracle, PostgreSQL (pgsql), SQLite) (open source)</li>
<li><a href="http://www.sqledit.com/dg/index.html">DTM Data Generator</a>.  (ODBC, OLE DB, OCI, SQL Server,  Oracle or PostgreSQL) (de pago)</li>
<li><a href="http://sqlmanager.net/products/mssql/datagenerator">EMS Data Generator for SQL Server</a> (de pago)</li>
<li><a href="http://www.generatedata.com/#about">generatedata</a>.  (MySql, Oracle, HTML, Excel, XML y CSV) (gratis)</li>
<li><a href="http://rubyforge.org/projects/datagen">CSV Data Generator</a>. (CSV) (open source)</li>
<li><a href="http://sourceforge.net/projects/dbmonster/">DBMonster</a>. (SQL) (open source)</li>
</ul>
<p>Estos son algunas de las que encontré y que creo cubren todas mis necesidades.</p>
]]></content:encoded>
			<wfw:commentRss>http://netcodigo.webinfo.es/2009/02/10/generadores-de-datos-para-pruebas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
