<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>ponte : nivel:100</title><link>http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx</link><description>Tags: nivel:100</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>el problema CREATE DATABASE permission denied in database 'master'</title><link>http://msmvps.com/blogs/gflores/archive/2013/01/04/el-problema-create-database-permission-denied-in-database-master.aspx</link><pubDate>Fri, 04 Jan 2013 23:44:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1822125</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=1822125</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2013/01/04/el-problema-create-database-permission-denied-in-database-master.aspx#comments</comments><description>&lt;p&gt;Me encontraba haciendo ejercicios de programaci&amp;oacute;n usando database migrations cuando al hacer un update-database me ocurre el error:&lt;/p&gt;
&lt;p&gt;
CREATE DATABASE permission denied in database &amp;#39;master&amp;#39;&lt;/p&gt;
&lt;p&gt;Algo raro pues uso Visual Studio con mi cuenta con derechos de Administrador, adem&amp;aacute;s de ejecutarlo con el &amp;quot;Run as Administrator&amp;quot; e investigando un poco di con problemas al querer &lt;a href="http://stackoverflow.com/questions/10780650/creating-database-using-efcodefirst-on-a-web-server-host/10802616#10802616"&gt;migrar de ambiente de desarrollo a producci&amp;oacute;n&lt;/a&gt; la aplicaci&amp;oacute;n, cosa que no es mi caso. Al final di con el problema, y no ca&amp;iacute; en cuenta de que en este equipo mi cuenta fue creada despu&amp;eacute;s de tener instalado SQL Server Express, por lo que mi cuenta de usuario no figuraba con derechos de administraci&amp;oacute;n sobre la instancia de SQL Server actual. Es algo m&amp;aacute;s o menos sencillo de hacer pero siguiendo la filosof&amp;iacute;a de &amp;quot;si alguien m&amp;aacute;s ya batall&amp;oacute; con esto&amp;quot; encontr&amp;eacute; un &lt;a href="http://archive.msdn.microsoft.com/addselftosqlsysadmin"&gt;script para agregar al usuario de sistema actual con derechos de sysadmin de la instancia de SQL Server&lt;/a&gt;. Este fue publicada en los anales de MSDN por lo que su uso me pareci&amp;oacute; lo suficientemente seguro, adem&amp;aacute;s de que me resolvi&amp;oacute; el problema.&lt;/p&gt;
&lt;p&gt;Recursos:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://archive.msdn.microsoft.com/addselftosqlsysadmin"&gt;Script to add the current user to the SQL Server &amp;#39;sysadmin&amp;#39; role&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1822125" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/.net/default.aspx">.net</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/asp.net/default.aspx">asp.net</category></item><item><title>Regreso a las bases: Memoria (Parte 2)</title><link>http://msmvps.com/blogs/gflores/archive/2009/12/15/regreso-a-las-bases-memoria-parte-2.aspx</link><pubDate>Wed, 16 Dec 2009 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1745878</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=1745878</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2009/12/15/regreso-a-las-bases-memoria-parte-2.aspx#comments</comments><description>&lt;p&gt;Lo que sigue es una traducci&amp;oacute;n de una secci&amp;oacute;n del ebook gratuito &lt;a href="http://codebetter.com/blogs/karlseguin/archive/2008/06/24/foundations-of-programming-ebook.aspx"&gt;&lt;span style="color:#006bad;"&gt;Foundations of Programming&lt;/span&gt;&lt;/a&gt; de &lt;a href="http://codebetter.com/blogs/karlseguin/"&gt;&lt;span style="color:#006bad;"&gt;Karl Seguin&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 style="margin:10pt 0in 0pt;"&gt;&lt;a name="_Toc205295082"&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;&lt;span style="font-family:Cambria;color:#4f81bd;font-size:small;"&gt;Apuntadores&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;"&gt;Para muchos desarrolladores, aprender sobre apuntadores en la escuela fue una experiencia dolorosa. Representan la verdaderamente real indirecci&amp;oacute;n que existe entre c&amp;oacute;digo y hardware. Muchos m&amp;aacute;s desarrolladores nunca tuvieron la experiencia de aprender sobre ellos&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;- saltaron directamente a programar en un lenguaje que no los expone directamente. La verdad sin embargo es que cualquiera que diga que C# o Java son lenguajes sin apuntadores es simplemente un error. Como los apuntadores son el mecanismo con el cual todos los lenguajes almacenan valores en el &lt;i style="mso-bidi-font-style:normal;"&gt;heap&lt;/i&gt;, es m&amp;aacute;s bien tonto no entender como son usados.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;&lt;span style="font-family:Calibri;font-size:small;"&gt;Los apuntadores representan el nexus del modelo de memoria de un sistema &amp;ndash; esto es, los apuntadores son el mecanismo donde el &lt;i style="mso-bidi-font-style:normal;"&gt;stack&lt;/i&gt; y el &lt;i style="mso-bidi-font-style:normal;"&gt;heap&lt;/i&gt; trabajan juntos para proveer el subsistema de memoria requerido por su programa. Como discutimos anteriormente, cuando instancia un objeto &lt;/span&gt;&lt;/span&gt;&lt;span class="InlineCodeChar"&gt;&lt;span lang="ES" style="line-height:115%;font-size:10pt;mso-ansi-language:ES;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-bidi-theme-font:minor-bidi;mso-bidi-font-size:11.0pt;"&gt;&lt;span style="font-family:Courier New;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;&lt;span style="font-family:Calibri;font-size:small;"&gt;, .NET asigna un bloque de memoria al &lt;i style="mso-bidi-font-style:normal;"&gt;heap&lt;/i&gt; y regresa un apuntador al inicio de este bloque de memoria. Esto es todo lo que un apuntador es: &lt;b style="mso-bidi-font-weight:normal;"&gt;la direcci&amp;oacute;n de inicio para el bloque de memoria que contiene un objeto&lt;/b&gt;. La direcci&amp;oacute;n no es nada m&amp;aacute;s que un n&amp;uacute;mero &amp;uacute;nico, generalmente representado en formato hexadecimal. Por lo tanto, un apuntador no es nada m&amp;aacute;s que un n&amp;uacute;mero &amp;uacute;nico que le dice a .NET donde est&amp;aacute; el objeto mismo en memoria. Esta indirecci&amp;oacute;n es transparente en Java o .NET, pero no en C o C++ donde se puede manipular la direcci&amp;oacute;n de memoria directamente con un apuntador aritm&amp;eacute;tico. En C o C++ se puede tomar un apuntador y agregar 1 a &amp;eacute;l, y as&amp;iacute; arbitrariamente cambiar a donde est&amp;aacute; apuntando (y seguramente hacer tronar el programa debido a esto).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;&lt;span style="font-family:Calibri;font-size:small;"&gt;Donde se pone interesante es donde el apuntador est&amp;aacute; realmente almacenado. Ellos en realidad siguen las mismas reglas descritas arriba: como enteros son almacenados en el &lt;i style="mso-bidi-font-style:normal;"&gt;stack&lt;/i&gt; &amp;ndash; al menos, claro, que ellos formen parte de una referencia a un objeto y entonces estar&amp;aacute;n en el &lt;i style="mso-bidi-font-style:normal;"&gt;heap&lt;/i&gt; con el resto del objeto. Puede no ser claro a&amp;uacute;n, pero esto significa que ultimadamente, todos los objetos &lt;i style="mso-bidi-font-style:normal;"&gt;heap&lt;/i&gt; est&amp;aacute;n enraizados al &lt;i style="mso-bidi-font-style:normal;"&gt;stack&lt;/i&gt; (posiblemente a trav&amp;eacute;s de numerosos niveles de referencias). Veamos primero este ejemplo simple:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style="border-bottom:#1f497d 2.25pt solid;border-left:medium none;padding-bottom:10pt;padding-left:0in;padding-right:0in;background:#f2f2f2;border-top:#1f497d 2.25pt solid;border-right:medium none;padding-top:10pt;mso-background-themecolor:background1;mso-background-themeshade:242;mso-border-top-themecolor:text2;mso-border-bottom-themecolor:text2;mso-element:para-border-div;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span class="CodeKeyword"&gt;&lt;span lang="ES-MX"&gt;&lt;span style="color:#003399;"&gt;static&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES-MX"&gt; &lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;void&lt;/span&gt;&lt;/span&gt; Main(&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;string&lt;/span&gt;&lt;/span&gt;[] args)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span lang="ES-MX"&gt;&lt;span style="font-family:Courier New;font-size:x-small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span lang="ES-MX"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;int&lt;/span&gt;&lt;/span&gt; x = 5;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span lang="ES-MX"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;string&lt;/span&gt;&lt;/span&gt; y = &amp;quot;&lt;span class="CodeString"&gt;&lt;span style="color:#984806;"&gt;codebetter.com&lt;/span&gt;&lt;/span&gt;&amp;quot;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast"&gt;&lt;span lang="ES-MX"&gt;&lt;span style="font-family:Courier New;font-size:x-small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;&lt;span style="font-family:Calibri;font-size:small;"&gt;Del c&amp;oacute;digo de arriba, terminaremos con 2 valores en el &lt;i style="mso-bidi-font-style:normal;"&gt;stack&lt;/i&gt;, el entero 5 y el apuntador a nuestra cadena, as&amp;iacute; como tambi&amp;eacute;n precisamente el valor en el &lt;i style="mso-bidi-font-style:normal;"&gt;heap&lt;/i&gt;. Aqu&amp;iacute; una representaci&amp;oacute;n gr&amp;aacute;fica:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="center"&gt;&lt;span style="mso-ansi-language:EN-US;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/7838.stackheap.png"&gt;&lt;img src="http://msmvps.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/7838.stackheap.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;Cuando salimos de nuestra function main (olvid&amp;eacute;monos del hecho de que el programa se parar&amp;aacute;), nuestro &lt;i style="mso-bidi-font-style:normal;"&gt;stack&lt;/i&gt; liberar&amp;aacute; todos los valores locales, lo que significa que tanto el valor de x como de y se perder&amp;aacute;n. Esto es significativo porque la memoria asignada en el &lt;i style="mso-bidi-font-style:normal;"&gt;heap&lt;/i&gt; todav&amp;iacute;a contiene nuestra cadena, pero hemos perdido toda referencia a ella (no hay alg&amp;uacute;n apuntador apunt&amp;aacute;ndola). En C o C++ esto resulta en una fuga de memoria &amp;ndash; sin una referencia a nuestra direcci&amp;oacute;n en el &lt;i style="mso-bidi-font-style:normal;"&gt;heap&lt;/i&gt; no podemos liberarla de la memoria). En C# o Java, nuestro confiable recolector de basura detectar&amp;aacute; el objeto sin referencia y lo liberar&amp;aacute;.&lt;/span&gt;&lt;span lang="ES-MX" style="mso-no-proof:yes;mso-fareast-language:EN-CA;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES" style="mso-ansi-language:ES;mso-no-proof:yes;mso-fareast-language:EN-CA;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;"&gt;Veremos ejemplos m&amp;aacute;s complejos, que aparte de tener m&amp;aacute;s flechas apuntando, es b&amp;aacute;sicamente el mismo.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style="border-bottom:#1f497d 2.25pt solid;border-left:medium none;padding-bottom:10pt;padding-left:0in;padding-right:0in;background:#f2f2f2;border-top:#1f497d 2.25pt solid;border-right:medium none;padding-top:10pt;mso-background-themecolor:background1;mso-background-themeshade:242;mso-border-top-themecolor:text2;mso-border-bottom-themecolor:text2;mso-element:para-border-div;"&gt;
&lt;p class="CodeCxSpFirst"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="color:#003399;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-US;"&gt; &lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;class&lt;/span&gt;&lt;/span&gt; Empleado&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;private&lt;/span&gt;&lt;/span&gt; &lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;int&lt;/span&gt;&lt;/span&gt; _empleadoId;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;private&lt;/span&gt;&lt;/span&gt; &lt;span class="CodeType"&gt;&lt;span style="color:#31849b;"&gt;Empleado&lt;/span&gt;&lt;/span&gt; _gerente;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-family:Courier New;font-size:x-small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;public&lt;/span&gt;&lt;/span&gt; &lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;int&lt;/span&gt;&lt;/span&gt; EmpleadoId&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;get&lt;/span&gt;&lt;/span&gt; { &lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;return&lt;/span&gt;&lt;/span&gt; _empleadoId; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;set&lt;/span&gt;&lt;/span&gt; { _empleadoId = value; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;public&lt;/span&gt;&lt;/span&gt; &lt;span class="CodeType"&gt;&lt;span style="color:#31849b;"&gt;Empleado&lt;/span&gt;&lt;/span&gt; Gerente&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;get&lt;/span&gt;&lt;/span&gt; { &lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;return&lt;/span&gt;&lt;/span&gt; _gerente; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;set&lt;/span&gt;&lt;/span&gt; { _gerente = value; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-family:Courier New;font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;public&lt;/span&gt;&lt;/span&gt; Empleado(&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;int&lt;/span&gt;&lt;/span&gt; empleadoId)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;_empleadoId = empleadoId;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="color:#003399;"&gt;public class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-US;"&gt; Prueba&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="ES-MX"&gt;private&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="CodeType"&gt;&lt;span lang="ES-MX"&gt;&lt;span style="color:#31849b;"&gt; Empleado&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES-MX"&gt; _subordinado;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span lang="ES-MX"&gt;&lt;span style="font-family:Courier New;font-size:x-small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span class="CodeKeyword"&gt;&lt;span lang="ES-MX"&gt;&lt;span style="color:#003399;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;void &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES-MX"&gt;HacerAlgo()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span lang="ES-MX"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span lang="ES-MX"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="CodeType"&gt;&lt;span style="color:#31849b;"&gt;Empleado&lt;/span&gt;&lt;/span&gt; jefe = &lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span class="CodeType"&gt;&lt;span style="color:#31849b;"&gt;Empleado&lt;/span&gt;&lt;/span&gt;(1);&lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;_subordinado = &lt;span class="CodeKeyword"&gt;&lt;span style="color:#003399;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span class="CodeType"&gt;&lt;span style="color:#31849b;"&gt;Empleado&lt;/span&gt;&lt;/span&gt;(2);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span lang="ES-MX"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;_subordinado.Gerente = _jefe;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle"&gt;&lt;span lang="ES-MX"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast"&gt;&lt;span lang="ES-MX"&gt;&lt;span style="font-family:Courier New;font-size:x-small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p class="MsoNormal" align="center"&gt;&lt;span style="mso-ansi-language:EN-US;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;&lt;span style="font-family:Calibri;font-size:small;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/4300.stackheappointers.png"&gt;&lt;img src="http://msmvps.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/4300.stackheappointers.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;&lt;span style="font-family:Calibri;font-size:small;"&gt;Interesantemente, cuando salimos de nuestro m&amp;eacute;todo, la variable jefe se liberar&amp;aacute; del &lt;i style="mso-bidi-font-style:normal;"&gt;stack&lt;/i&gt;, pero el subordinado, que est&amp;aacute; definido por el alcance padre, no. Esto significa que el recolector de basura no tendr&amp;aacute; nada que limpiar porque los dos valores del &lt;i style="mso-bidi-font-style:normal;"&gt;heap&lt;/i&gt; seguir&amp;aacute;n siendo referenciados (uno directamente del &lt;i style="mso-bidi-font-style:normal;"&gt;stack&lt;/i&gt;, y el otro indirectamente del &lt;i style="mso-bidi-font-style:normal;"&gt;stack&lt;/i&gt; a trav&amp;eacute;s del objeto referenciado.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;&lt;span style="font-family:Calibri;font-size:small;"&gt;Como puede ver, los apuntadores definitivamente juegan una parte importante tanto en C# como en VB.NET. Como el apuntador aritm&amp;eacute;tico no est&amp;aacute; disponible en ninguno de estos lenguajes, los apuntadores son grandemente simplificados y con suerte f&amp;aacute;cilmente entendidos.&lt;/span&gt;&lt;/span&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://msmvps.com/aggbug.aspx?PostID=1745878" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/.net/default.aspx">.net</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category></item><item><title>Regreso a las bases: Memoria</title><link>http://msmvps.com/blogs/gflores/archive/2009/12/14/regreso-a-las-bases-memoria.aspx</link><pubDate>Mon, 14 Dec 2009 17:08:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1745558</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=1745558</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2009/12/14/regreso-a-las-bases-memoria.aspx#comments</comments><description>&lt;p&gt;Lo que sigue es una traducci&amp;oacute;n de una secci&amp;oacute;n del ebook gratuito &lt;a href="http://codebetter.com/blogs/karlseguin/archive/2008/06/24/foundations-of-programming-ebook.aspx"&gt;Foundations of Programming&lt;/a&gt; de &lt;a href="http://codebetter.com/blogs/karlseguin/"&gt;Karl Seguin&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Regreso a las bases: Memoria&lt;/h4&gt;
&lt;p&gt;Por m&amp;aacute;s que se intente, los lenguajes modernos de programaci&amp;oacute;n no pueden abstraer completamente los aspectos fundamentales de los sistemas computacionales. Por ejemplo, podemos asumir que usted se ha encontrado con las siguientes excepciones .NET: NullReferneceException, OutOfMemoryException, StackOverflowException y ThreadAbortException. Tan importante como es para desarrolladores adopter varios patrones y t&amp;eacute;cnicas de alto nivel, es igualmente importante comprender el ecosistema en el cual su programa se ejecuta. Mirando por encima de las capas prove&amp;iacute;das por el compilar de C# (o VB.NET), el CLR y el sistema operativo, nos encontramos con la memoria. Todos los programas hacen uso extensivo de la memoria del sistema e interaccionan con ella en maravillas maneras, es dif&amp;iacute;cil ser un buen programador sin comprender esta interacci&amp;oacute;n fundamental.&lt;br /&gt;Mucha de la confusi&amp;oacute;n sobre la memoria nace del hecho de que tanto C# y VB.NET son lenguajes administrados y que el CLR provee la recolecci&amp;oacute;n autom&amp;aacute;tica de basura. Esto ha causado que muchos desarrolladores asuman err&amp;oacute;neamente que no necesitan preocuparse por la memoria.&lt;/p&gt;
&lt;h4&gt;Asignaci&amp;oacute;n de Memoria&lt;/h4&gt;
&lt;p&gt;En .NET, como en muchos otros lenguajes, cada variable que se defina est&amp;aacute; almacenada en el stack&amp;nbsp; o en el heap . Estos son dos espacios separados asignados en la memoria de sistema que sirven un prop&amp;oacute;sito distinto, aunque complementario. Lo que va donde est&amp;aacute; predeterminado: valores de tipos van en el stack, mientras que la referencia a tipos va en el heap. En otras palabras, todos los tipos de sistema, como char, int, long, byte, enum y cualquier estructura (ya sean definidas por.NET o por usted) van en el stack. La &amp;uacute;nica excepci&amp;oacute;n a esta regla son los valores de tipos que pertenecen a referencias de tipos &amp;ndash; por ejemplo la propiedad Id de una clase User va en el heap junto con la instancia de la clase User misma.&lt;/p&gt;
&lt;h4&gt;El Stack&lt;/h4&gt;
&lt;p&gt;Aunque estamos acostumbrados al m&amp;aacute;gico colector de basura, los valores en el stack son autom&amp;aacute;ticamente administrados a&amp;uacute;n en un mundo sin colector de basura (como en C). Esto es porque cuando sea que entramos a un nuevo alcance (como un m&amp;eacute;todo o una sentencia If) los valores son empujados al stack y cuando salen del stack los valores son liberados. Esta es la raz&amp;oacute;n por la que un stack es sin&amp;oacute;nimo a LIFO - last-in first-out (&amp;uacute;ltimo en entrar primero en salir). Puede pensarlo en este modo: cuando se crea un nuevo alcance, por ejemplo un m&amp;eacute;todo, un marcador es puesto en el stack y los valores son a&amp;ntilde;adidos como se necesiten. Cuando se deja ese alcance, todos los valores son liberados incluyendo el marcador del m&amp;eacute;todo. Esto funciona en cualquier nivel de anidado.&lt;br /&gt;Hasta que veamos la interacci&amp;oacute;n entre el heap y el stack, la &amp;uacute;nica manera real de meterse en problemas con el stack es con StackOverflowException. Esto significa que ha usado todo el espacio disponible del stack. 99.9% del tiempo, esto indica una llamada recursiva interminable (una funci&amp;oacute;n que se llama a s&amp;iacute; misma ad infinitum). En teor&amp;iacute;a esto puede ser causado por un muy muy mal dise&amp;ntilde;o de sistema, aunque nunca he visto una llamada&amp;nbsp; no recursiva usando todo el espacio del stack.&lt;/p&gt;
&lt;h4&gt;El Heap&lt;/h4&gt;
&lt;p&gt;La asignaci&amp;oacute;n de memoria en el heap no es tan simple como el stack. La mayor&amp;iacute;a de la asignaci&amp;oacute;n de memoria basada en el heap ocurre cuando creamos un objeto new. El compilador averigua cuanta memoria necesitaremos (lo cual no es tan dif&amp;iacute;cil, a&amp;uacute;n con objetos con referencias anidadas), toma un apropiado mont&amp;oacute;n de memoria y regresa el apuntador a la memoria asignada (m&amp;aacute;s acerca de esto en un momento). El ejemplo m&amp;aacute;s sencillo es una cadena, si cada car&amp;aacute;cter en una cadena toma 2 bytes, y creamos una nueva cadena con el valor de &amp;ldquo;Hola Mundo&amp;rdquo;, entonces el CLR necesitar&amp;aacute; asignar 22 bytes (11x2) m&amp;aacute;s cualquier adicional necesitado.&lt;br /&gt;Hablando de cadenas, seguramente ha o&amp;iacute;do que las cadenas son inmutables &amp;ndash; esto es, una vez que ha sido declarada una cadena y asignado un valor, si se modifica esa cadena (cambiando el valor o concatenando otra cadena a ella), entonces una nueva cadena se crea. Esto realmente puede tener implicaciones de rendimiento negativas, y por ello la recomendaci&amp;oacute;n general es usar un StringBuilder para cualquier manipulaci&amp;oacute;n de cadenas significativa. La verdad es que cualquier objeto almacenado en el heap es inmutable con respecto a la asignaci&amp;oacute;n de tama&amp;ntilde;o, y cualquier cambio en el tama&amp;ntilde;o subyacente requerir&amp;aacute; una nueva asignaci&amp;oacute;n. El StringBuilder, junto con algunas colecciones, parcialmente pueden sacar la vuelta a esto usando buffers internos. Una vez que el buffer se llena, la misma reasignaci&amp;oacute;n ocurre y alg&amp;uacute;n tipo de algoritmo de crecimiento es usado para determinar el nuevo tama&amp;ntilde;o (el m&amp;aacute;s simple siendo antiguoTama&amp;ntilde;o * 2). Siempre que sea posible es buena idea especificar la capacidad inicial de dichos objetos para evitar este tipo de reasignaci&amp;oacute;n (el constructor para tanto el StringBuilder y el&amp;nbsp; ArrayList (entre muchas otras colecciones) le permiten especificar capacidad inicial). &lt;br /&gt;Recolectar basura del heap es una tarea no trivial. A diferencia del stack donde el &amp;uacute;ltimo alcance puede simplemente liberarlo, los objetos del heap no son locales a un determinado alcance. En lugar de ello, la mayor&amp;iacute;a son referencias profundamente anidadas de otros objetos referenciados. En lenguajes como en C, cuando un programador causa que la memoria sea asignada al heap, debe asegurarse tambi&amp;eacute;n de remover del heap cuando ha terminado con &amp;eacute;l. En lenguajes administrados, el motor en tiempo de ejecuci&amp;oacute;n se encarga de limpiar los recursos (.NET usa un Recolector de Basura Generacional que est&amp;aacute; brevemente descrito en la Wikipedia).&lt;br /&gt;Hay muchos incidentes horribles que pueden molestar a los desarrolladores mientras trabajan con el heap. Fugas de memoria no solo son posibles sino muy comunes, la fragmentaci&amp;oacute;n de memoria puede causar todo tipo de caos, y varios problemas de rendimiento pueden generarse gracias a comportamiento de asignaci&amp;oacute;n extra&amp;ntilde;o o interacci&amp;oacute;n con c&amp;oacute;digo sin administrar (lo cual .NET hace mucho debajo del agua). &lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1745558" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/.net/default.aspx">.net</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category></item><item><title>Screencasts sobre ADO.NET Entity Framework con C#</title><link>http://msmvps.com/blogs/gflores/archive/2009/09/15/screencasts-sobre-ado-net-entity-framework-con-c.aspx</link><pubDate>Tue, 15 Sep 2009 13:13:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1723509</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=1723509</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2009/09/15/screencasts-sobre-ado-net-entity-framework-con-c.aspx#comments</comments><description>&lt;p&gt;En esta serie de screencasts vemos como hacer cosas sencillas con ADO.NET Entity Framework, para un primer contacto con esta tecnolog&amp;iacute;a.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Introducci&amp;oacute;n&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.youtube.com/watch?v=t34ASNrXh1Y"&gt;&lt;img title="Northwind y pubs" src="http://i1.ytimg.com/vi/t34ASNrXh1Y/default.jpg" alt="Northwind y pubs" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.youtube.com/watch?v=t34ASNrXh1Y"&gt;&lt;span&gt;Northwind y pubs:&lt;/span&gt;&lt;/a&gt; &lt;br /&gt;Para saber como tener instaladas las bases de datos de prueba Northwind y pubs, prove&amp;iacute;das por Microsoft&lt;/p&gt;
&lt;p&gt;

&lt;a href="http://www.youtube.com/watch?v=PuhPIRLokAY"&gt;&lt;img title="Usando C# en ASP.NET con ADO.NET Entity Framework" src="http://i1.ytimg.com/vi/PuhPIRLokAY/default.jpg" alt="Usando C# en ASP.NET con ADO.NET Entity Framework" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.youtube.com/watch?v=PuhPIRLokAY"&gt;&lt;span&gt;Usando C# en ASP.NET con ADO.NET Entity Framework&lt;/span&gt;&lt;/a&gt;
&lt;br /&gt;Un ejemplo r&amp;aacute;pido para ver como es el contexto de uso del ADO.NET Entity Framework

&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Tareas espec&amp;iacute;ficas&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;a href="http://www.youtube.com/watch?v=6Rm4z2iUxik"&gt;&lt;img title="B&amp;uacute;squeda en ADO.NET Entity Framework con C#" src="http://i3.ytimg.com/vi/6Rm4z2iUxik/default.jpg" alt="B&amp;uacute;squeda en ADO.NET Entity Framework con C#" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=6Rm4z2iUxik"&gt;&lt;span&gt;B&amp;uacute;squeda en ADO.NET Entity Framework con C#&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Paso inicial para el resto de las tareas
	&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=mo9FSoHL9nY"&gt;&lt;img title="Alta de registros con ADO.NET Entity Framework con C#" src="http://i2.ytimg.com/vi/mo9FSoHL9nY/default.jpg" alt="Alta de registros con ADO.NET Entity Framework con C#" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=mo9FSoHL9nY"&gt;&lt;span&gt;Alta de registros con ADO.NET Entity Framework con C#&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Como agregar registros
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=ngZqW0vcUWc"&gt;&lt;img title="Baja de registros con ADO.NET Entity Framework con C#" src="http://i3.ytimg.com/vi/ngZqW0vcUWc/default.jpg" alt="Baja de registros con ADO.NET Entity Framework con C#" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=ngZqW0vcUWc"&gt;&lt;span&gt;&lt;br /&gt;Baja de registros con ADO.NET Entity Framework con C#&lt;/span&gt;&lt;/a&gt;
&lt;br /&gt;Como eliminar registros
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=jeSbsGlQb3E"&gt;&lt;img title="Cambios a registros en ADO.NET Entity Framework con C#" src="http://i3.ytimg.com/vi/jeSbsGlQb3E/default.jpg" alt="Cambios a registros en ADO.NET Entity Framework con C#" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=jeSbsGlQb3E"&gt;&lt;span&gt;Cambios a registros en ADO.NET Entity Framework con C#&lt;/span&gt;&lt;/a&gt;
&lt;br /&gt;Como hacer modificaciones&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1723509" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category></item><item><title>No abre http://localhost Visual Studio</title><link>http://msmvps.com/blogs/gflores/archive/2009/06/08/no-abre-http-localhost-visual-studio.aspx</link><pubDate>Tue, 09 Jun 2009 03:57:20 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1694642</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=1694642</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2009/06/08/no-abre-http-localhost-visual-studio.aspx#comments</comments><description>&lt;p&gt;Hace unos días unos compañeros de la universidad me advirtieron de un problema que les ocurría en común a máquinas donde tuvieran Visual Studio 2008 y particularmente en sistema operativo Windows Vista. Se trata de que al intentar correr alguna aplicación ASP.NET desde el entorno de desarrollo les salía Internet Explorer con la infame “Internet Explorer cannot display the webpage” y pues, estaban sin poder continuar con sus trabajos.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores.metablogapi/5314.iecannot_5F00_2C07D9A6.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="iecannot" border="0" alt="iecannot" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores.metablogapi/4152.iecannot_5F00_thumb_5F00_537EA610.png" width="244" height="153" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Al principio me imaginaba que era algo que tenía que ver con el archivo de hosts y después de &lt;a href="http://stackoverflow.com/questions/657383/localhost-does-not-browser-looks-for-www-localhost-com"&gt;investigar un poco más&lt;/a&gt;, me dieron la razón.&lt;/p&gt;  &lt;p&gt;Lo que debes hacer es usar un editor de texto (como Notepad o Notepad++) y abrir desde el directorio C:\Windows\System32\Drivers\Etc\ un archivo que se llama hosts (sin extensión) y remover la línea que dice algo de localhost. Te puede aparecer así:&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;::1&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; localhost&lt;/strong&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;o así   &lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;127.0.0.1&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://www.localhost.com"&gt;www.localhost.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Ahora nada más graba este archivo otra vez, cuidando que no se anexe la extensión txt (y si se anexa, se la quitas). Parece medio absurdo, pero puede ser que si te ocurre este problema, quizás sea por esto.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1694642" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/howto/default.aspx">howto</category></item><item><title>Comunidades Virtuales</title><link>http://msmvps.com/blogs/gflores/archive/2009/05/21/comunidades-virtuales.aspx</link><pubDate>Thu, 21 May 2009 15:19:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1692874</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=1692874</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2009/05/21/comunidades-virtuales.aspx#comments</comments><description>&lt;p&gt;De la Facultad de Contadur&amp;iacute;a, Administraci&amp;oacute;n e Inform&amp;aacute;tica de la &lt;a href="http://uabc.mx"&gt;UABC&lt;/a&gt;, me invitaron a dar una pl&amp;aacute;tica acerca de Comunidades Virtuales en la cual les coment&amp;eacute; acerca de como los foros, sitios de redes sociales y otros conforman lo que a todas luces es comunidad que aunque virtuales, llevan un gran sentido de pertenencia y participaci&amp;oacute;n, adem&amp;aacute;s como la &lt;a title="TJNET" href="http://tjnet.org"&gt;Comunidad .NET Tijuana&lt;/a&gt; en particular hace uso de estas herramientas para complementar esta comunidad presencial. Aqu&amp;iacute; algunas fotos y la presentaci&amp;oacute;n misma:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="width:425px;text-align:left;" id="__ss_1467837"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/gabofr/comunidades-virtuales-1467837?type=presentation" title="Comunidades Virtuales"&gt;Comunidades Virtuales&lt;/a&gt;





&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/gabofr"&gt;Gabriel Flores&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;iframe style="border:1px solid #dde5e9;margin:3px;padding:0pt;width:240px;height:66px;background-color:#ffffff;" src="http://cid-b4329e20a9381067.skydrive.live.com/embedrowdetail.aspx/Pictures/Fotos%20de%20Eventos%20TJNET/Comunidades%20Virtuales" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Por cierto, un agradecimiento a Sergio Quijada y su equipo por la invitaci&amp;oacute;n.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1692874" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/eventos/default.aspx">eventos</category></item><item><title>ADO.NET Entity Framework y llaves foráneas</title><link>http://msmvps.com/blogs/gflores/archive/2009/04/30/ado-net-entity-framework-y-llaves-for-225-neas.aspx</link><pubDate>Thu, 30 Apr 2009 16:37:12 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1691629</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=1691629</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2009/04/30/ado-net-entity-framework-y-llaves-for-225-neas.aspx#comments</comments><description>&lt;p&gt;Es algo muy normal trabajar con tablas que están relacionadas con otras por medio de llaves foráneas. Si has usado ADO.NET Framework para hacer algunas operaciones con la BD y para mostrar datos en una página ASP.NET, quizás te hayas encontrado con el dilema de mostrar los campos relacionados de la tabla externa a la que estás mostrando.&lt;/p&gt;  &lt;p&gt;Por ejemplo, tomando como ejemplo la clásica base de datos de Northwind, y teniendo las tablas de Products y Categories, y si definimos nuestro modelo de Entidades de esta forma:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/modelo_5F00_405B6A31.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="modelo" border="0" alt="modelo" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/modelo_5F00_thumb_5F00_1270A82A.jpg" width="419" height="312" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Podemos mostrar en un GridView el contenido de Products haciendo la referencia correspondiente:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;pre&gt;        NorthwindModel.NorthwindEntities ne &lt;span style="background-color:white;font-family:courier new;color:red;font-size:11px;"&gt;=&lt;/span&gt; 
            &lt;span style="background-color:white;font-family:courier new;color:blue;font-size:11px;"&gt;new&lt;/span&gt; NorthwindModel.NorthwindEntities();

        var products &lt;span style="background-color:white;font-family:courier new;color:red;font-size:11px;"&gt;=&lt;/span&gt; from p &lt;span style="background-color:white;font-family:courier new;color:blue;font-size:11px;"&gt;in&lt;/span&gt; ne.Products
                       select p;

        grdProductos.DataSource &lt;span style="background-color:white;font-family:courier new;color:red;font-size:11px;"&gt;=&lt;/span&gt; products;
        grdProductos.DataBind();&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/grid_5F00_68FC66E9.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="grid" border="0" alt="grid" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/grid_5F00_thumb_5F00_184DDC74.jpg" width="405" height="321" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Pero ¿qué tal si quiero mostrar en el mismo GridView la descripción de la categoría? Basta incluir en la declaración del campo la propiedad Include para que se pueda cargar ese dato.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;        NorthwindModel.NorthwindEntities ne &lt;span style="background-color:white;font-family:courier new;color:red;font-size:11px;"&gt;=&lt;/span&gt; 
            &lt;span style="background-color:white;font-family:courier new;color:blue;font-size:11px;"&gt;new&lt;/span&gt; NorthwindModel.NorthwindEntities();

        var products &lt;span style="background-color:white;font-family:courier new;color:red;font-size:11px;"&gt;=&lt;/span&gt; from p &lt;span style="background-color:white;font-family:courier new;color:blue;font-size:11px;"&gt;in&lt;/span&gt; ne.Products
                       &lt;strong&gt;.Include(&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;Categories&amp;quot;&lt;/span&gt;)&lt;/strong&gt;
                       select p;

        grdProductos.DataSource &lt;span style="background-color:white;font-family:courier new;color:red;font-size:11px;"&gt;=&lt;/span&gt; products;
        grdProductos.DataBind();&lt;/pre&gt;

&lt;p&gt;Y con esto tenemos acceso a los campos de la segunda tabla para de esa manera mostrar como fuente de datos de alguna columna del grid algún campo. En este caso, con un Template Field hacemos un Bind usando simplemente &lt;em&gt;Categories.Description&lt;/em&gt; que sería la manera de ligar desde Products a ese campo:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;    &amp;lt;asp:TemplateField HeaderText=&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;Category&amp;quot;&lt;/span&gt;&amp;gt;
        &amp;lt;EditItemTemplate&amp;gt;
            &amp;lt;asp:TextBox ID=&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;TextBox1&amp;quot;&lt;/span&gt; runat=&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; 
                Text=&amp;#39;&amp;lt;%# Bind(&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;Categories.Description&amp;quot;&lt;/span&gt;) &lt;span style="background-color:white;font-family:courier new;color:red;font-size:11px;"&gt;%&lt;/span&gt;&amp;gt;&amp;#39;&amp;gt;
                &amp;lt;/asp:TextBox&amp;gt;
        &amp;lt;/EditItemTemplate&amp;gt;
        &amp;lt;ItemTemplate&amp;gt;
            &amp;lt;asp:Label ID=&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;Label1&amp;quot;&lt;/span&gt; runat=&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; 
                Text=&amp;#39;&amp;lt;%# Bind(&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;Categories.Description&amp;quot;&lt;/span&gt;) &lt;span style="background-color:white;font-family:courier new;color:red;font-size:11px;"&gt;%&lt;/span&gt;&amp;gt;&amp;#39;&amp;gt;
            &amp;lt;/asp:Label&amp;gt;
        &amp;lt;/ItemTemplate&amp;gt;
    &amp;lt;/asp:TemplateField&amp;gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/gridconcategoria_5F00_557197F9.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="gridconcategoria" border="0" alt="gridconcategoria" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/gridconcategoria_5F00_thumb_5F00_549BC2C0.jpg" width="544" height="257" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Por supuesto que en lugar de esto pudiéramos usar Vistas desde el servidor SQL Server con todos los campos que ocupemos, pero esta sería una de las formas de resolver como mostrar los campos en tablas mediante llaves foráneas usando código de ADO.NET Entity Framework.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1691629" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/howto/default.aspx">howto</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/asp.net/default.aspx">asp.net</category></item><item><title>Formato de fecha en Gridview</title><link>http://msmvps.com/blogs/gflores/archive/2009/04/03/formato-de-fecha-en-gridview.aspx</link><pubDate>Fri, 03 Apr 2009 22:01:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1684484</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=1684484</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2009/04/03/formato-de-fecha-en-gridview.aspx#comments</comments><description>&lt;p&gt;No est&amp;aacute; de m&amp;aacute;s recordar que cuando tienes un GridView con un campo tipo fecha, puedes definir el formato de la cadena a lo que t&amp;uacute; gustes, en lugar de los valores por default de fecha completa:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/fechafull_5F00_3DA5FC98.jpg"&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;img height="170" width="168" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/fechafull_5F00_thumb_5F00_2D99BE92.jpg" alt="fechafull" border="0" title="fechafull" 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;p&gt;Para definir el formato de salida de la cadena en campos ligados, es sencillo, usando la propiedad DataFormatString:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&amp;lt;asp:BoundField DataField=&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;Fecha&amp;quot;&lt;/span&gt; DataFormatString=&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;{0:d}&amp;quot;&lt;/span&gt; &lt;span style="background-color:white;font-family:courier new;color:#ff0000;font-size:11px;"&gt;/&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pero &amp;iquest;qu&amp;eacute; pasa si tenemos TemplateFields, sencillo, usando la misma funci&amp;oacute;n &lt;strong&gt;Bind&lt;/strong&gt; donde especificamos en el enlace al campo de datos para agregarle el formato que necesitamos:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&amp;lt;asp:TemplateField HeaderText=&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;Fecha&amp;quot;&lt;/span&gt;&amp;gt;
  &amp;lt;EditItemTemplate&amp;gt;
    &amp;lt;asp:TextBox ID=&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;TextBox1&amp;quot;&lt;/span&gt; runat=&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;             Text=&amp;#39;&amp;lt;%# Bind(&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;Fecha&amp;quot;&lt;/span&gt;,&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;{0:d}&amp;quot;&lt;/span&gt;) &lt;span style="background-color:white;font-family:courier new;color:#ff0000;font-size:11px;"&gt;%&lt;/span&gt;&amp;gt;&amp;#39;&amp;gt;&lt;/pre&gt;
&lt;pre&gt;    &amp;lt;/asp:TextBox&amp;gt;
  &amp;lt;/EditItemTemplate&amp;gt;
  &amp;lt;ItemTemplate&amp;gt;
    &amp;lt;asp:Label ID=&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;Label1&amp;quot;&lt;/span&gt; runat=&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;              Text=&amp;#39;&amp;lt;%# Bind(&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;Fecha&amp;quot;&lt;/span&gt;,&lt;span style="background-color:#ededed;font-family:courier new;color:#666666;font-size:11px;"&gt;&amp;quot;{0:d}&amp;quot;&lt;/span&gt;) &lt;span style="background-color:white;font-family:courier new;color:#ff0000;font-size:11px;"&gt;%&lt;/span&gt;&amp;gt;&amp;#39;&amp;gt;&lt;/pre&gt;
&lt;pre&gt;     &amp;lt;/asp:Label&amp;gt;
  &amp;lt;/ItemTemplate&amp;gt;
&amp;lt;/asp:TemplateField&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;De esta manera podemos mostrar a nuestra conveniencia el formato de los datos que mostramos en un gridview:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/fecha_5F00_089BFE19.jpg"&gt;&lt;img height="161" width="85" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gflores/fecha_5F00_thumb_5F00_1602111F.jpg" alt="fecha" border="0" title="fecha" 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://msmvps.com/aggbug.aspx?PostID=1684484" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/asp.net/default.aspx">asp.net</category></item><item><title>Algunas funciones Javascript útiles para ASP.NET (en C#)</title><link>http://msmvps.com/blogs/gflores/archive/2009/03/05/algunas-funciones-javascript-250-tiles-para-asp-net-en-c.aspx</link><pubDate>Fri, 06 Mar 2009 00:28:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1675873</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=1675873</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2009/03/05/algunas-funciones-javascript-250-tiles-para-asp-net-en-c.aspx#comments</comments><description>&lt;p&gt;Nunca est&amp;aacute; de m&amp;aacute;s conocer algunas funciones &amp;uacute;tiles para hacer m&amp;aacute;s efectiva la programaci&amp;oacute;n web en ASP.NET, entre los que uso bastante son:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ventana de Confirmaci&amp;oacute;n (Messagebox del lado del cliente)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Muy &amp;uacute;til para pedirle confirmaci&amp;oacute;n al usuario cuando se va a hacer alg&amp;uacute;n proceso del cual se puede arrepentir, por ejemplo, pedirle confirmaci&amp;oacute;n para borrar alg&amp;uacute;n registro. En el bot&amp;oacute;n donde se va a agregar la l&amp;oacute;gica para hacerlo, se le agrega el detalle para abrir una ventana y pedir confirmaci&amp;oacute;n. En el evento Load de la p&amp;aacute;gina es un buen lugar para hacerlo:&lt;/p&gt;
&lt;pre&gt;    &lt;span style="font-size:11px;background-color:white;font-family:Courier New;color:blue;"&gt;protected&lt;/span&gt; &lt;span style="font-size:11px;background-color:white;font-family:Courier New;color:blue;"&gt;void&lt;/span&gt; Page_Load(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;         btnEliminar.Attributes.Add(&lt;span style="font-size:11px;background-color:#ededed;font-family:Courier New;color:#666666;"&gt;&amp;quot;onclick&amp;quot;&lt;/span&gt;, &lt;span style="font-size:11px;background-color:#ededed;font-family:Courier New;color:#666666;"&gt;&lt;br /&gt;         &amp;quot;return confirm(&amp;#39;&amp;iquest;Eliminar registro?&amp;#39;);&amp;quot;&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Si el usuario presiona Ok, se ejecutar&amp;aacute; el c&amp;oacute;digo para borrar el registro, si no, es como si nunca hubiera tocado el bot&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Mostrar una ventana con tama&amp;ntilde;o determinado&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;A veces necesitamos mostrar una ventana extra independiente del &amp;aacute;rea de trabajo del usuario para informaci&amp;oacute;n, alg&amp;uacute;n proceso peque&amp;ntilde;o o algo que para demostrar atenci&amp;oacute;n no puedes abrir en un nuevo tab o en otra ventana del navegador. De esta forma incluso podemos dimensionar la ventana emergente con el tama&amp;ntilde;o adecuado para nuestros fines.&lt;/p&gt;
&lt;pre&gt;    &lt;span style="font-size:11px;background-color:white;font-family:Courier New;color:blue;"&gt;protected&lt;/span&gt; &lt;span style="font-size:11px;background-color:white;font-family:Courier New;color:blue;"&gt;void&lt;/span&gt; Page_Load(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        btnNueva.Attributes.Add(&lt;span style="font-size:11px;background-color:#ededed;font-family:Courier New;color:#666666;"&gt;&amp;quot;OnClick&amp;quot;&lt;/span&gt;, &lt;span style="font-size:11px;background-color:#ededed;font-family:Courier New;color:#666666;"&gt;&lt;br /&gt;         &amp;quot;window.open(&amp;#39;Nueva.aspx&amp;#39;,null,&amp;#39;height=220,width=480&amp;#39;);&amp;quot;&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;A tomar en cuenta es que el usuario puede tener bloqueadas las ventanas emergentes, as&amp;iacute; que una buena idea es mostrar en alg&amp;uacute;n lado de la aplicaci&amp;oacute;n que desactive para tu sitio este bloqueo.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Cerrar una ventana&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Para casos como el anterior donde despu&amp;eacute;s de abrir una ventana donde se espera generar trabajo pero no se puede confiar o resultar&amp;iacute;a muy engorroso para el usuario cerrar manualmente la ventana, conviene usar este m&amp;eacute;todo. En el ejemplo est&amp;aacute; en el evento Click de un bot&amp;oacute;n pero bien puede figurar despu&amp;eacute;s de terminado alguna funci&amp;oacute;n.&lt;/p&gt;
&lt;pre&gt;    &lt;span style="font-size:11px;background-color:white;font-family:Courier New;color:blue;"&gt;protected&lt;/span&gt; &lt;span style="font-size:11px;background-color:white;font-family:Courier New;color:blue;"&gt;void&lt;/span&gt; btnCerrar_Click(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        Response.Write(&lt;span style="font-size:11px;background-color:#ededed;font-family:Courier New;color:#666666;"&gt;&amp;quot;&amp;lt;script&amp;gt;window.close();&amp;lt;/script&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Estas son algunas funciones donde es necesario hacer trabajo del lado del cliente para determinado comportamiento, por lo mismo no es para todas las situaciones y eventos posibles. Lo &amp;uacute;nico es preguntarse si son cosas que no se pueden hacer del lado del servidor o que ser&amp;iacute;an m&amp;aacute;s r&amp;aacute;pidas y sencillas que se hicieran del lado del cliente.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1675873" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/howto/default.aspx">howto</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/asp.net/default.aspx">asp.net</category></item><item><title>Verifica tus nulos</title><link>http://msmvps.com/blogs/gflores/archive/2008/09/24/verifica-tus-nulos.aspx</link><pubDate>Wed, 24 Sep 2008 14:29:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1648777</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=1648777</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2008/09/24/verifica-tus-nulos.aspx#comments</comments><description>&lt;p&gt;Es muy sencillo verificar si una variable tiene referencia a null:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;span style="font-size:11px;background-color:white;font-family:Courier New;color:blue;"&gt;if&lt;/span&gt; (dFecha == &lt;span style="font-size:11px;background-color:white;font-family:Courier New;color:blue;"&gt;null&lt;/span&gt;) &lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pero &amp;iquest;y si los datos que quieres evaluar vienen de una base de datos? Cuando se trata de un campo de tipo fecha no es suficiente evaluarlo contra null, y asignarlo a una variable DateTime te requiere hacer un cast para que te permita usarla, pero si est&amp;aacute; en null, no te permite hacer esta asignaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;span style="font-size:11px;background-color:white;font-family:Courier New;color:green;"&gt;//Si es null el campo, no permite hacer este cast
&lt;/span&gt;dFecha &lt;span style="font-size:11px;background-color:white;font-family:Courier New;color:red;"&gt;=&lt;/span&gt; (DateTime)miDataReader[&lt;span style="font-size:11px;background-color:#ededed;font-family:Courier New;color:#666666;"&gt;&amp;quot;Fecha&amp;quot;&lt;/span&gt;];&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;La soluci&amp;oacute;n est&amp;aacute; en evaluarla contra DBNull, que contiene precisamente el valor null a nivel de base de datos:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;span style="font-size:11px;background-color:white;font-family:Courier New;color:blue;"&gt;if&lt;/span&gt; ( miDataReader[&lt;span style="font-size:11px;background-color:#ededed;font-family:Courier New;color:#666666;"&gt;&amp;quot;Fecha&amp;quot;&lt;/span&gt;] == DBNull.Value )&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Evaluando de esta forma nuestros campos de la base de datos, podremos tener mejor c&amp;oacute;digo y m&amp;aacute;s probado.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1648777" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/howto/default.aspx">howto</category></item><item><title>Parámetros en aplicaciones</title><link>http://msmvps.com/blogs/gflores/archive/2008/07/17/par-225-metros-en-aplicaciones.aspx</link><pubDate>Thu, 17 Jul 2008 20:49:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1641254</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=1641254</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2008/07/17/par-225-metros-en-aplicaciones.aspx#comments</comments><description>&lt;p&gt;Muchas veces necesitas llamar o recuperar los par&amp;aacute;metros en la aplicaci&amp;oacute;n en C# que est&amp;eacute;s desarrollando. Lo m&amp;aacute;s sencillo es usar el Environment.GetCommandLineArgs() que nos regresa un arreglo con los par&amp;aacute;metros que est&amp;aacute;n mand&amp;aacute;ndonos.&lt;/p&gt;
&lt;p&gt;Lo que es importante tomar en cuenta es que si se est&amp;aacute; enviando una cadena que contiene espacios, por ello mismo nos coloca cada par&amp;aacute;metro en distinta posici&amp;oacute;n del arreglo y s&amp;oacute;lo es suficiente armando de nuevo ese argumento:&lt;/p&gt;
&lt;p&gt;static void Main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; string[] args =&amp;nbsp; Environment.GetCommandLineArgs();&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (args.GetUpperBound()&amp;nbsp; &amp;gt; 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string sArg = args[1] + &amp;quot; &amp;quot; + args[2] + &amp;quot; &amp;quot; + args[3] + &amp;quot; &amp;quot; + args[4]; &lt;br /&gt;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;}&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1641254" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/howto/default.aspx">howto</category></item><item><title>Visual Studio Express 2008 liberado</title><link>http://msmvps.com/blogs/gflores/archive/2007/11/19/visual-studio-express-2008-liberado.aspx</link><pubDate>Mon, 19 Nov 2007 20:39:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1336559</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=1336559</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2007/11/19/visual-studio-express-2008-liberado.aspx#comments</comments><description>&lt;p&gt;Ya están disponibles las &lt;a href="http://www.microsoft.com/express/product/default.aspx"&gt;versiones Express&lt;/a&gt; de &lt;a href="http://go.microsoft.com/?linkid=7653518"&gt;Visual C#&lt;/a&gt;, &lt;a href="http://go.microsoft.com/?linkid=7653517"&gt;Visual Basic .NET&lt;/a&gt;, &lt;a href="http://go.microsoft.com/?linkid=7653520"&gt;Visual C++&lt;/a&gt; y &lt;a href="http://go.microsoft.com/?linkid=7653519"&gt;Visual WebDeveloper 2008&lt;/a&gt;. Y tiene de interesante bastantes mejoras que puedes encontrar en Visual Studio 2008 (&lt;a href="http://mario-chavez.blogspot.com/2007/11/visual-studio-2008-y-net-framework-35.html"&gt;que también liberó su RTM&lt;/a&gt;), como son:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Desarrollo de aplicaciones con &lt;a href="http://wpf.netfx3.com/"&gt;WPF&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Aplicaciones con SQL Server Compact Edition&lt;/li&gt; &lt;li&gt;LINQ integrado (también con intellisense)&lt;/li&gt; &lt;li&gt;Mayor integración con &lt;a href="http://popfly.ms"&gt;Popfly&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Toolkit de desarrollo &lt;a href="http://www.microsoft.com/express/samples/c4fp2p/default.aspx"&gt;P2P para Vista&lt;/a&gt;&lt;/li&gt;&lt;a href="http://www.microsoft.com/express/samples/C4FP2P/"&gt;&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.microsoft.com/express/samples/facebook/default.aspx"&gt;Developer kit&lt;/a&gt; para &lt;a href="http://www.facebook.com"&gt;Facebook&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;img src="http://www.microsoft.com/express/images/screenshots/VCS_Data_small.jpg" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Y mucho más. &lt;a href="http://www.microsoft.com/express/product/default.aspx"&gt;Descarga&lt;/a&gt; la versión que más te guste, &lt;a href="http://msdn2.microsoft.com/en-us/beginner/default.aspx"&gt;aprende lo nuevo&lt;/a&gt; y empieza a crear tus mejores aplicaciones.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1336559" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/.net/default.aspx">.net</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/wpf/default.aspx">wpf</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/vb.net/default.aspx">vb.net</category></item><item><title>Gráficas fáciles para web</title><link>http://msmvps.com/blogs/gflores/archive/2007/08/28/gr-225-ficas-f-225-ciles-para-web.aspx</link><pubDate>Tue, 28 Aug 2007 17:20:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1143956</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=1143956</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2007/08/28/gr-225-ficas-f-225-ciles-para-web.aspx#comments</comments><description>
&lt;p&gt;Una necesidad recurrente en cualquier tipo de proyecto es darle presentación a datos de una manera que rápidamente sea aprovechable y útil para quien toma decisiones. La presentación en gráficas comparativas es algo a lo que ya está acostumbrada la mayoría de las personas aunque para generarlas no siempre se cuenta con la herramienta adecuada.&lt;/p&gt;
 
&lt;p&gt;Carlos Aguilar creó hace unos años un control gratuito para ello, el WebChart. Y usarlo es tan sencillo como ponerlo en tu Toolbox de Visual Studio y arrastrárlo a la página que estás creando. En tu código de la página aparecerá así:&lt;/p&gt;
 
&lt;p&gt;&lt;span style="color:blue;"&gt;&amp;lt;%@&lt;/span&gt;&lt;span&gt; &lt;span style="color:maroon;"&gt;Page&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Language&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:blue;"&gt;&amp;lt;%@&lt;/span&gt;&lt;span&gt; &lt;span style="color:maroon;"&gt;Register&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;tagPrefix&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Web&amp;quot;&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Namespace&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;WebChart&amp;quot;&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Assembly&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;WebChart&amp;quot;&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:blue;"&gt;&amp;lt;%@&lt;/span&gt;&lt;span&gt; &lt;span style="color:maroon;"&gt;Import&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Namespace&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;System.Drawing&amp;quot;&lt;/span&gt;&lt;span style="color:fuchsia;"&gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;html&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;head&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;title&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;WebChart Sample&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;title&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;head&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;body&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;Web&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:maroon;"&gt;ChartControl&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Width&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;500&amp;quot;&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Height&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;350&amp;quot;&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;ChartControl1&amp;quot;&lt;/span&gt;&lt;span style="color:fuchsia;"&gt;
&lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Server&amp;quot;&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;body&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;html&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;
 
&lt;p&gt;Para darle funcionalidad es tan simple como cargar un dataset:&lt;/p&gt;
 
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="darkgreen"&gt;//en&amp;nbsp;CrearDataSet&amp;nbsp;está&amp;nbsp;la&amp;nbsp;funcionalidad&amp;nbsp;de&amp;nbsp;conexión&amp;nbsp;a&amp;nbsp;BD&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;DataSet&amp;nbsp;dsPrioridades&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;CrearDataSet()&lt;/font&gt;&lt;font color="blue"&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;PieChart&amp;nbsp;priorityChart&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;=&amp;nbsp;new&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;PieChart()&lt;/font&gt;&lt;font color="blue"&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;priorityChart.DataSource&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;dsPrioridades.Tables[&lt;/font&gt;&lt;font color="maroon"&gt;0&lt;/font&gt;&lt;font color="black"&gt;].DefaultView&lt;/font&gt;&lt;font color="blue"&gt;;&lt;/font&gt;
&lt;/p&gt;
 
&lt;p&gt;Y asignarle cuales campos comprenderán tu eje Y y tu eje X, además de cargarlo en el control:&lt;/p&gt;
 
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="black"&gt;priorityChart.DataXValueField&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;Prioridad&amp;quot;&lt;/font&gt;&lt;font color="blue"&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;priorityChart.DataYValueField&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;Proyectos&amp;quot;&lt;/font&gt;&lt;font color="blue"&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;priorityChart.DataBind()&lt;/font&gt;&lt;font color="blue"&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;ChartControl1.Charts.Add(priorityChart)&lt;/font&gt;&lt;font color="blue"&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="black"&gt;ChartControl1.RedrawChart()&lt;/font&gt;&lt;font color="blue"&gt;;&lt;/font&gt;

&lt;/p&gt;
 
&lt;p&gt;El resultado es una buena gráfica:&lt;/p&gt;
 
&lt;p&gt;&amp;nbsp;&lt;img src="http://i5.photobucket.com/albums/y152/gabofr/webchartCa.png" title="Gráfica" alt="Gráfica" height="289" width="350" /&gt;&lt;/p&gt;
 
&lt;p&gt;En la misma página de WebChart puedes descargar el archivo de ayuda que te permitirá saber como manipular todas las propiedades y métodos que tiene para lograr resultados más acordes a lo que necesitas. También hay bastantes ejemplos y código de mejoras a las gráficas que puedes generar.&lt;/p&gt;
 &lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:1965ac3f-b476-4b59-894a-c7fd604cde30" style="margin:0px;padding:0px;display:inline;"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/webchart" rel="tag"&gt;webchart&lt;/a&gt;, &lt;a href="http://technorati.com/tags/asp.net" rel="tag"&gt;asp.net&lt;/a&gt;, &lt;a href="http://technorati.com/tags/c#" rel="tag"&gt;c#&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1143956" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/howto/default.aspx">howto</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/asp.net/default.aspx">asp.net</category></item><item><title>.NET Framework 3.0</title><link>http://msmvps.com/blogs/gflores/archive/2007/04/17/net-framework-3-0.aspx</link><pubDate>Tue, 17 Apr 2007 19:56:29 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:822794</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=822794</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2007/04/17/net-framework-3-0.aspx#comments</comments><description>&lt;p&gt;Esta versión se incorpora al .NET Framework 2.0 y combina este marco de trabajo con nuevas tecnologías para crear:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Experiencias de usuario visualmente atractivas  &lt;li&gt;Comunicación interoperable confiable  &lt;li&gt;Modelos de procesos de negocio&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Siendo una evolución del .NET Framework, proveé una experiencia de desarrollo consistente y familiar para millones de desarrolladores que programan en este ambiente.&lt;/p&gt; &lt;p&gt;Para lograr estos objetivos, se tiene:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Windows Presentation Foundation (WPF)&lt;/strong&gt;, provee clases para construir aplicaciones cliente de siguiente generación que combinan interfaz de usuario, documentos y medios.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Windows Workflow Foundation (WF)&lt;/strong&gt;, con un modelo de programación, motor y herramientas para construir aplicaciones habilitadas para flujos de trabajo que modelan procesos de negocio.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Windows Communication Foundation (WCF)&lt;/strong&gt;, un modelo de pogramación unificado para construir aplicaciones orientados a servicios.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Microsoft Windows Cardspace (antes InfoCard)&lt;/strong&gt;, tecnología para simplificar y mejorar la seguridad al acceder a recursos y compartir información personal de identidad en línea.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/gflores/WindowsLiveWriter/.NETFramework3.0_B579/aa663309.20180_dotnet3%5B1%5D%5B3%5D.gif"&gt;&lt;img height="82" src="http://msmvps.com/blogs/gflores/WindowsLiveWriter/.NETFramework3.0_B579/aa663309.20180_dotnet3%5B1%5D_thumb%5B1%5D.gif" width="240"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Espera en las próximas entradas un poco más de detalle de estos componentes del .NET Framework 3.0.&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=822794" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/.net/default.aspx">.net</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/tecnolog_26002300_237_3B00_a/default.aspx">tecnolog&amp;#237;a</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/wpf/default.aspx">wpf</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/wwf/default.aspx">wwf</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/wcf/default.aspx">wcf</category></item><item><title>Referencias para .NET 3.0</title><link>http://msmvps.com/blogs/gflores/archive/2007/03/22/referencias-para-net-3-0.aspx</link><pubDate>Thu, 22 Mar 2007 20:53:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:702177</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=702177</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2007/03/22/referencias-para-net-3-0.aspx#comments</comments><description>&lt;p&gt;Algunas ligas útiles para desarrollo de aplicaciones con .NET 3.0:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/windowsvista/default.aspx"&gt;Windows Vista Developer Center&lt;/a&gt; &lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=10cc340b-f857-4a14-83f5-25634c3bf043&amp;amp;DisplayLang=en" title=".NET 3.0 download"&gt;.NET 3.0&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/netframework/aa663300.aspx"&gt;Windows Presentation Foundation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/netframework/aa663299.aspx"&gt;Windows Communication Foundation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/netframework/aa663308.aspx"&gt;Windows Workflow Foundation&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Para empezar a desarrollar:&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=7614FE22-8A64-4DFB-AA0C-DB53035F40A0"&gt;Windows SDK&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=5D61409E-1FA3-48CF-8023-E8F38E709BA6&amp;amp;displaylang=en"&gt;Visual Studio 2005 Extensions for WWF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=F54F5537-CC86-4BF5-AE44-F5A1E805680D&amp;amp;displaylang=en"&gt;Visual Studio 2005 Extensions for WCF &amp;amp; WPF&lt;/a&gt; &lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ejemplos, demos y código:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms741723.aspx"&gt;Windows Workflow Foundation Samples&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/url?sa=t&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fmsdn2.microsoft.com%2Fen-us%2Flibrary%2Fms771449.aspx&amp;amp;ei=zu4CRprgGKL8ggOliKHxDA&amp;amp;usg=__cUydTuyf5YcUHwbqpV1omk9QHMA=&amp;amp;sig2=MMbIvDyt3nLjxDYnUUEujw"&gt;Getting started with WPF Samples&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms751514.aspx"&gt;Windows Communication Foundation Samples&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Webcast: Building a Sudoku Game Using Windows Presentation Foundation &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msevents.microsoft.com/cui/eventdetail.aspx?eventID=1032294938&amp;amp;Culture=en-US"&gt;Part 1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msevents.microsoft.com/cui/eventdetail.aspx?eventID=1032294955&amp;amp;Culture=en-US"&gt;Part 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msevents.microsoft.com/cui/eventdetail.aspx?eventID=1032294957&amp;amp;Culture=en-US"&gt;Part 3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msevents.microsoft.com/cui/eventdetail.aspx?eventID=1032294959&amp;amp;Culture=en-US"&gt;Part 4&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/events/EventDetails.aspx?CMTYSvcSource=MSCOMMedia&amp;amp;Params=%7eCMTYDataSvcParams%5e%7earg+Name%3d%22ID%22+Value%3d%221032294962%22%2f%5e%7earg+Name%3d%22ProviderID%22+Value%3d%22A6B43178-497C-4225-BA42-DF595171F04C%22%2f%5e%7earg+Name%3d%22lang%22+Value%3d%22en%22%2f%5e%7earg+Name%3d%22cr%22+Value%3d%22US%22%2f%5e%7esParams%5e%7e%2fsParams%5e%7e%2fCMTYDataSvcParams%5e"&gt;Part 5&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=702177" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/.net/default.aspx">.net</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/howto/default.aspx">howto</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/wpf/default.aspx">wpf</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/wwf/default.aspx">wwf</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/wcf/default.aspx">wcf</category></item><item><title>ASP.NET AJAX Versión 1.0 disponible ya</title><link>http://msmvps.com/blogs/gflores/archive/2007/01/26/asp-net-ajax-versi-n-1-0-disponible-ya.aspx</link><pubDate>Fri, 26 Jan 2007 23:35:28 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:522171</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=522171</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2007/01/26/asp-net-ajax-versi-n-1-0-disponible-ya.aspx#comments</comments><description>&lt;p&gt;Ya está disponible la versión no beta de &lt;a title="ASP.NET Ajax" href="http://ajax.asp.net"&gt;ASP.NET Ajax&lt;/a&gt; que en su versión 1 nos da componentes Ajax reusables, soporte en los navegadores más populares y sobre todo, que puedes extender sitios web actuales con funcionalidades modernas de manera muy sencilla directamente desde Visual Studio 2005 . El Ajax Control Toolkit tiene nuevos controles como calendario, textbox con máscara, pestañas, autocompletado y otros ya populares como el del acordeón, menú flotante, calificación y dropdown en cascada que puedes ver en vivo en el sitio web de &lt;a title="ASP.NET Ajax Control Toolkit" href="http://ajax.asp.net/ajaxtoolkit/"&gt;ASP.NET Ajax Control Toolkit&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;En español, ya puedes acceder a webcasts pregrabados para que empieces a generar tus aplicaciones web de manera muy rápida y sencilla. Sólo tienes que registrarte en el enlace del webcast que más te interese:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032294789&amp;amp;EventCategory=5&amp;amp;culture=es-MX&amp;amp;CountryCode=MX"&gt;Desarrollo de Aplicaciones WEB con AJAX y ASP.NET 2.0&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032294929&amp;amp;EventCategory=5&amp;amp;culture=es-MX&amp;amp;CountryCode=MX"&gt;Desarrollo de aplicaciones con Microsoft Atlas&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032315719&amp;amp;EventCategory=3&amp;amp;culture=es-MX&amp;amp;CountryCode=MX"&gt;MSDN Radio Episodio 17 (Segmento 3: Ajax y clientes ricos)&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032294320&amp;amp;EventCategory=3&amp;amp;culture=es-MX&amp;amp;CountryCode=MX"&gt;MSDN Radio: Como Hacer Técnico: Uso de Ajax en la Plataforma ASP .NET&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032326942&amp;amp;EventCategory=4&amp;amp;culture=es-AR&amp;amp;CountryCode=AR"&gt;MDCD: AJAX y su integración con las plataformas de desarrollo&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Y para empezar ya, &lt;a title="ASP.NET Ajax download" href="http://ajax.asp.net/downloads/default.aspx?tabid=47"&gt;descárgalo&lt;/a&gt; ahora mismo y puedes irte familiarizando con los controles y ejecutar las aplicaciones de muestra que ASP.NET AJAX te ofrece.&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=522171" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/howto/default.aspx">howto</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/asp.net/default.aspx">asp.net</category></item><item><title>Parámetros opcionales en C#</title><link>http://msmvps.com/blogs/gflores/archive/2006/12/24/par-metros-opcionales-en-c.aspx</link><pubDate>Sun, 24 Dec 2006 16:22:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:447991</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=447991</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2006/12/24/par-metros-opcionales-en-c.aspx#comments</comments><description> &lt;p&gt;Un manejo bastante fácil de parámetros opcionales en C# es usando la palabra reservada params, así: &lt;br&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;    &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;public&lt;/span&gt; &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;string&lt;/span&gt; concatena(params &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;string&lt;/span&gt;[] cadenas)&lt;br&gt;    {&lt;br&gt;        &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;string&lt;/span&gt; sResult &lt;span style="font-size:11px;color:red;font-family:courier new;background-color:white;"&gt;=&lt;/span&gt; &lt;span style="font-size:11px;font-family:courier new;"&gt;""&lt;/span&gt;;&lt;br&gt;        &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;foreach&lt;/span&gt; (&lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;string&lt;/span&gt; str &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;in&lt;/span&gt; cadenas)&lt;br&gt;        {&lt;br&gt;            sResult &lt;span style="font-size:11px;color:red;font-family:courier new;background-color:white;"&gt;=&lt;/span&gt; sResult &lt;span style="font-size:11px;color:red;font-family:courier new;background-color:white;"&gt;+&lt;/span&gt; str &lt;span style="font-size:11px;color:red;font-family:courier new;background-color:white;"&gt;+&lt;/span&gt; &lt;span style="font-size:11px;font-family:courier new;"&gt;" "&lt;/span&gt;;&lt;br&gt;        }&lt;br&gt;        &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;return&lt;/span&gt; sResult;&lt;br&gt;    }&lt;/pre&gt;
&lt;p&gt;Y se usaría tan sencillo como esto:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;Label1.Text &lt;span style="font-size:11px;color:red;font-family:courier new;background-color:white;"&gt;=&lt;/span&gt; concatena(&lt;span style="font-size:11px;font-family:courier new;"&gt;"uno"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;Label1.Text &lt;span style="font-size:11px;color:red;font-family:courier new;background-color:white;"&gt;=&lt;/span&gt; concatena(&lt;span style="font-size:11px;font-family:courier new;"&gt;"primero"&lt;/span&gt;, &lt;span style="font-size:11px;font-family:courier new;"&gt;"segundo"&lt;/span&gt;, &lt;span style="font-size:11px;font-family:courier new;"&gt;"tercero"&lt;/span&gt;);&lt;/pre&gt;
&lt;p&gt;Sin embargo, se debe tomar en cuenta que esto limita el Intellisense en el proyecto, ya que no se tiene idea de los parámetros que se están pasando a la función. La recomendación políticamente correcta (en términos de POO al menos), es usar funciones con parámetros sobrecargados según se necesiten. Por ejemplo:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;    &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;static&lt;/span&gt; &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;string&lt;/span&gt; concatena(&lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;string&lt;/span&gt; str)&lt;br&gt;    {&lt;br&gt;        &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;return&lt;/span&gt; str;&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;static&lt;/span&gt; &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;string&lt;/span&gt; concatena(&lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;string&lt;/span&gt; str1, &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;string&lt;/span&gt; str2)&lt;br&gt;    {&lt;br&gt;        &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;return&lt;/span&gt; str1 &lt;span style="font-size:11px;color:red;font-family:courier new;background-color:white;"&gt;+&lt;/span&gt; &lt;span style="font-size:11px;font-family:courier new;"&gt;" "&lt;/span&gt; &lt;span style="font-size:11px;color:red;font-family:courier new;background-color:white;"&gt;+&lt;/span&gt; str2;&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;static&lt;/span&gt; &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;string&lt;/span&gt; concatena(&lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;string&lt;/span&gt; str1, &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;string&lt;/span&gt; str2, &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;string&lt;/span&gt; str3)&lt;br&gt;    {&lt;br&gt;        &lt;span style="font-size:11px;color:blue;font-family:courier new;background-color:white;"&gt;return&lt;/span&gt; str1 &lt;span style="font-size:11px;color:red;font-family:courier new;background-color:white;"&gt;+&lt;/span&gt; &lt;span style="font-size:11px;font-family:courier new;"&gt;" "&lt;/span&gt; &lt;span style="font-size:11px;color:red;font-family:courier new;background-color:white;"&gt;+&lt;/span&gt; str2 &lt;span style="font-size:11px;color:red;font-family:courier new;background-color:white;"&gt;+&lt;/span&gt; &lt;span style="font-size:11px;font-family:courier new;"&gt;" "&lt;/span&gt; &lt;span style="font-size:11px;color:red;font-family:courier new;background-color:white;"&gt;+&lt;/span&gt; str3;&lt;br&gt;    }&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;Aunque, claro está, en ejemplos tan sencillos como este nos veremos tentados a usar params, es bueno tomar en cuenta alternativas propias del lenguaje. Cuando escalemos implementaciones, nos agradeceremos a nosotros mismos seguir las reglas del juego apropiadamente.&lt;/p&gt;
&lt;p&gt;Más info:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.csharphelp.com/archives/archive18.html" title="C# Help"&gt;Using Params Keyword&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://discuss.joelonsoftware.com/default.asp?dotnet.12.301457.9" title="Optional Parameters on Joel On Software Discussion Forums"&gt;Optional Parameters&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.c-sharpcorner.com/Code/2002/May/OptionalParametersInNEt.asp" title="C# Corner"&gt;How to read optional parameters&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:56bed55f-06f6-4f66-a3fc-92b17db2cd93" style="margin:0px;padding:0px;display:inline;float:none;"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/C#" rel="tag"&gt;C#&lt;/a&gt;, &lt;a href="http://technorati.com/tags/par%c3%a1metros" rel="tag"&gt;parámetros&lt;/a&gt;, &lt;a href="http://technorati.com/tags/code" rel="tag"&gt;code&lt;/a&gt;, &lt;a href="http://technorati.com/tags/programaci%c3%b3n" rel="tag"&gt;programación&lt;/a&gt;, &lt;a href="http://technorati.com/tags/c%c3%b3digo" rel="tag"&gt;código&lt;/a&gt;, &lt;a href="http://technorati.com/tags/programming" rel="tag"&gt;programming&lt;/a&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=447991" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/howto/default.aspx">howto</category></item><item><title>Nuevo Atlas Control Toolkit</title><link>http://msmvps.com/blogs/gflores/archive/2006/08/12/107469.aspx</link><pubDate>Sat, 12 Aug 2006 20:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:107469</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=107469</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2006/08/12/107469.aspx#comments</comments><description>&lt;font face="Verdana" size="2"&gt;El toolkit del que he hablado en &lt;a HREF="/blogs/gflores/archive/2006/05/28/97512.aspx"&gt;artículos&lt;/a&gt; &lt;a HREF="/blogs/gflores/archive/2006/06/06/99612.aspx"&gt;anteriores&lt;/a&gt; ha sido actualizado con algunas mejoras, algunas correciones y sobre todo, nuevos controles:&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font face="Verdana" size="2"&gt;DynamicPopulate: es un extender para llenar el contenido de un control con el resultado de un webservice o un método.&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face="Verdana" size="2"&gt;FilteredTextBox: un extender para el TextBox que valida que no se inserten caracteres inválidos.&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face="Verdana" size="2"&gt;PagingBulletedList: para agregar opciones de páginado y ordenamiento para el control BulletedList.&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face="Verdana" size="2"&gt;PasswordStrenght: permite ver que nivel de seguridad tiene el password que le tecleas, como en el password de Hotmail.&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face="Verdana" size="2"&gt;Rating: para seleccionar el número de estrellas de calificación que el usuario elija de manera muy dinámica.&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;img src="http://i18.photobucket.com/albums/b116/gfr20/rating.gif" alt="Rating control"&gt;&lt;font face="Verdana" size="2"&gt;&lt;br&gt;&lt;br&gt;Todos ellos vienen mejor explicados en el sitio del &lt;a href="http://atlas.asp.net/atlastoolkit/"&gt;Atlas Control Toolkit&lt;/a&gt; y lo puedes descargar ya mismo de &lt;a href="http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=AtlasControlToolkit"&gt;CodePlex&lt;/a&gt;.&lt;/font&gt;&lt;br&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=107469" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/asp.net/default.aspx">asp.net</category></item><item><title>Atlas para ASP.NET</title><link>http://msmvps.com/blogs/gflores/archive/2006/05/28/97512.aspx</link><pubDate>Sun, 28 May 2006 20:07:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:97512</guid><dc:creator>Gabriel Flores</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gflores/rsscomments.aspx?PostID=97512</wfw:commentRss><comments>http://msmvps.com/blogs/gflores/archive/2006/05/28/97512.aspx#comments</comments><description>&lt;font face="Verdana" size="2"&gt;A fin de cuentas, lo que importa es lo de adentro, ¿cierto? Pues es correcto, pero si le puedes brindar al usuario una mejor experiencia de uso, mejor usabilidad y más productividad, hace de tu solución de software algo más que sólo la solución, la hace querer ser usada, la hace imprescindible.&lt;br&gt;&lt;br&gt;&lt;img src="http://i18.photobucket.com/albums/b116/gfr20/gchat.gif" align="left"&gt;Una forma de hacerlo es con Ajax, tan de moda ahorita. ¿De qué se trata? En una página de internet la interacción &lt;i&gt;usuario -&amp;gt; sitio&lt;/i&gt; se daba con intercambios de datos entre el navegador del usuario y el servidor. Botones, navegación entre páginas y otros complementos hacían que este ir y venir entre una máquina y otra una experiencia práctica para los fines de las aplicaciones hechas para esta plataforma, pero no precisamente lo más apegado a una usabilidad deseable.&lt;br&gt;&lt;br&gt;Se dejan venir aplicaciones Web 2.0 como gMail, con todos esos componentes visuales que no están sólo de adorno, sino que realmente hacen un tipo de trabajo y al parecer ¡sin tener que esperar a una respuesta del servidor! Se pueden arrastrar objetos en la página web, colapsar paneles, calcular al vuelo datos con un botón que no requiere esperar al servidor para completarse.&lt;br&gt;&lt;br&gt;Y son cosas sumamente simples, cosas al estilo ¿porqué no se me había ocurrido antes? Pero súmamente útiles. &lt;img src="http://s18.photobucket.com/albums/b116/gfr20/th_cdd.gif" align="right"&gt;Como este ejemplo del &lt;a href="http://atlas.asp.net/atlastoolkit/CascadingDropDown/CascadingDropDown.aspx"&gt;CascadingDropDown&lt;/a&gt;. ¿Porqué esperar varias vueltas al servidor si sólo son datos auxiliares que se complementan a otros para dar un resultado? En ese ejemplo, la meta es seleccionar un auto, se puede elegir de la marca, modelo y color. En lugar de mostrar 3 ListBox con todos los modelos, marcas y colores disponibles, mejor hacerlo un poco más dinámico, pero ojo, sin tener que afectar la usabilidad deseada (y la paciencia) del usuario. Selecciono primero una marca y se me filtran para esa marca el modelo. Lo mismo pasa al seleccionar el modelo y se me filtran los colores disponibles. La belleza de esto es que incluso se pueden poblar los comboboxes con datos extraídos de una base de datos, por lo que las posibilidades son ilimitadas.&lt;br&gt;&lt;br&gt;Una característica de estos &lt;a href="http://atlas.asp.net/atlastoolkit/"&gt;controles&lt;/a&gt; y este marco de trabajo &lt;a href="http://atlas.asp.net"&gt;Atlas&lt;/a&gt; para ASP.NET, es que te permite crear tus propios &lt;a href="http://atlas.asp.net/atlastoolkit/Walkthrough/CreatingNewExtender.aspx"&gt;extenders&lt;/a&gt; para los controles que actualmente uses. En el ejemplo, se está usando un contorl ComboBox y se agrega un extender para darle esa usabilidad &lt;i&gt;à la&lt;/i&gt; Ajax de una manera muy sencilla. Ahí en el &lt;a href="http://atlas.asp.net/atlastoolkit/"&gt;Atlas Control Toolkit&lt;/a&gt; encontrarás varios ya hechos con explicaciones de como empezar a usarlos desde ya en tus aplicaciones web y hacerlas unas joyas de usabilidad y productivada.&lt;br&gt;&lt;br&gt;Algunas aplicaciones llamadas Web 2.0:&lt;br&gt;&lt;br&gt;&lt;a href="http://www.writely.com"&gt;Writely&lt;/a&gt; (por cierto hecho con .NET)&lt;br&gt;&lt;a href="http://www.gmail.com"&gt;gMail&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.netvibes.com"&gt;netvibes&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.live.com"&gt;Live&lt;/a&gt;&lt;br&gt;&lt;/font&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=97512" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gflores/archive/tags/opini_26002300_243_3B00_n/default.aspx">opini&amp;#243;n</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/nivel_3A00_100/default.aspx">nivel:100</category><category domain="http://msmvps.com/blogs/gflores/archive/tags/asp.net/default.aspx">asp.net</category></item></channel></rss>