<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-14721572</id><updated>2012-01-13T13:46:51.880+01:00</updated><title type='text'>Enadan's Blog</title><subtitle type='html'>Another dotNet Development Blog</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://enadan.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://enadan.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Enadan</name><uri>http://www.blogger.com/profile/06374237789845620209</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-14721572.post-113921605776838596</id><published>2006-02-06T09:52:00.000+01:00</published><updated>2006-02-06T09:54:17.783+01:00</updated><title type='text'>Cambio de blog</title><content type='html'>Simplemente comunicar que he creado un nuevo blog, en ingles, y no creo que tenga tiempo de postear en ambos, asi que sintiendolo mucho de momento no volvere a escribir aqui.&lt;br /&gt;&lt;br /&gt;Podeis seguir leyendo mis posts en http://blogs.clearscreen.com/enadan&lt;br /&gt;&lt;br /&gt;Un saludo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14721572-113921605776838596?l=enadan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://enadan.blogspot.com/feeds/113921605776838596/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14721572&amp;postID=113921605776838596' title='15 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/113921605776838596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/113921605776838596'/><link rel='alternate' type='text/html' href='http://enadan.blogspot.com/2006/02/cambio-de-blog.html' title='Cambio de blog'/><author><name>Enadan</name><uri>http://www.blogger.com/profile/06374237789845620209</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14721572.post-113751715442867990</id><published>2006-01-17T17:57:00.000+01:00</published><updated>2006-01-17T17:59:14.756+01:00</updated><title type='text'>Lectura recomendada</title><content type='html'>Aqui dejo un link a un articulo sobre SOA que esta bastante bien.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/spanish/msdn/articulos/archivo/121205/voices/SOADesign.mspx"&gt;Principios de diseño de servicios: patrones y antipatrones de servicios&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14721572-113751715442867990?l=enadan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://enadan.blogspot.com/feeds/113751715442867990/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14721572&amp;postID=113751715442867990' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/113751715442867990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/113751715442867990'/><link rel='alternate' type='text/html' href='http://enadan.blogspot.com/2006/01/lectura-recomendada.html' title='Lectura recomendada'/><author><name>Enadan</name><uri>http://www.blogger.com/profile/06374237789845620209</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14721572.post-113690135012805581</id><published>2006-01-10T14:49:00.000+01:00</published><updated>2006-01-10T14:55:50.140+01:00</updated><title type='text'>Enhorabuena Miguel</title><content type='html'>Hace tiempo escribi un Post (Grupo de usuarios de .NET en Madrid) avisando de la creacion del grupo de usuarios de .NET en Madrid &lt;a href="http://www.madriddotnet.net"&gt;MAD.NUG&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pues ahora quiero volver a felicitar a &lt;a href="http://blogs.clearscreen.com/migs"&gt;Miguel&lt;/a&gt;, amigo y compañero de trabajo, ya que ha sido recientemente nombrado MVP de C# en España.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://mvp.support.microsoft.com/profile=60EBCBEE-174B-43BB-9786-31332AF0B556"&gt;Podeis ver su perfil MVP aqui&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Creo que si le conocierais pensariais lo mismo que yo.... ENHORABUENA, TE LO MERECIAS!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14721572-113690135012805581?l=enadan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://enadan.blogspot.com/feeds/113690135012805581/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14721572&amp;postID=113690135012805581' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/113690135012805581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/113690135012805581'/><link rel='alternate' type='text/html' href='http://enadan.blogspot.com/2006/01/enhorabuena-miguel.html' title='Enhorabuena Miguel'/><author><name>Enadan</name><uri>http://www.blogger.com/profile/06374237789845620209</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14721572.post-113637183407947331</id><published>2006-01-04T11:23:00.000+01:00</published><updated>2006-01-04T11:50:34.113+01:00</updated><title type='text'>IsNumeric en C#</title><content type='html'>Hay muchas formas de hacer esto, pero creo que la mejor es usar Expresiones Regulares, ya que poner el tipico try{} catch{} con un Convert.To...() dentro funciona bien pero si falla la conversion penaliza mucho en performance, ya que lanzar una excepcion es algo muy pesado en .NET.&lt;br /&gt;&lt;br /&gt;Os dejo el codigo que creo que se explica bien por si solo, aunque la verdad es que se ve fatal.&lt;br /&gt;Faltaria incluir si quieren usarse o no separadores de miles.... pero creo que esto os dara la base para terminarlo, no?!&lt;br /&gt;&lt;br /&gt;class NumericHelper&lt;br /&gt;{&lt;br /&gt;private const string regExNumericParse = @"^-{0,1}\d+$";&lt;br /&gt;private const string regExNumericParseWithDot = @"^-{0,1}\d*\.{0,1}\d+$";&lt;br /&gt;private const string regExNumericParseWithComma = @"^-{0,1}\d*\,{0,1}\d+$";&lt;br /&gt;&lt;br /&gt;public static bool IsNumeric(string number)&lt;br /&gt;{&lt;br /&gt;return IsNumeric(number, ' ');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static bool IsNumeric(string number, char decimalSeparator)&lt;br /&gt;{&lt;br /&gt;if (decimalSeparator != '.' &amp;&amp;amp; decimalSeparator != ',' &amp;&amp;amp; decimalSeparator != ' ')&lt;br /&gt;{&lt;br /&gt;throw new ArgumentException("decimalSeparator must be '.' or ','", "decimalSeparator");&lt;br /&gt;}&lt;br /&gt;switch (decimalSeparator)&lt;br /&gt;{&lt;br /&gt;case '.':&lt;br /&gt;return Regex.IsMatch(number.Trim(), regExNumericParseWithDot);&lt;br /&gt;case ',':&lt;br /&gt;return Regex.IsMatch(number.Trim(), regExNumericParseWithComma);&lt;br /&gt;case ' ':&lt;br /&gt;return Regex.IsMatch(number.Trim(), regExNumericParse);&lt;br /&gt;}&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14721572-113637183407947331?l=enadan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://enadan.blogspot.com/feeds/113637183407947331/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14721572&amp;postID=113637183407947331' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/113637183407947331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/113637183407947331'/><link rel='alternate' type='text/html' href='http://enadan.blogspot.com/2006/01/isnumeric-en-c.html' title='IsNumeric en C#'/><author><name>Enadan</name><uri>http://www.blogger.com/profile/06374237789845620209</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14721572.post-113492958777713169</id><published>2005-12-18T18:41:00.000+01:00</published><updated>2005-12-18T19:13:07.876+01:00</updated><title type='text'>Defensive programing in custom controls</title><content type='html'>Una de las Best Practices de todos los proyectos es tener tu propia coleccion de Custom Controls aunque a priori no vayamos a necesitarla. Basta con que heredemos de los controles del framework y cuando necesitemos implementar algo en todo nuestro proyecto veremos recompensada esta accion.&lt;br /&gt;&lt;br /&gt;En mi proyecto tenemos todos los controles de la UI customizados y hemos ido añadiendo funcionalidad poco a poco, pero el otro dia me encontre un problema que os detallo a continuacion, asi como la solucion que elegimos para arreglarlo.&lt;br /&gt;&lt;br /&gt;Muchas veces cuando creamos un control que va a usarse en todo nuestro proyecto no pensamos en todas posibles situaciones en las que este va a ser usado. Es imposible. Por motivos funcionales nos vimos obligados a añadir una serie de atributos a todos los controles, para diseñar un mecanismo que detectara en cliente si se habia modificado algun valor y poder preguntar asi al usuario si queria guardar los cambios antes de proceder a la navegacion hacia otra pagina de la aplicacion.&lt;br /&gt;&lt;br /&gt;Pues nos pusimos manos a la obra. En nuestro CustomTextBox añadimos en el PreRender un atributo "onchange" que cambiaba el valos de un HiddenField marcando la pagina como "modificada".&lt;br /&gt;&lt;br /&gt;Un mes mas tarde alguien necesitaba añadir cierta logica cliente para que, en un textbox determinado, al cambiar de valor, realizara una comprobacion de si este nuevo valor cumplia con una serie de restricciones. La persona encargada de esto hizo lo que tenia que hacer, añadio un atributo "onchange" a su textbox y la llamada a la funcion javascript que se habia creado, pero no le funcionaba. Despues de varias horas pensando que el problema era suyo, vino a hablar conmigo y vimos que su codigo era perfecto, el problema venia de mas arriba.&lt;br /&gt;&lt;br /&gt;Al añadir en el PreRender del CustomTextBox el atributo "onchange" para el mecanismo de deteccion de cambios estabamos machacando cualquier otro atributo "onchange" que alguien, desde cualquier pagina de la aplicacion, quisiera añadir.&lt;br /&gt;&lt;br /&gt;La solucion.&lt;br /&gt;&lt;br /&gt;Despues de pensar en cual seria la mejor solucion para evitar esto hicimos lo siguiente. Antes de añadir cualquier atributo en cualquiera de nuestros Custom Controls decidimos chequear si ese atributo ya existia, y en ese caso, si el valor del atributo no era el mismo que queriamos añadir, lo concatenabamos para que se llamara a ambos.&lt;br /&gt;&lt;br /&gt;Despues de ver que esto funcionaba perfectamente hicimos un pequeño refactoring para que quedara mas bonito y no tener codigo duplicado, creando un metodo del tipo AddAttributeSafety(string attibuteType, string attributeValue) que hacia todo lo que explicaba antes.&lt;br /&gt;&lt;br /&gt;Solo una ultima cosa. Siempre que añadais un atributo para hacer cosas en cliente a un control, aseguraros de que terminais el codigo del valor del atributo con ";", porque si no no podreis concatenar mas de una accion sobre el mismo evento.&lt;br /&gt;&lt;br /&gt;Este es el codigo del metodo para añadir atributos de forma segura en Custom Controls:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;private void AddAttributeSafety(string attributeType, string attributeValue)&lt;br /&gt;{&lt;br /&gt;    if (attributeType.Length == 0  attributeValue.Length == 0)&lt;br /&gt;    {&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;    if (Attributes[attributeType] == null  Attributes[attributeType].Length == 0)&lt;br /&gt;    {&lt;br /&gt;        Attributes.Add(attributeType, attributeValue);&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        string existingAttribute = Attributes[attributeType];&lt;br /&gt;        if (existingAttribute.IndexOf(attributeValue) == -1)&lt;br /&gt;        {&lt;br /&gt;            Attributes.Add(attributeType, existingAttribute + attributeValue);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como siempre espero que le sea util a alguien, y si se os curre algo mejor, compartirlo :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14721572-113492958777713169?l=enadan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://enadan.blogspot.com/feeds/113492958777713169/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14721572&amp;postID=113492958777713169' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/113492958777713169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/113492958777713169'/><link rel='alternate' type='text/html' href='http://enadan.blogspot.com/2005/12/defensive-programing-in-custom.html' title='Defensive programing in custom controls'/><author><name>Enadan</name><uri>http://www.blogger.com/profile/06374237789845620209</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14721572.post-113464755097502880</id><published>2005-12-15T12:29:00.000+01:00</published><updated>2005-12-15T12:52:30.993+01:00</updated><title type='text'>Cuidado con ListItemCollection.Insert()</title><content type='html'>Despues de un par de meses sin escribir nada vuelvo con otra de mis anecdotas.&lt;br /&gt;&lt;br /&gt;En todos los controles que heredan de ListControl (DropDownList, ListBox...) , tenemos dos formas de añadir items de forma manual, que son:&lt;br /&gt;- Items.Add(ListItem item);&lt;br /&gt;- Items.Insert(int index, ListItem item);&lt;br /&gt;&lt;br /&gt;Pues lo gracioso es que si intentamos añadir un ListItem que es null con el metodo Add(), nos lanza una excepcion, pero si usamos el metodo Insert() la excepcion no se lanza al añadir el ListItem nulo, si no que se lanza al renderizar la pagina.&lt;br /&gt;&lt;br /&gt;Ademas, si nos fijamos en la Propiedad SelectedIndex (que si no hay ningun item seleccionado deberia valer -1), vemos que es null, asi que si intentamos acceder a ella tambien lanza una excepcion.&lt;br /&gt;&lt;br /&gt;¿Por que se comportan de distinta manera estos dos metodos? ¿Deberia lanzar una excepcion el Insert() igual que lo hace el Add()?&lt;br /&gt;&lt;br /&gt;La verdad es que no deberiamos de insertar nunca un ListItem que sea null, pero visto lo visto no viene mal algo de defensive programing:&lt;br /&gt;- Si el ListItem nos lo devuelve un Metodo, antes de insertarlo chequear si es null.&lt;br /&gt;- Si lo cogemos de Session con safetly cast (Session["myItem"] as ListItem) chequear si es null.&lt;br /&gt;- Si lo hacemos a proposito aseguraros de hacer check in con el usuario del compañero que peor te caiga :D&lt;br /&gt;&lt;br /&gt;La verdad es que no es un fallo muy dificil de detectar y si es muy raro que se produzca, pero como no a mi me ha pasado, y por eso escribo este post.&lt;br /&gt;&lt;br /&gt;Espero que le sirva a alguien.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14721572-113464755097502880?l=enadan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://enadan.blogspot.com/feeds/113464755097502880/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14721572&amp;postID=113464755097502880' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/113464755097502880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/113464755097502880'/><link rel='alternate' type='text/html' href='http://enadan.blogspot.com/2005/12/cuidado-con-listitemcollectioninsert.html' title='Cuidado con ListItemCollection.Insert()'/><author><name>Enadan</name><uri>http://www.blogger.com/profile/06374237789845620209</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14721572.post-112980186689876790</id><published>2005-10-20T11:10:00.000+02:00</published><updated>2005-10-20T11:51:06.903+02:00</updated><title type='text'>Restringir caracteres de un TextBox en cliente</title><content type='html'>Muchas veces queremos limitar la entrada de caracteres de un TextBox para permitir solo numeros.&lt;br /&gt;&lt;br /&gt;Para evitar hacer PostBack, podemos realizar esta validacion en cliente de forma muy sencilla.&lt;br /&gt;&lt;br /&gt;Al TextBox le añadimos el atributo "onKeyPress", que llamara a la funcion AllowJustNumbers();&lt;br /&gt;&lt;br /&gt;Podemos hacerlo en el .aspx directamente o añadirlo desde el .cs de la siguiente forma.&lt;br /&gt;txtRestringido.Attributes.Add("onKeyPress", "AllowJustNumbers();");&lt;br /&gt;&lt;br /&gt;Metemos el siguiente script en el .aspx o en un .js aparte y listo.&lt;br /&gt;&lt;br /&gt;function AllowJustNumbers()&lt;br /&gt;{&lt;br /&gt;    if (window.event.keyCode &lt;&gt; 57)&lt;br /&gt;    {&lt;br /&gt;        window.event.keyCode = null;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Lo unico que hace este script es comprobar si la tecla pulsada esta entre el 0-9, y si no pone la tecla pulsada a null y asi no la metera en el textbox, es como si nunca se hubiera pulsado esa tecla.&lt;br /&gt;&lt;br /&gt;P.D. 48 y 57 son los codigos ASCII asociados al 0 y al 9.&lt;br /&gt;&lt;br /&gt;Esta tecnica se puede escalar para limitar la entrada de cualquier caractes, solo teneis que coger el ASCII y añadir una nueva condicion al if.&lt;br /&gt;&lt;br /&gt;Un saludo,&lt;br /&gt;Dani&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14721572-112980186689876790?l=enadan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://enadan.blogspot.com/feeds/112980186689876790/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14721572&amp;postID=112980186689876790' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/112980186689876790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/112980186689876790'/><link rel='alternate' type='text/html' href='http://enadan.blogspot.com/2005/10/restringir-caracteres-de-un-textbox-en.html' title='Restringir caracteres de un TextBox en cliente'/><author><name>Enadan</name><uri>http://www.blogger.com/profile/06374237789845620209</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14721572.post-112867736510177140</id><published>2005-10-07T11:11:00.000+02:00</published><updated>2005-10-07T11:29:25.106+02:00</updated><title type='text'>Es util la propiedad UserControl.IsPostBack?</title><content type='html'>Todos conocemos la propiedad Page.IsPostBack. Gracias a ella hacemos que nuesro codigo sea mas eficiente, pero tambien existe otra propiedad, UserControl.IsPostBack. Esta propiedad nos indica si la carga de un UserControl ha sido provocada por un PostBack de cliente. Esto solo es util si tenemos el UserControl agregado a la pagina directamente, pero ¿que ocurre si queremos agregarlo de forma dinámica?. Pues que esta propiedad no nos sirve.&lt;br /&gt;&lt;br /&gt;En el proyecto en el que estoy trabajando tenemos UserControls para mostrar pequeños dialogos, que se cargan cuando el usuario pincha en un boton, o cambia el SelectedItem de un DropDownList...&lt;br /&gt;&lt;br /&gt;Dentro de esto UserControls necesitabamos saber si era la primera vez que se cargaban o era un PostBack, pero ni Page.IsPostBack ni UserControl.IsPostBack nos servian, ya que estas dos siempre eran true aunque fuera la primera vez que se cargaba el control, porque esta carga era provocada por un PostBack del cliente.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;La solucion.&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Despues de pensar en varias soluciones al final dimos con la que creo que es la mas correcta.&lt;br /&gt;&lt;br /&gt;Todos nuestros UserControl heredan de uno que extendimos nosotros del&lt;br /&gt;System.Web.UI.UserControl, pongamos por ejemplo UserControlBase. En este UserControlBase agregamos una propiedad de la siguiente forma.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;protected bool IsUserControlPostBack&lt;br /&gt;{&lt;br /&gt;    get&lt;br /&gt;    {&lt;br /&gt;        return this.ViewState["IsUserControlPostBack"] != null;&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Luego haremos lo siguiente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;protected override void OnLoad(System.EventArgs e)&lt;br /&gt;{&lt;br /&gt;    base.OnLoad (e);&lt;br /&gt;&lt;br /&gt;    if (!IsUserControlPostBack)&lt;br /&gt;    {&lt;br /&gt;        this.ViewState.Add("IsUserControlPostBack", true);&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Con esto conseguiremos que la primera vez que se ejecute nuestro Page_Load del user control, esta propiedad valga "false", y las posteriores veces valdra "true". El motivo de hacer primero el base.OnLoad (e); es porque asi disparamos la carga del UserControl antes de agregar al ViewState la propiedad, y asi conseguimos este efecto.&lt;br /&gt;&lt;br /&gt;La ventaja de usarlo asi es que al cerrar el UserControl automaticamente se elimina del ViewState, asi que podemos tener tantos UserControl como queramos y que todos hereden del UserControlBase sin que entren en conflicto. Otras soluciones como usar la Session tienen el peligro de que gestionemos mal las variables de Session y por despiste veamos alterado el comportamiento.&lt;br /&gt;&lt;br /&gt;Espero que os sea util.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14721572-112867736510177140?l=enadan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://enadan.blogspot.com/feeds/112867736510177140/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14721572&amp;postID=112867736510177140' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/112867736510177140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/112867736510177140'/><link rel='alternate' type='text/html' href='http://enadan.blogspot.com/2005/10/es-util-la-propiedad.html' title='Es util la propiedad UserControl.IsPostBack?'/><author><name>Enadan</name><uri>http://www.blogger.com/profile/06374237789845620209</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14721572.post-112867508021839647</id><published>2005-10-07T10:41:00.000+02:00</published><updated>2005-10-07T10:51:20.223+02:00</updated><title type='text'>Grupo de usuarios de .NET en Madrid</title><content type='html'>Recientemente se ha creado un grupo de usuarios de .NET en Madrid. Podeis daros de alta en la pagina &lt;a href="http://www.madriddotnet.net"&gt;www.madriddotnet.net&lt;/a&gt;. Os aseguro que merece la pena pertenecer a este grupo.&lt;br /&gt;&lt;br /&gt;Agradecer a &lt;a href="http://blogs.clearscreen.com/migs"&gt;Miguel Jiménez&lt;/a&gt; por haber tenido esta idea y no dejarla en el olvido, si no que ha sido capaz de sacarla a luz, y seguro que llegara a buen puerto.&lt;br /&gt;&lt;br /&gt;Os pongo una breve explicacion sacada de la pagina para que os hagais una idea.&lt;br /&gt;&lt;br /&gt;Madrid .NET User Group es un grupo independiente de usuarios de .NET y tecnologías adyacentes creado por desarrolladores para desarrolladores. Es un proyecto que pretende comunicar a los desarrolladores de Madrid, realizar eventos técnicos y de socialización para promover a los desarrolladores de nuestra comunidad.&lt;br /&gt;&lt;br /&gt;Pertenecer a MAD.NUG es completamente gratuito; y una vez formes parte del grupo puedes participar en todos los eventos, en la organización de nuevos eventos, proponer temas e incluso prepararlos y exponerlos tu mismo. La base de un grupo de usuarios es la de compartir el conocimiento entre sus miembros y por esto es necesaria tu colaboración.&lt;br /&gt;Este proyecto ha sido fruto de varios meses de esfuerzo e incubación, con el soporte de Ilitia Technologies, Microsoft Ibérica y Clearscreen.&lt;br /&gt;&lt;br /&gt;Si te gusta .NET y vives en Madrid no puedes dejar de apuntarte.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14721572-112867508021839647?l=enadan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://enadan.blogspot.com/feeds/112867508021839647/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14721572&amp;postID=112867508021839647' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/112867508021839647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/112867508021839647'/><link rel='alternate' type='text/html' href='http://enadan.blogspot.com/2005/10/grupo-de-usuarios-de-net-en-madrid.html' title='Grupo de usuarios de .NET en Madrid'/><author><name>Enadan</name><uri>http://www.blogger.com/profile/06374237789845620209</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14721572.post-112659844766667943</id><published>2005-09-13T09:51:00.000+02:00</published><updated>2005-09-13T10:03:00.850+02:00</updated><title type='text'>A DropDownList cannot have multiple items selected.</title><content type='html'>Bueno, como esto me trajo de cabeza una temporadita, he decidido escribir un poco al respecto.&lt;br /&gt;&lt;br /&gt;Existen unas cuantas clases que heredan de System.Web.UI.WebControls.ListControl, como por ejemplo el DropDownList y el ListBox. Las dos contienen ListItems, pero el ListBox puede tener mas de uno seleccionado, mientras que el DropDownList no.&lt;br /&gt;&lt;br /&gt;El problema trabajando con los DropDownList viene cuando modificamos la propidad Selected de los ListItem directamente, para cambiar el item seleccionado. Usando esta tecnica podemos llegar a obtener el mensaje del titulo con bastante frecuencia. Se pueden hacer muchas chapuzas para arreglarlo, como recorrerse la coleccion de ListItems e ir poniendo a todos la propiedad Selected a false antes de poner el que de verdad nos interesa a true, pero aun asi puede seguir fallando. El motivo es que el SelectedIndex no se refresca bien y si no coincide el SelectedIndex con el index del ListItem que tiene Selected a true, tambien nos fallara.&lt;br /&gt;&lt;br /&gt;La solucion, trabajar siempre con el SelectedIndex. Una vez que tenemos el ListItem que queremos seleccionar (hay muchas formas de conseguirlo, como por ejemplo con los metodos&lt;br /&gt;FindByText() y FindByValue()...), sacamos el index de este con DropDownList.Items.IndexOf(ListItem) y asignamos este valor a la propiedad SelectedIndex. Os aseguro que de esta forma nunca fallara.&lt;br /&gt;&lt;br /&gt;Espero que os sirva, yo lei muchos post en internet pero la mayoria eran chapuzillas, parches, pero no me convencio ninguno :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14721572-112659844766667943?l=enadan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://enadan.blogspot.com/feeds/112659844766667943/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14721572&amp;postID=112659844766667943' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/112659844766667943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/112659844766667943'/><link rel='alternate' type='text/html' href='http://enadan.blogspot.com/2005/09/dropdownlist-cannot-have-multiple.html' title='A DropDownList cannot have multiple items selected.'/><author><name>Enadan</name><uri>http://www.blogger.com/profile/06374237789845620209</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14721572.post-112254690693519276</id><published>2005-07-28T12:22:00.000+02:00</published><updated>2005-12-18T19:15:26.503+01:00</updated><title type='text'>My first blog... Comenzando</title><content type='html'>Hola a todos.&lt;br /&gt;&lt;br /&gt;No tenia muy claro si crear el blog en ingles o en español... pero al final me he decidido por hacerlo en español. Creo que hay muchos y muy buenos blogs en ingles, y que todo lo que tiene que ver con la informatica siempre es mejor si esta en ingles (algunas traducciones.... buff), pero bueno, por que no empezar a hacer cosas en español?!&lt;br /&gt;&lt;br /&gt;Este es mi primer blog asi que espero que no se me vaya de las manos y poder actualizarlo con contenidos utiles para toda la gente que desarrolle en .NET.&lt;br /&gt;&lt;br /&gt;Espero empezar pronto a escribir alguna cosilla o poner algun enlace o noticia interesante.&lt;br /&gt;&lt;br /&gt;Un saludo,&lt;br /&gt;Dani&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14721572-112254690693519276?l=enadan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://enadan.blogspot.com/feeds/112254690693519276/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14721572&amp;postID=112254690693519276' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/112254690693519276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14721572/posts/default/112254690693519276'/><link rel='alternate' type='text/html' href='http://enadan.blogspot.com/2005/07/my-first-blog-comenzando.html' title='My first blog... Comenzando'/><author><name>Enadan</name><uri>http://www.blogger.com/profile/06374237789845620209</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
