<?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:blogger='http://schemas.google.com/blogger/2008' 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-4932669040823648594</id><updated>2024-09-07T18:48:46.949-03:00</updated><category term="DataSet to treeview"/><category term="DataTable to treeview"/><category term="IE"/><category term="Roles asp.net"/><category term="SQLTableProfileProvider"/><category term="TreeNodeCollection"/><category term="TreeView filled"/><category term="actualizar datos ajax"/><category term="actualizar datos modalpopup"/><category term="actualizar datos usando modalpopupextender"/><category term="ajax"/><category term="ajax update data"/><category term="asp.net"/><category term="aspnet"/><category term="aspnet_Membership custom fields update"/><category term="aspnet_profile actualizacion"/><category term="browser mode"/><category term="custom profile provider asp.net"/><category term="customizar perfiles asp.net"/><category term="dataset filled treeview"/><category term="diferentes versiones de IE en el mismo equipo"/><category term="disparar onitemcommand en repeater con un checkbox"/><category term="ef linq metadata model"/><category term="entity framework get maxlenght metadata"/><category term="entity framework metadata validation"/><category term="fire onitemcommand repeater checkbox"/><category term="membership asp.net"/><category term="metadata ef"/><category term="metadata entity framework"/><category term="metadataworkspace ef"/><category term="metadataworkspace entity framework"/><category term="modalpopupextender"/><category term="modalpopupextender para actualizar datos"/><category term="modo de explorador"/><category term="multiple IE"/><category term="multiple internet explorer"/><category term="multiple versiones IE en la misma pc"/><category term="multiples IE PC"/><category term="perfil asp.net"/><category term="perfil personalizado asp.net"/><category term="perfiles personalizados asp.net"/><category term="populate treeview"/><category term="proveedor perfiles personalizado asp.net"/><category term="repeater itemcommand checkbox"/><category term="repeater onitemcommand checkbox"/><title type='text'>El rincón de ASP.net y AJAX</title><subtitle type='html'>Encuentra las soluciones a los problemas mas frecuentes usando ASP.net y AJAX</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://elrincondeaspnetyajax.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://elrincondeaspnetyajax.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Leandro Filipczyk</name><uri>http://www.blogger.com/profile/09725881425296069937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4932669040823648594.post-4268216252477728123</id><published>2011-06-05T13:47:00.010-03:00</published><updated>2011-06-05T14:47:37.618-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="disparar onitemcommand en repeater con un checkbox"/><category scheme="http://www.blogger.com/atom/ns#" term="fire onitemcommand repeater checkbox"/><category scheme="http://www.blogger.com/atom/ns#" term="repeater itemcommand checkbox"/><category scheme="http://www.blogger.com/atom/ns#" term="repeater onitemcommand checkbox"/><title type='text'>(Repeater - Checkbox - CommandName) ItemCommand en repeaters por parte de Checkboxes</title><content type='html'>En esta ocasión les traigo una &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_0&quot;&gt;solución&lt;/span&gt; a un problema con el que me &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_1&quot;&gt;encontré&lt;/span&gt; varias veces. Si alguna vez tuvieron que usar &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_2&quot;&gt;checkboxes&lt;/span&gt; que disparen el evento &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_3&quot;&gt;OnItemCommand&lt;/span&gt; en un &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_4&quot;&gt;repeater&lt;/span&gt;, se habrán dado cuenta de que, no importa lo que hagan, el evento NO  se dispara. Esto es por la forma en la que el &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_5&quot;&gt;radiobutton&lt;/span&gt; esta implementado (por alguna &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_6&quot;&gt;razón&lt;/span&gt; que desconozco, &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_7&quot;&gt;MS&lt;/span&gt; &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_8&quot;&gt;decidió&lt;/span&gt; de que, estos componentes usados dentro de un &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_9&quot;&gt;repeater&lt;/span&gt; no iban a comportarse como los &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_10&quot;&gt;linkbuttons&lt;/span&gt; o los &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_11&quot;&gt;buttons&lt;/span&gt; que todos queremos y estamos acostumbrados a usar).&lt;br /&gt;Navegando un poco me &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_12&quot;&gt;encontré&lt;/span&gt; con &lt;a href=&quot;http://www.frankwisniewski.net/how-to-make-a-checkbox-fire-the-itemcommand-event-of-a-repeater.aspx&quot;&gt;este &lt;/a&gt;articulo, que me &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_13&quot;&gt;permitio&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_14&quot;&gt;hechar&lt;/span&gt; un poco de luz al respecto (el &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_15&quot;&gt;código&lt;/span&gt; de &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_16&quot;&gt;ejempo&lt;/span&gt; SI esta en C#).&lt;br /&gt;Mientras que el &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_17&quot;&gt;botón&lt;/span&gt; y el &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_18&quot;&gt;linkbutton&lt;/span&gt;, cuentan con un &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_19&quot;&gt;metodo&lt;/span&gt; &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_20&quot;&gt;OnCommand&lt;/span&gt;&quot;, y una llamada a dicho &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_21&quot;&gt;método&lt;/span&gt;, dentro de su &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_22&quot;&gt;RaisePostbackEvent&lt;/span&gt;&quot; (con el &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_23&quot;&gt;CommandName&lt;/span&gt; y el &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_24&quot;&gt;CommandArgument&lt;/span&gt; como &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_25&quot;&gt;parametros&lt;/span&gt;), por alguna &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_26&quot;&gt;razon&lt;/span&gt;, el &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_27&quot;&gt;checkbox&lt;/span&gt; NO lo posee.&lt;br /&gt;Dicho &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_28&quot;&gt;Método&lt;/span&gt; (&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_29&quot;&gt;OnCommand&lt;/span&gt;&quot;), llama a &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_30&quot;&gt;RaiseBubbleEvent&lt;/span&gt;&quot;, el que permite proyectar los &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_31&quot;&gt;parámetros&lt;/span&gt; (&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_32&quot;&gt;CommandName&lt;/span&gt; y &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_33&quot;&gt;CommandArgument&lt;/span&gt;) a quien sea que este escuchando (en este caso nuestro &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_34&quot;&gt;repeater&lt;/span&gt;, que implementa el &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_35&quot;&gt;OnBubbleEvent&lt;/span&gt;&quot;). Como nuestros &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_36&quot;&gt;checkboxes&lt;/span&gt; NO implementan este &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_37&quot;&gt;OnCommand&lt;/span&gt;&quot;, nunca se dispara el &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_38&quot;&gt;RaiseBubbleEvent&lt;/span&gt;&quot;, con los &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_39&quot;&gt;CommandName&lt;/span&gt; y &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_40&quot;&gt;CommandArgument&lt;/span&gt; y nunca se llega al &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_41&quot;&gt;OnBubbleEvent&lt;/span&gt;&quot; del &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_42&quot;&gt;repeater&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Como &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_43&quot;&gt;solución&lt;/span&gt; a esto &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_44&quot;&gt;encontré&lt;/span&gt; una &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_45&quot;&gt;implementación&lt;/span&gt; &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_46&quot;&gt;custom&lt;/span&gt;&quot; de un &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_47&quot;&gt;checkbox&lt;/span&gt; que sobre escribe el &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_48&quot;&gt;OnCheckedChanged&lt;/span&gt;&quot; invocando al &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_49&quot;&gt;metodo&lt;/span&gt; &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_50&quot;&gt;RaiseBubbleEvent&lt;/span&gt;&quot; que necesitamos &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_51&quot;&gt;pasándole&lt;/span&gt; los valores que queremos (&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_52&quot;&gt;CommandName&lt;/span&gt; y &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_53&quot;&gt;CommandArgument&lt;/span&gt;):&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_54&quot;&gt;lt&lt;/span&gt;;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_55&quot;&gt;ToolboxData&lt;/span&gt;(&lt;span class=&quot;str&quot;&gt;&quot;&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_56&quot;&gt;lt&lt;/span&gt;;{0}:&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_57&quot;&gt;RadioButtonRepeaterAware&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_58&quot;&gt;runat&lt;/span&gt;=&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_59&quot;&gt;server&lt;/span&gt;&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_60&quot;&gt;gt&lt;/span&gt;;&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_61&quot;&gt;lt&lt;/span&gt;;/{0}:&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_62&quot;&gt;RadioButtonRepeaterAware&lt;/span&gt;&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_63&quot;&gt;gt&lt;/span&gt;;&quot;&lt;/span&gt;)&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_64&quot;&gt;gt&lt;/span&gt;; _&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_65&quot;&gt;Public&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_66&quot;&gt;Class&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_67&quot;&gt;RadioButtonRepeaterAware&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_68&quot;&gt;Inherits&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_69&quot;&gt;RadioButton&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_70&quot;&gt;Public&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_71&quot;&gt;Property&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_72&quot;&gt;CommandName&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;As&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_73&quot;&gt;String&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_74&quot;&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_75&quot;&gt;If&lt;/span&gt;&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;Me&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_76&quot;&gt;ViewState&lt;/span&gt;(&lt;span class=&quot;str&quot;&gt;&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_77&quot;&gt;CommandName&lt;/span&gt;&quot;&lt;/span&gt;) &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_78&quot;&gt;Is&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_79&quot;&gt;Nothing&lt;/span&gt;&lt;/span&gt;) &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_80&quot;&gt;Then&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;             &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_81&quot;&gt;Return&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_82&quot;&gt;String&lt;/span&gt;&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_83&quot;&gt;Empty&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_84&quot;&gt;Else&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;             &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_85&quot;&gt;Return&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;Me&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_86&quot;&gt;ViewState&lt;/span&gt;(&lt;span class=&quot;str&quot;&gt;&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_87&quot;&gt;CommandName&lt;/span&gt;&quot;&lt;/span&gt;).&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_88&quot;&gt;ToString&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_89&quot;&gt;End&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_90&quot;&gt;If&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_91&quot;&gt;End&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_92&quot;&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_93&quot;&gt;Set&lt;/span&gt;&lt;/span&gt;(&lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_94&quot;&gt;ByVal&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_95&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;As&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_96&quot;&gt;String&lt;/span&gt;&lt;/span&gt;)&lt;br /&gt;         &lt;span class=&quot;kwrd&quot;&gt;Me&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_97&quot;&gt;ViewState&lt;/span&gt;(&lt;span class=&quot;str&quot;&gt;&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_98&quot;&gt;CommandName&lt;/span&gt;&quot;&lt;/span&gt;) = &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_99&quot;&gt;value&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_100&quot;&gt;End&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_101&quot;&gt;Set&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_102&quot;&gt;End&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_103&quot;&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_104&quot;&gt;Public&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_105&quot;&gt;Property&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_106&quot;&gt;CommandArgument&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;As&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_107&quot;&gt;String&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_108&quot;&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_109&quot;&gt;If&lt;/span&gt;&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;Me&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_110&quot;&gt;ViewState&lt;/span&gt;(&lt;span class=&quot;str&quot;&gt;&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_111&quot;&gt;CommandArgument&lt;/span&gt;&quot;&lt;/span&gt;) &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_112&quot;&gt;Is&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_113&quot;&gt;Nothing&lt;/span&gt;&lt;/span&gt;) &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_114&quot;&gt;Then&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;             &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_115&quot;&gt;Return&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_116&quot;&gt;String&lt;/span&gt;&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_117&quot;&gt;Empty&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_118&quot;&gt;Else&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;             &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_119&quot;&gt;Return&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;Me&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_120&quot;&gt;ViewState&lt;/span&gt;(&lt;span class=&quot;str&quot;&gt;&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_121&quot;&gt;CommandArgument&lt;/span&gt;&quot;&lt;/span&gt;).&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_122&quot;&gt;ToString&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_123&quot;&gt;End&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_124&quot;&gt;If&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_125&quot;&gt;End&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_126&quot;&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_127&quot;&gt;Set&lt;/span&gt;&lt;/span&gt;(&lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_128&quot;&gt;ByVal&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_129&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;As&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_130&quot;&gt;String&lt;/span&gt;&lt;/span&gt;)&lt;br /&gt;         &lt;span class=&quot;kwrd&quot;&gt;Me&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_131&quot;&gt;ViewState&lt;/span&gt;(&lt;span class=&quot;str&quot;&gt;&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_132&quot;&gt;CommandArgument&lt;/span&gt;&quot;&lt;/span&gt;) = &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_133&quot;&gt;value&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_134&quot;&gt;End&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_135&quot;&gt;Set&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_136&quot;&gt;End&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_137&quot;&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_138&quot;&gt;Protected&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_139&quot;&gt;Overrides&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_140&quot;&gt;Sub&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_141&quot;&gt;OnCheckedChanged&lt;/span&gt;(&lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_142&quot;&gt;ByVal&lt;/span&gt;&lt;/span&gt; e &lt;span class=&quot;kwrd&quot;&gt;As&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_143&quot;&gt;System&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_144&quot;&gt;EventArgs&lt;/span&gt;)&lt;br /&gt;     &lt;span class=&quot;rem&quot;&gt;&#39;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_145&quot;&gt;create&lt;/span&gt; a &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_146&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_147&quot;&gt;event&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_148&quot;&gt;args&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_149&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_150&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_151&quot;&gt;command&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_152&quot;&gt;event&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_153&quot;&gt;args&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_154&quot;&gt;Dim&lt;/span&gt;&lt;/span&gt; ce = &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_155&quot;&gt;New&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_156&quot;&gt;CommandEventArgs&lt;/span&gt;(&lt;span class=&quot;kwrd&quot;&gt;Me&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_157&quot;&gt;CommandName&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;Me&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_158&quot;&gt;CommandArgument&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;     &lt;span class=&quot;rem&quot;&gt;&#39;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_159&quot;&gt;allow&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_160&quot;&gt;the&lt;/span&gt; base &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_161&quot;&gt;checkbox&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_162&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_163&quot;&gt;handle&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_164&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_165&quot;&gt;event&lt;/span&gt; as normal&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_166&quot;&gt;MyBase&lt;/span&gt;&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_167&quot;&gt;OnCheckedChanged&lt;/span&gt;(e)&lt;br /&gt;&lt;br /&gt;     &lt;span class=&quot;rem&quot;&gt;&#39;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_168&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_169&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_170&quot;&gt;contorls&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_171&quot;&gt;method&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_172&quot;&gt;RaiseBubbleEvent&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_173&quot;&gt;MyBase&lt;/span&gt;&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_174&quot;&gt;RaiseBubbleEvent&lt;/span&gt;(&lt;span class=&quot;kwrd&quot;&gt;Me&lt;/span&gt;, ce)&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_175&quot;&gt;End&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_176&quot;&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_177&quot;&gt;End&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_178&quot;&gt;Class&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;El &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_179&quot;&gt;codigo&lt;/span&gt; esta en &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_180&quot;&gt;VB&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_181&quot;&gt;net&lt;/span&gt; como para &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_182&quot;&gt;complementar&lt;/span&gt; el del ejemplo que esta en C#.&lt;br /&gt;Para poder usar este control en el &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_183&quot;&gt;markup&lt;/span&gt; de su &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_184&quot;&gt;aspx&lt;/span&gt; o &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_185&quot;&gt;ascx&lt;/span&gt;, simplemente tienen que registrar el &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_186&quot;&gt;assembly&lt;/span&gt; en el cual colocaron dicha clase:&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;asp&quot;&gt;&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_187&quot;&gt;lt&lt;/span&gt;;%@ &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_188&quot;&gt;Register&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_189&quot;&gt;Assembly&lt;/span&gt;=&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_190&quot;&gt;MyAssembly&lt;/span&gt;&quot; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_191&quot;&gt;Namespace&lt;/span&gt;=&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_192&quot;&gt;MyNamespace&lt;/span&gt;&quot; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_193&quot;&gt;TagPrefix&lt;/span&gt;=&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_194&quot;&gt;cc&lt;/span&gt;1&quot; %&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_195&quot;&gt;gt&lt;/span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_196&quot;&gt;lt&lt;/span&gt;;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_197&quot;&gt;cc&lt;/span&gt;1:&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_198&quot;&gt;RadioButtonRepeaterAware&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_199&quot;&gt;chkSelected&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_200&quot;&gt;AutoPostBack&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_201&quot;&gt;true&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_202&quot;&gt;CommandName&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_203&quot;&gt;Select&lt;/span&gt;&quot;&lt;/span&gt;&lt;br /&gt;                              &lt;span class=&quot;attr&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_204&quot;&gt;CommandArgument&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&#39;&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_205&quot;&gt;lt&lt;/span&gt;;%# DataBinder.Eval(Container.DataItem,&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_206&quot;&gt;CommandArgumentElementHere&lt;/span&gt;&quot;) %&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_207&quot;&gt;gt&lt;/span&gt;;&#39;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_208&quot;&gt;runat&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_209&quot;&gt;server&lt;/span&gt;&quot;&lt;/span&gt;&lt;br /&gt;                              &lt;span class=&quot;kwrd&quot;&gt;&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_210&quot;&gt;gt&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;                          &lt;span class=&quot;kwrd&quot;&gt;&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_211&quot;&gt;lt&lt;/span&gt;;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_212&quot;&gt;cc&lt;/span&gt;1:&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_213&quot;&gt;RadioButtonRepeaterAware&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_214&quot;&gt;gt&lt;/span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Espero les haya servido.&lt;br /&gt;P.D.: No lo &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_215&quot;&gt;probe&lt;/span&gt;, pero intuyo que esto &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_216&quot;&gt;también&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_217&quot;&gt;deberia&lt;/span&gt; poder aplicarse para los &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_218&quot;&gt;radiobuttons&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_219&quot;&gt;Happy&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_220&quot;&gt;Programming&lt;/span&gt;.</content><link rel='replies' type='application/atom+xml' href='http://elrincondeaspnetyajax.blogspot.com/feeds/4268216252477728123/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4932669040823648594/4268216252477728123' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/4268216252477728123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/4268216252477728123'/><link rel='alternate' type='text/html' href='http://elrincondeaspnetyajax.blogspot.com/2011/06/repeater-checkbox-commandname.html' title='(Repeater - Checkbox - CommandName) ItemCommand en repeaters por parte de Checkboxes'/><author><name>Leandro Filipczyk</name><uri>http://www.blogger.com/profile/09725881425296069937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4932669040823648594.post-3992307329793844073</id><published>2011-05-29T12:26:00.015-03:00</published><updated>2011-05-29T13:25:02.973-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ef linq metadata model"/><category scheme="http://www.blogger.com/atom/ns#" term="entity framework get maxlenght metadata"/><category scheme="http://www.blogger.com/atom/ns#" term="entity framework metadata validation"/><category scheme="http://www.blogger.com/atom/ns#" term="metadata ef"/><category scheme="http://www.blogger.com/atom/ns#" term="metadata entity framework"/><category scheme="http://www.blogger.com/atom/ns#" term="metadataworkspace ef"/><category scheme="http://www.blogger.com/atom/ns#" term="metadataworkspace entity framework"/><title type='text'>(Entity Framework Metadata) Usando metadata y LINQ para validación de campos</title><content type='html'>Hoy quería compartir con ustedes una solución practica que encontré para la valuación de campos server side. Se me presento una situación en la cual tenia que validar múltiples campos de un formulario server side, tanto en su cualidad de nullables, como en su longitud.&lt;br /&gt;Como realizar esta tarea es una de las cosas mas tediosas por las que uno como desarrollador, tiene que atravesar, busque la forma de hacerlo lo mas automatizado posible. Es así que me pregunte &quot;Tendré alguna manera de queryar la metadata del modelo, y usar eso para validar los campos??&quot;. Resulta de que es posible, usando  el &quot;MetadataWorkspace&quot; de EF (Hago la referencia obligada a la fuente principal de donde pude sacar la info que necesitaba &lt;a href=&quot;http://stackoverflow.com/questions/748939/field-max-length-in-entity-framework&quot;&gt;aqui&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Primero les voy a mostrar los métodos que uso para verificar si el campo es nullable, y cual es su maxlength, y luego el método de valuación en si mismo (pueden cuestionar el uso de Reflection como NO óptimo, pero la verdad que el degradado de performance no es perceptible en mi situación, ya que el lugar donde lo uso, no es un formulario de uso continuo e intensivo).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; GetMaxLength(EntityObject entity, &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; nomProperty  )&lt;br /&gt;     {&lt;br /&gt;         &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; result = 0;&lt;br /&gt;&lt;br /&gt;         var context = GetNewContext();&lt;br /&gt;&lt;br /&gt;             var queryResult = from meta &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; context.MetadataWorkspace.GetItems(DataSpace.CSpace)&lt;br /&gt;                                .Where(m =&amp;gt; m.BuiltInTypeKind == BuiltInTypeKind.EntityType)&lt;br /&gt;                               from p &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; (meta &lt;span class=&quot;kwrd&quot;&gt;as&lt;/span&gt; EntityType).Properties&lt;br /&gt;                                  .Where(p =&amp;gt; p.DeclaringType.Name == entite.GetType().Name&lt;br /&gt;                                      &amp;amp;&amp;amp; p.Name == nomProperty                                      &lt;br /&gt;                                      &amp;amp;&amp;amp; p.TypeUsage.EdmType.Name == &lt;span class=&quot;str&quot;&gt;&quot;String&quot;&lt;/span&gt;)&lt;br /&gt;                               select p.TypeUsage.Facets[&lt;span class=&quot;str&quot;&gt;&quot;MaxLength&quot;&lt;/span&gt;].Value;&lt;br /&gt;             &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (queryResult.Count() &amp;gt; 0)&lt;br /&gt;             {&lt;br /&gt;                 result = Convert.ToInt32(queryResult.First());&lt;br /&gt;             }&lt;br /&gt;      &lt;br /&gt;         &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; result;&lt;br /&gt;     }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;El método anterior me permite obtener la longitud máxima de un campo usando la metadata del modelo conceptual, paso a diseccionarlo para ustedes:&lt;br /&gt;&lt;br /&gt;Primero, le pido al modelo conceptual del &quot;MetadataWorkspace&quot; que me devuelva todas las entidades de tipo &quot;EntityType&quot; (puesto que podria pedir las AssociationsSet/Type, las RelationshipSet/Type, etc.):&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;pre class=&quot;csharpcode&quot;&gt;from meta &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; context.MetadataWorkspace.GetItems(DataSpace.CSpace)&lt;br /&gt;                               .Where(m =&amp;gt; m.BuiltInTypeKind == BuiltInTypeKind.EntityType)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Sobre este subset de metadata, me intereso en conseguir, ÚNICAMENTE la metadata de la property de la entidad en la cual estoy particularmente interesado, filtrando por:&lt;br /&gt;- El tipo de la entidad&lt;br /&gt;- El nombre de la property&lt;br /&gt;- El tipo de la property que deseo validar (esto es un filtro extra, ya que solo me interesaba validar properties del tipo &quot;String&quot;):&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;pre class=&quot;csharpcode&quot;&gt;from p &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; (meta &lt;span class=&quot;kwrd&quot;&gt;as&lt;/span&gt; EntityType).Properties&lt;br /&gt;                                 .Where(p =&amp;gt; p.DeclaringType.Name == entity.GetType().Name&lt;br /&gt;                                     &amp;amp;&amp;amp; p.Name == nomProperty&lt;br /&gt;                                     &amp;amp;&amp;amp; p.TypeUsage.EdmType.Name == &lt;span class=&quot;str&quot;&gt;&quot;String&quot;&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Una vez aislada la metadata de la property que solicite, solo me queda consultar la informacion en particular que necesito, en este caso &quot;MaxLength&quot;:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;select p.TypeUsage.Facets[&lt;span class=&quot;str&quot;&gt;&quot;MaxLength&quot;&lt;/span&gt;].Value;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;El resto es anecdotico, solo devolver el valor necesario casteado correctamente.&lt;br /&gt;&lt;br /&gt;Para comprobar si la property es nullable o no, el procedimiento es el mismo, unicamente varia la forma en la que se devuelve la data:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; IsNullable(EntityObject entity, &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; nomProperty)&lt;br /&gt;      {&lt;br /&gt;          var context = GetNewContext();&lt;br /&gt;          var queryResult = from meta &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; contexte.MetadataWorkspace.GetItems(DataSpace.CSpace)&lt;br /&gt;                                .Where(m =&amp;gt; m.BuiltInTypeKind == BuiltInTypeKind.EntityType)&lt;br /&gt;                            from p &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; (meta &lt;span class=&quot;kwrd&quot;&gt;as&lt;/span&gt; EntityType).Properties&lt;br /&gt;                               .Where(p =&amp;gt; p.DeclaringType.Name == entite.GetType().Name&lt;br /&gt;                                   &amp;amp;&amp;amp; p.Name == nomProperty&lt;br /&gt;                                   &amp;amp;&amp;amp; p.TypeUsage.EdmType.Name == &lt;span class=&quot;str&quot;&gt;&quot;String&quot;&lt;/span&gt;)&lt;br /&gt;                            select p;&lt;br /&gt;          &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (queryResult.Count() &amp;gt; 0)&lt;br /&gt;          {&lt;br /&gt;              &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; queryResult.First().Nullable;&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;          &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;      }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;Como ven, el procedimiento para seleccionar la metadata de la property que necesito es el mismo, y unicamente cambia la forma en la que devuelvo el resultado, devolviendo el valor de la property &quot;Nullable&quot; de la metadata.&lt;br /&gt;&lt;br /&gt;Con los metodos anteriores, facilmente pueden armar un método génerico de validación, que itere por cada una de las properties de un objeto dado, verifique cada una de las propiedades&lt;br /&gt;y devuelva los nombres de las propiedades que no cumplen con los requerimientos del modelo (y por ende no permitirán que se guarde dicha entidad):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; ValidateStringProperties(EntityObject entity, &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; emptyMessage, &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; overflowMessage, List&amp;lt;&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;&amp;gt; exclusions)&lt;br /&gt;       {&lt;br /&gt;           var sb = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; StringBuilder();&lt;br /&gt;&lt;br /&gt;           &lt;span class=&quot;kwrd&quot;&gt;foreach&lt;/span&gt; (PropertyInfo info &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; entity.GetType().GetProperties())&lt;br /&gt;           {&lt;br /&gt;               &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (info.PropertyType == &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(String) &amp;amp;&amp;amp; (exclusions == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt; || exclusions.Where(a =&amp;gt; a == info.Name).Count()==0))&lt;br /&gt;               {&lt;br /&gt;&lt;br /&gt;                   &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (!IsNullable(entity, info.Name) &amp;amp;&amp;amp; (entity.GetType().GetProperty(info.Name).GetValue(entity, &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;)==&lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt; || &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;.IsNullOrEmpty(entity.GetType().GetProperty(info.Name).GetValue(entity, &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;).ToString())))&lt;br /&gt;                   {&lt;br /&gt;                       sb.Append(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;.Format(emptyMessage, info.Name));&lt;br /&gt;                   }&lt;br /&gt;                   &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;&lt;br /&gt;                   {&lt;br /&gt;                       &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (GetMaxLength(entity, info.Name) &amp;lt; entity.GetType().GetProperty(info.Name).GetValue(entity, &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;).ToString().Length)&lt;br /&gt;                       {&lt;br /&gt;                           sb.Append(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;.Format(overflowMessage, info.Name));&lt;br /&gt;                       }&lt;br /&gt;                   }&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;      &lt;br /&gt;       &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; sb.ToString();&lt;br /&gt;       }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Como agregado, adicione una lista de nombre de propiedades que uno desea excluir de la verificación.&lt;br /&gt;&lt;br /&gt;Como dije antes, la performance de esta solución puede ser cuestionada, ya que uso reflection en múltiples lugares, es por eso que cada solución depende de la situación en la que se aplique.&lt;br /&gt;&lt;br /&gt;Happy Programming.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/3992307329793844073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/3992307329793844073'/><link rel='alternate' type='text/html' href='http://elrincondeaspnetyajax.blogspot.com/2011/05/entity-framework-validation-usando.html' title='(Entity Framework Metadata) Usando metadata y LINQ para validación de campos'/><author><name>Leandro Filipczyk</name><uri>http://www.blogger.com/profile/09725881425296069937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-4932669040823648594.post-6182127291999726464</id><published>2008-01-20T10:54:00.002-02:00</published><updated>2011-05-27T21:59:22.256-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="browser mode"/><category scheme="http://www.blogger.com/atom/ns#" term="diferentes versiones de IE en el mismo equipo"/><category scheme="http://www.blogger.com/atom/ns#" term="IE"/><category scheme="http://www.blogger.com/atom/ns#" term="modo de explorador"/><category scheme="http://www.blogger.com/atom/ns#" term="multiple IE"/><category scheme="http://www.blogger.com/atom/ns#" term="multiple internet explorer"/><category scheme="http://www.blogger.com/atom/ns#" term="multiple versiones IE en la misma pc"/><category scheme="http://www.blogger.com/atom/ns#" term="multiples IE PC"/><title type='text'>(Multiples IE) Como tener multiples versiones de IE en la misma PC</title><content type='html'>&lt;span style=&quot;font-style: italic;&quot;&gt;Edit&lt;/span&gt;: ya no es necesario el instalar 3rd party software para poder visualizar nuestro site localmente en diferentes versiones de IE. Basta con descargar la ultima version disponible de IE (version 9 al dia de la fecha), y usar las Web development Tools (presionando f12 apareceran en la parte inferior del browser).&lt;br /&gt;Con esta herramienta se puede simular las diferentes renderizaciones con cada engine (IE7-IE8-IE9) Basta con cambiar los &quot;Browser Mode&quot; o &quot;Modo de explorador&quot; a aquel con el cual deseemos testear.&lt;br /&gt;Tambien veran que cuenta con un set de herramientas muy similar al tan amado Firebug de Firefox (html inspector, JS script debugger, CSS edition, etc.)&lt;br /&gt;&lt;br /&gt;Despues de un largo tiempo ausente, vuelvo con muy buenas noticias para los desarrolladores web que se han estado martirizando continuamente con nuestro muy conocido (y altamente odiado) Internet Explorer. Todos sabemos que cuando realizamos alguna aplicación web, y debemos utilizar css, sea para centrar algun control de AJAX en la pantalla (un UpdateProgress por ejemplo) nos vemos ante el increible reto de intentar hacer que funcione en todos los browers posibles, pero, sabiendo que la mayoria de los usuarios son &quot;standart&quot; (o sea que NO van a esta usando FireFox u algun otro browser) sabemos que verán la página con IE (más probablemente con el IE 6). Se presenta entonces el reto de como hacer convivir varias versiones de IE en la misma PC. Una solución que encontre muy difundida es la virtualización, intalar una pc virtual, con un windows virtual y tener ahí una versión de IE que necesitemos; lo cual me parecio francamente no potable. Es de aquí que encontre una aplicación que nos permite instalar multiples versiones de IE (desde la 4.0 hasta la 6 si mal no recuerdo) sin demasiados problemas. Aquí les dejo el &lt;a href=&quot;http://tredosoft.com/Multiple_IE&quot;&gt;LINK &lt;/a&gt;para que se lo puedan bajar (lo subiria a mi ftp pero no esta online 24/7 asi que sería para problemas nada más)-&lt;br /&gt;Yo he utilzado esta app y me ha dado excelentes resultados (finalmente pude probar controles AJAX en múltiples IE a la vez).&lt;br /&gt;Como sugerencia tambien les agrego el &lt;a href=&quot;https://addons.mozilla.org/es-ES/firefox/addon/1419&quot;&gt;IE Tab&lt;/a&gt;, es un add-on de Mozilla que les permite ver como se vería una pagina en IE (utiliza la versión que tienen intalada en su PC, no aquellas que hayan &quot;agregado&quot; con este programita anterior) en un tab del browser del FireFox, bastante util para no tener que estar abriendo y cerrando ventanas continuamente.&lt;br /&gt;&lt;br /&gt;Bueno eso es todo por ahora y nos estaremos viendo, ojalá que pronto.&lt;br /&gt;&lt;br /&gt;Saludos y Happy Programming.</content><link rel='replies' type='application/atom+xml' href='http://elrincondeaspnetyajax.blogspot.com/feeds/6182127291999726464/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4932669040823648594/6182127291999726464' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/6182127291999726464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/6182127291999726464'/><link rel='alternate' type='text/html' href='http://elrincondeaspnetyajax.blogspot.com/2008/01/multiples-ie-como-tener-multiples.html' title='(Multiples IE) Como tener multiples versiones de IE en la misma PC'/><author><name>Leandro Filipczyk</name><uri>http://www.blogger.com/profile/09725881425296069937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4932669040823648594.post-7191584607591605478</id><published>2007-12-23T09:03:00.003-03:00</published><updated>2011-05-31T21:58:06.320-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dataset filled treeview"/><category scheme="http://www.blogger.com/atom/ns#" term="DataSet to treeview"/><category scheme="http://www.blogger.com/atom/ns#" term="DataTable to treeview"/><category scheme="http://www.blogger.com/atom/ns#" term="populate treeview"/><category scheme="http://www.blogger.com/atom/ns#" term="TreeNodeCollection"/><category scheme="http://www.blogger.com/atom/ns#" term="TreeView filled"/><title type='text'>(Treeview - DataTable) Como cargar data en un Treeview desde una DataTable</title><content type='html'>Hola a todos nuevamente, lo prometido es deuda así que me estoy haciendo un tiempito para poder ampliar un poco más mi blog, estuve bastante complicado estos últimos meses, y es por eso por lo que no me han visto hacer nuevas entradas, ademas del hecho de que he estado trabajando más que nada con DotNetNuke y no estoy teniendo nuevas experiencias en ASP puro. En fin.. vayamos a lo nuestro.&lt;br /&gt;Lo que les voy a dar ahora es una sencilla función que les permitirá mostrar datos a partir de un DataTable en un TreeView; la razón de este post es que recorrí muuuuuchas páginas buscando una solución sencilla a un dilema sencillo, pero fuí incapaz de encontrar una, asi que decidí hacer la propia. Cabe aclarar que esta solución corresponde a un arbol de solo 2 niveles (En su momento no necesité mas, pero no debería ser demasiado dificil extenderlo), y en mi caso, los nodos padres no son seleccionables, es decir, de ser clickados, no causarán un postback.&lt;br /&gt;Aca les dejo el codigo:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; PopulateNodes(DataTable dt, TreeNodeCollection tree)&lt;br /&gt;  {&lt;br /&gt;      &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; backup = &lt;span class=&quot;str&quot;&gt;&quot; &quot;&lt;/span&gt;;&lt;br /&gt;      &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; counter = dt.Rows.Count;&lt;br /&gt;      &lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt;= dt.Rows.Count - 1; i++)&lt;br /&gt;      {&lt;br /&gt;          TreeNode tn = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TreeNode();&lt;br /&gt;          tn.Text = dt.Rows[i].ItemArray[0].ToString();&lt;br /&gt;          tn.Value = &lt;span class=&quot;str&quot;&gt;&quot;Root&quot;&lt;/span&gt;;&lt;br /&gt;          tn.SelectAction = TreeNodeSelectAction.None;&lt;br /&gt;          tree.Add(tn);&lt;br /&gt;          backup = dt.Rows[i].ItemArray[0].ToString();&lt;br /&gt;&lt;br /&gt;          &lt;span class=&quot;kwrd&quot;&gt;while&lt;/span&gt; ((i &amp;lt; counter) &amp;amp;&amp;amp; (dt.Rows[i].ItemArray[0].ToString() == backup))&lt;br /&gt;          {&lt;br /&gt;              TreeNode child = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TreeNode();&lt;br /&gt;              child.Text = dt.Rows[i].ItemArray[3].ToString();&lt;br /&gt;              child.Value = dt.Rows[i].ItemArray[1].ToString();&lt;br /&gt;              tn.ChildNodes.Add(child);&lt;br /&gt;              i++;&lt;br /&gt;          }&lt;br /&gt;          i--;&lt;span class=&quot;rem&quot;&gt;//debido a que en el for lo primero que se hace luego del while es volver a incrementar   &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;  }&lt;/pre&gt;&lt;/div&gt;En realidad el código como que se explica solo, pero les voy a comentar un poco como funciona:&lt;br /&gt;Con el For, lo que hago recorrer la totalidad del DataTable, y lo que puede ser dificil de entender es que tengo dos loops dentro de uno, tanto con el For, como con el While recorro el mismo DataTable, utilizando EL MISMO INDICE, y esta es la parte mas complicada. Lo demás es sencillo, primero creo 2 variables, una va a tener la cantidad de rows, otra va a contener una copia del nodo padre que estoy tratando. Dentro del for, creo un nodo, le asigno el valor correspondiente desde el DataTable, me aseguro de que los nodos padres(&quot;tn&quot;) no sean seleccionables (Optativo), luego agrego ese nodo al arbol corresponiente (TreeView), y guardo una copia de su contenido en &quot;backup&quot;.&lt;br /&gt;Ahora entro en el while, y cargo todos los nodos hijos(&quot;child&quot;) correspondientes a ese nodo padre, de manera similar a la anterior, creo el nodo, le asigno su valor correspondiente, y luego lo pongo como nodo hijo (ChildNode) de &quot;tn&quot;. Fuera del while, solo resta incrementar el contador.&lt;br /&gt;Aclaracion, la ultima linea (i--) está porque, debido a la combinacion que hice de for y while, necesariamente al finalizar el ultimo loop del while, se incrementaba el contador &quot;i&quot;, y luego de eso, el for volvia a realizar el incremento, intentando hacer referencia a un valor inexistente.&lt;br /&gt;Respecto a los &quot;values&quot; de cada nodo, es medio que optativo (si mal no recuerdo) el ponerles un valor o no, pero (si mal no recuerdo) era una manera de identificar a cada tipo de nodo, de una forma u otra, les dejo a ustedes la tarea de investigarlo.&lt;br /&gt;La forma de llamar a esta funcion es sencilla, simplemente agreguen el control TreeView correspondiente a la pagina, llenen el DataTable con la info que necesiten tratar, y listo, están hechos.&lt;br /&gt;Otra aclaración, mucha gente probablemente llegue aqui buscando formas de usar un Dataset, en lugar de un DataTable, y un gran porcentaje de ellos, solo tendrá una tabla única en el DataSet. Acostúmbrense a usar solo lo que necesitan, no más ni menos. El DataSet es una estructura que puede contener varias tablas, no solamente una. Si solo tienen una, usen un DataTable.&lt;br /&gt;Bueno, me voy desipiendo por ahora, ya saben que cualquier consulta/critica constructiva, siempre es bienvenida. Hasta pronto.&lt;br /&gt;&lt;br /&gt;Saludos y Happy Programming</content><link rel='replies' type='application/atom+xml' href='http://elrincondeaspnetyajax.blogspot.com/feeds/7191584607591605478/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4932669040823648594/7191584607591605478' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/7191584607591605478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/7191584607591605478'/><link rel='alternate' type='text/html' href='http://elrincondeaspnetyajax.blogspot.com/2007/12/como-usar-un-datatable-para-mostrar.html' title='(Treeview - DataTable) Como cargar data en un Treeview desde una DataTable'/><author><name>Leandro Filipczyk</name><uri>http://www.blogger.com/profile/09725881425296069937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4932669040823648594.post-7674413594136067381</id><published>2007-10-28T10:26:00.003-03:00</published><updated>2011-05-28T14:01:38.695-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="custom profile provider asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="customizar perfiles asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="perfil personalizado asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="perfiles personalizados asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="proveedor perfiles personalizado asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="SQLTableProfileProvider"/><title type='text'>(SQLTableProfileProvider) Uso de un proveedor de perfiles personalizado</title><content type='html'>&lt;p&gt;Todos sabemos lo fácil de implementar que son los controles en ASP.Net, y en parte es eso lo que mas nos atrae(hasta cierto punto), con la promesa de comenzar a producir de manera casi inmediata, con una mínima inversión de tiempo en aprendizaje; desgraciadamente, no siempre se puede adecuar a las necesidades particulares de todos.&lt;/p&gt;  &lt;p&gt;Es así como es muy común verse en la necesidad de &quot;ampliarlos&quot; o &quot;extenderlos&quot; para que se ajusten a nuestras necesidades, y sobre eso voy a hablar en las próximas lineas.&lt;/p&gt;  &lt;p&gt;Como base en la creacion de sitios u aplicaciones web, es indispensable(generalmente) mantener un registro de usuarios y limitar su acceso al sitio en relación a sus credenciales, y en esto ASP.net nos facilita la vida mediante el uso de roles y membresías.&lt;/p&gt;&lt;p&gt; Por otra parte, muchas veces nos encontramos con la necesidad de almacenar datos de usuarios diferentes a aquellos que vienen por defecto en el control CreateUserWizard de ASP.net. La solución? extenderlo para que se adecue a nuestras necesidades.&lt;/p&gt;  &lt;p&gt;Antes de embarcarnos en como alterar nuestra configuración para poder almacenar datos adicionales a los más comunes y ya incluidos por defecto(nombre,pass,mail,pregunta y respuesta secreta) es imperativo que veamos que tipo de tratamiento vamos a necesitar aplicar sobre ellos.&lt;/p&gt;  &lt;p&gt;El proveedor de perfiles que ASP.net posee por defecto es fácilmente ampliable, solo con un par de líneas de código en el web.config y un par más en el code behind tenemos un proveedor de perfiles que puede almacenar toda la información que queramos. El problema con esto es la manera en la que se almacena dicha información en la base de datos, y si luego necesitamos hacer una consulta a la tabla aspnet_profiles nos daremos contra una verdadera pared.&lt;/p&gt;  &lt;p&gt;El proveedor guarda la información de perfil de la siguiente manera:&lt;/p&gt;  &lt;table border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot; width=&quot;400&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;Field Name&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;Values&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;code&gt;PropertyNames&lt;/code&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;FirstName:S:0:6:LastName:S:7:6:&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;code&gt;PropertyValuesString&lt;/code&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;Andrew Rimmer&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;code&gt;PropertyValuesBool&lt;/code&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;Null&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Donde, PropertyNames son los nombres de las &quot;propiedades&quot; o información extra que estamos agregando, PropertyValuesString almacena los valores de los strings y PropertyValuesBool los valores booleanos de la propiedad. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;En PropertyNames, tengo el valor del primer campo &quot;FirstName&quot;, seguido por el tipo &quot;S&quot; de String(Andrew es un string), cuyo valor inicia en la posición 0 y va hasta la 6(Andrew tiene 6 caracteres), seguido por LastName que se analiza de manera análoga. En la columna PropertyvaluesString se almacena el valor propiamente dicho de los strings (Andrew para FirstName), y en la PropertyValuesBool se almacena el valor de las propiedades booleanas si las tuviera. Si esto en un embrollo con solo 2 campos adicionales agregados, imagínense lo que sería si necesitamos guardar 10.&lt;/p&gt;  &lt;p&gt;Por lo anterior, o hacemos un complejo tratamiento de strings para obtener la información, o implementamos nuestro propio proveedor de perfiles.&lt;/p&gt;  &lt;p&gt;A continuación voy a mostrarles como hacer ambas cosas, por un lado voy a extender el proveedor de perfiles que ya viene con ASP.net, y luego voy a mostrarles como implementar uno propio, que almacena los valores de las propiedades en una tabla personalizada que nosotros mismos creamos y cuya disposición determinamos nosotros.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h3&gt;Extensión del Proveedor de datos por defecto de ASP.net:&lt;/h3&gt;  &lt;p&gt;Primero modificamos nuestro web.config de la siguiente manera:&lt;br /&gt;&lt;/p&gt;Dentro de la declaración de profile, y luego de el cierre del tag providers, agregamos properties y procedemos a añadir allí cada uno de los campos de información extra que necesitamos de acuerdo a nuestras necesidades:&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;profile&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;defaultProvider&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;SqlProvider&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;clear&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;SqlProvider&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;System.Web.Profile.SqlProfileProvider&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;connectionStringName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;SqlServices&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;applicationName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;MiAplicacion&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;SqlProfileProvider&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;properties&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Firstname&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Lastname&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;properties&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt; Una vez hecho esto agregamos un poco de codigo en el Code behind:&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; CreateUserWizard1_CreatedUser(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;ProfileCommon p = (ProfileCommon)ProfileCommon.Create(CreateUserWizard1.UserName, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;p.Firstname = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl(&lt;span class=&quot;str&quot;&gt;&quot;Firstname&quot;&lt;/span&gt;)).Text;&lt;br /&gt;p.Lastname = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl(&lt;span class=&quot;str&quot;&gt;&quot;Lastname&quot;&lt;/span&gt;)).Text;&lt;br /&gt;p.Save();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Dentro del evento created User del CreateUserWizard creamos un profileCommon p, el cual ya tendrá las propiedades agregadas al webconfig, por lo que lo único que debemos hacer es localizar aquellos controles que agregamos a nuestro CreateUserWizard (en este caso textboxes) y asignar los valores correspondientes. Luego de esto doy la indicación de que el perfil se salve, y &lt;em&gt;voila &lt;/em&gt;tengo almacenada información extra sobre mi usuario.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h3&gt;Implementación de un proveedor de perfiles personalizado:&lt;/h3&gt;  &lt;p&gt;Existe un trabajo por parte de un mienbro del ASP.net team de microsoft que nos permite implementar un proveedor personalizado de perfiles (&lt;a href=&quot;http://asp.net/downloads/sandbox/table-profile-provider-samples/&quot;&gt;AQUI &lt;/a&gt;podrán descargar los archivos necesarios así como los papers para ver como instalarlo).&lt;/p&gt;  &lt;p&gt;Este hombrecito nos provee de 2 proveedores el SQLTableProfileProvider y el SQLStoreProcedureProfileProvider. Para nuestros fines utilizaremos el primero (sientanse libres de explorar sobre el segundo) que básicamente me permite almacenar los datos del perfil en una tabla creada personalmente, con la disposición de campos que desee, con la única condición necesaria de incluir UserID y LastUpdatedDate, necesarios para la gestión interna de ASP.net.&lt;/p&gt;  &lt;p&gt;OK, lo primero que hacemos es crear la tabla en la base de datos, la cual podemos llamar como queramos, en nuestro ejemplo se llamará &quot;Perfil&quot;, recuerden colocar los permisos de la tabla de manera correcta&lt;/p&gt;  &lt;p&gt;grant SELECT,INSERT,UPDATE,DELETE on dbo.Perfil to [SuNombreDeMaquina\ASPNET]&lt;/p&gt;  &lt;p&gt;go&lt;/p&gt;  &lt;p&gt;Como el &lt;i&gt;SqlTableProfileProvider&lt;/i&gt; accede a la tabla directamente, deben asegurarse de permitir los derechos de SELECT, INSERT, UPDATE y DELETE a la cuenta correspondiente del web server. En el ejemplo se usa la cuenta ASPNET puesto que es ésta la cuenta de procesos ASP.net en una PC con Windows XP. Con seguridad integrada se utiliza el proceso identity para acceder a la Base de Datos. Si estan usando Windows Server 2003 e IIS6 entonces NETWORK SERVICE es la cuenta a utilizar. Finalmente si solo usan seguridad standar SQL, deben conceder los derechos a la cuenta de usuario SQL correspondiente.&lt;/p&gt;  &lt;p&gt;La última parte de configuración a nivel de Base de datos es la de conceder derechos a algunos procedimientos almacenados de ASP.net que son automticamente instalados en su BD cuando se instalan los esquemas para Membresias, Roles, etc.&lt;/p&gt;  &lt;p&gt;grant EXECUTE on dbo.aspnet_Applications_CreateApplication to [YOURMACHINENAME\ASPNET]&lt;/p&gt;  &lt;p&gt;grant EXECUTE on dbo.aspnet_Users_CreateUser to [YOURMACHINENAME\ASPNET]&lt;/p&gt;  &lt;p&gt;grant SELECT on dbo.aspnet_Users to [YOURMACHINENAME\ASPNET]&lt;/p&gt;  &lt;p&gt;grant UPDATE on dbo.aspnet_Users(LastActivityDate) to [YOURMACHINENAME\ASPNET]&lt;/p&gt;  &lt;p&gt;go&lt;/p&gt;  &lt;p&gt;De igual manera a lo anterior tambien deberan conceder los derechos de los procedimientos almacenados a la cuenta correspondiente.&lt;/p&gt;  &lt;p&gt;Una vez hecho lo anterior procedemos a modificar nuestro web.config de la siguiente manera:&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Es imperativo tener la connectionstring en el web.config para que esto funcione.&lt;/p&gt;  &lt;p&gt;cada linea agregada al web.config es &quot;self explanatory&quot;:&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;profile&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;defaultProvider&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;TableProfileProvider&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;clear&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;TableProfileProvider&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Microsoft.Samples.SqlTableProfileProvider&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;connectionStringName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ConnectionString&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Perfil&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;applicationName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;MiAplicacion&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;properties&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Firstname&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;defaultValue&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;[null]&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;customProviderData&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Firstname;varchar&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;TableProfileProvider&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Lastname&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;defaultValue&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;[null]&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;customProviderData&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Lastname;varchar&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;TableProfileProvider&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;properties&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt; /clear para indicar que no quiero usar el proveedor por defecto(almacenado en el machine.config) y que voy a definir el propio.  &lt;p&gt;add para indicar que voy a agregar un proveedor, name y type son entendibles, luego el nombre de el connectionstring.&lt;/p&gt;  &lt;p&gt;Y aqui la informacion clave: table=&quot;Perfil&quot; aquí coloco el nombre de la tabla en la que deseo guardar la informacion adicional, applicationName=&quot;NombreDeMiAplicacion&quot;(indispensable haberlo definido previamente, para mayores referencias lean mi post anterior).&lt;/p&gt;  &lt;p&gt;Una vez definido todo esto, lo único que me resta es definir las properties de una manera similar a la que especifique anteriormente, observen que no solo coloco el nombre de la propiedad, sino tambien el campo de la Base de Datos a la que este se va a bindear.&lt;/p&gt;Otra cosa que deberan hacer es bajarse el instalador del proveedor y compilar los SqlStoredProcedureProfileProvider.cs y SqlTableProfileProvider.cs que se encuentran en (por defecto) C:\Archivos de programa\Microsoft\ASP.NET 2.0 Table Profile Provider Samples\App_Code\, utilizen el Command Prompt del vs para hacerlo; una vez hecho esto(ver AVISO abajo) agregamos la dll al directorio bin/ de nuestra aplicación, y estamos listos para usarlo.  &lt;p&gt;AVISO: Hay un pequeño inconveniente a solucionar cuando quieran hacer la compilación, en el caso del SQLStoreProcedure se va a compilar perfectamente, pero el SQLTable no, les dará un error como&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&quot;SqlTableProfileProvider.cs(75,36): error CS0103: The name &#39;SqlStoredProcedureProfileProvider&#39; does not exist in the current context&lt;br /&gt;SqlTableProfileProvider.cs(82,28): error CS0103: The name &#39;SqlStoredProcedureProfileProvider&#39; does not exist in the current context&quot;&lt;/p&gt;&lt;p&gt;Para solucionar esto lo que YO hice es agregar el codigo del SQLStoredProcedureProfileProvider AL INICIO del SQLTableProfileProvider, guardarlo, y luego compilarlo.&lt;/p&gt;&lt;p&gt;Realmente el uso de esta última opción nos presenta innumerables ventajas a la hora de intentar &quot;editar&quot; usuarios mediante nuestras aplicaciones en ASP.net, hasta ahora es la única forma en la que he logrado implementar la opción de &quot;editar perfiles&quot; desde dentro de la aplicación web propiamente dicha(desconozco si existe alguna manera más &quot;facil&quot;, estuve buscando por un tiempo y no pude encontrar nada).&lt;/p&gt;&lt;p&gt;Como siempre el feedback está mas que agradecido, si descubren algun error(soy humano y los cometo) sientase libres de comunicármelo, cualquier crítica(siempre constructiva) será mas que bien recibida por mi parte.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Bueno, eso es todo por ahora, espero que les sirva de algo(a mi mismo me hizo recapacitar sobre ciertas cosillas que debo reveer y comunicar a mi Jefe :P).&lt;/p&gt;&lt;p&gt;Saludos y Happy Programming my little fellows.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Leandro&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://elrincondeaspnetyajax.blogspot.com/feeds/7674413594136067381/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4932669040823648594/7674413594136067381' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/7674413594136067381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/7674413594136067381'/><link rel='alternate' type='text/html' href='http://elrincondeaspnetyajax.blogspot.com/2007/10/uso-de-un-proveedor-de-perfiles.html' title='(SQLTableProfileProvider) Uso de un proveedor de perfiles personalizado'/><author><name>Leandro Filipczyk</name><uri>http://www.blogger.com/profile/09725881425296069937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4932669040823648594.post-7720474892724724279</id><published>2007-10-21T20:28:00.005-03:00</published><updated>2011-05-31T13:13:51.900-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="aspnet_Membership custom fields update"/><category scheme="http://www.blogger.com/atom/ns#" term="aspnet_profile actualizacion"/><category scheme="http://www.blogger.com/atom/ns#" term="membership asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="perfil asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="Roles asp.net"/><title type='text'>(Membership - ApplicationID) Actualizacion de usuarios y ApplicationID</title><content type='html'>&lt;p&gt;Como probablemente ya saben, asp.net cuenta con un sistema de perfiles y roles bastante completo y sencillo de utilizar en el 97% de los casos, ( les dejo &lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2006/05/07/ASP.NET-2.0-Membership-and-Roles-Tutorial-Series.aspx&quot;&gt;AQUI&lt;/a&gt; un link que encontre muy util para entender el sistema de roles y membresias de asp.net). Sin embargo uno puede llegar a encontrarse con algunos problemas cuando decide salir de ese esquema pre establecido y ajustar las soluciones de acuerdo a sus necesidades.&lt;/p&gt;&lt;p&gt;Me encontre en un aprieto recientemente mientras desarrollaba una aplicacion en asp.net, a la hora de realizar un ABM de usuarios que utilizaran la pagina web; pues si bien asp.net es muy flexible y sencillo a la hora de implementar funcionalidades tipicas; es necesario hilar fino en algunas cosas para que todo funcione correctamente, y hay informacion que no siempre esta a mano para advertirnos de comportamientos con los que nos encontramos que son más que peculiares.&lt;/p&gt;  &lt;p&gt;El problema me llego cuando quise implementar un update (y delete )de usuarios registrados. Como sabran, asp.net maneja la creacion de usuarios de manera completamente transparente. Uno simplemente agrega un control de registro de usuarios, y ASP.net se encarga de todo lo demás. El problema con esto, es que uno tiende a pensar que todo esta solucionado automaticamente, y se enfoca en otras cuestiones, ignorando entonces parte del funcioanmiento escencial que se mueve detrás de las bambalinas en el sitio que UNO mismo está construyendo.&lt;/p&gt;  &lt;p&gt;Como decia, el problema se me sucito cuando quise hacer un update de usuarios registrados(la unica funcionalidad de &quot;update&quot; que vi en asp.net por defecto fue la de cambiar la contraseña, mientras que si uno desea realmente personalizar su sitio y tener la posibilidad de cambiar UserNames, preguntas secretas, direccion de mail y demas, es necesario hacerlo a &quot;mano&quot;). Entonces mediante Membership.GetUser(Username).ProviderUserKey es posible conseguir el GUID UserID para el usuario &quot;Username&quot;; con esto en mano era cuestion de, mediante SQL, realizar las consultas necesarias a la BD y realizar las modificaciones pertinentes, en las tablas pertinentes (aspnet_Membership, aspnet_Users, aspnet_profile(uso un proveedor de perfiles personalizado que voy a explicar en otro momento)).&lt;/p&gt;  &lt;p&gt;A todo esto yo ya habia leido el post &lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2006/04/22/Always-set-the-_2200_applicationName_2200_-property-when-configuring-ASP.NET-2.0-Membership-and-other-Providers.aspx&quot;&gt;AQUI&lt;/a&gt; sobre la importancia de definir el nombre de la aplicacion a la hora de realizar un proyecto que va a ser implementado en un servidor remoto,o en una carpeta diferente a aquella en la que fue desarrollado, por lo que me asegure de hacerlo en el web.config.&lt;/p&gt;  &lt;p&gt;Sucede que, a la hora de realizar la logica SQL necesaria para actualizar cada uno de los campos que deseaba en las tablas, me encontre con un UserID en la tabla de membresias, diferente a aquel en la de perfiles, y dos entradas por cada usuario en la tabla aspnet_Users, una para cada uno de los dos UserId anteriores, cada una con un &lt;strong&gt;ApplicationID&lt;/strong&gt; diferente; y al ir a ver la tabla aspnet_Applications, me encontre con 2 aplicaciones: siendo una la &quot;/&quot;, y la otra aquella con el nombre que yo habia definido, la razon?, la siguiente:&lt;/p&gt;  &lt;p&gt;No alcanza con cambiar el nombre de la aplicacion en el web.config unicamente, es NECESARIO redefinir en el web.config cada uno de los proveedores que voy a utilizar (para membresia, roles y perfil) con el ApplicationName correspondiente; de otra forma, se utiliza la configuracion definida en el machine.config, en la que, por defecto, el applicationId es &quot;/&quot;.&lt;/p&gt;  &lt;p&gt;Las modificaciones al web.config, deberian ser algo como esto:&lt;/p&gt;&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;system.web&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;membership&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;--proveedor&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;para&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;membresia--&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;AspNetSqlMembershipProvider&quot;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;System.Web.Security.SqlMembershipProvider, System.Web,&lt;br /&gt;    Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&quot;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;attr&quot;&gt;connectionStringName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;LocalSqlServer&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;enablePasswordRetrieval&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;false&quot;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;attr&quot;&gt;enablePasswordReset&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;true&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;requiresQuestionAndAnswer&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;true&quot;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;attr&quot;&gt;applicationName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;/MiAplicacionNombre&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;requiresUniqueEmail&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;false&quot;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;attr&quot;&gt;passwordFormat&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Hashed&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;maxInvalidPasswordAttempts&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;5&quot;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;attr&quot;&gt;minRequiredPasswordLength&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;7&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;minRequiredNonalphanumericCharacters&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;1&quot;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;attr&quot;&gt;passwordAttemptWindow&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;10&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;passwordStrengthRegularExpression&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;membership&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;profile&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;defaultProvider&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;TableProfileProvider&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;--proveedor&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;para&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;perfil--&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;TableProfileProvider&quot;&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Microsoft.Samples.SqlTableProfileProvider&quot;&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;attr&quot;&gt;connectionStringName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;LocalSQLServer&quot;&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;attr&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Perfil&quot;&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;attr&quot;&gt;applicationName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;/MiAplicacionNombre&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;roleManager&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;--proveedor&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;para&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;rol--&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;AspNetSqlRoleProvider&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;connectionStringName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;LocalSqlServer&quot;&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;attr&quot;&gt;applicationName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;/MiAplicacionNombre&quot;&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0,&lt;br /&gt;   Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;AspNetWindowsTokenRoleProvider&quot;&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;attr&quot;&gt;applicationName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;/MiAplicacionNombre&quot;&lt;/span&gt;&lt;br /&gt;   &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;System.Web.Security.WindowsTokenRoleProvider, System.Web,&lt;br /&gt;   Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;roleManager&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;system.web&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt; &lt;/p&gt;  &lt;p&gt;Cabe aclarar que mi proveedor de perfil es diferente al que viene por defecto para asp.net, esto es debido a que aquel por defecto tiene una manera de almacenar los datos que los vuelve practicamente &quot;inqueryables&quot;, puesto que deberiamos hacer un tratamiento bastante complejo de manejo de strings para poder recuperar los datos(prometo un detalle de esto en mi proximo post durante la semana que viene).&lt;/p&gt;  &lt;p&gt;Pero todo lo demas deberia ser bastante similar en el caso generico.&lt;/p&gt;  &lt;p&gt;Espero que esto les ayude a solucionar este inconveniente a todos aquellos que lo estén padeciendo, de igual forma que lo padeciera yo en su momento.&lt;/p&gt;  &lt;p&gt;Saludos a todos y happy programming.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Leandro&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://elrincondeaspnetyajax.blogspot.com/feeds/7720474892724724279/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4932669040823648594/7720474892724724279' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/7720474892724724279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/7720474892724724279'/><link rel='alternate' type='text/html' href='http://elrincondeaspnetyajax.blogspot.com/2007/10/aspnet-roles-membresias-y-entradas.html' title='(Membership - ApplicationID) Actualizacion de usuarios y ApplicationID'/><author><name>Leandro Filipczyk</name><uri>http://www.blogger.com/profile/09725881425296069937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4932669040823648594.post-4569057672705177718</id><published>2007-10-15T08:56:00.004-03:00</published><updated>2011-05-28T14:06:16.122-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="actualizar datos ajax"/><category scheme="http://www.blogger.com/atom/ns#" term="actualizar datos modalpopup"/><category scheme="http://www.blogger.com/atom/ns#" term="actualizar datos usando modalpopupextender"/><category scheme="http://www.blogger.com/atom/ns#" term="ajax update data"/><category scheme="http://www.blogger.com/atom/ns#" term="modalpopupextender"/><category scheme="http://www.blogger.com/atom/ns#" term="modalpopupextender para actualizar datos"/><title type='text'>(ModalPopup)Uso de un Modal Popup para mostrar y actualizar el contenido de un gridview</title><content type='html'>Se me presento un problema recientemente a la hora de utilizar el control modal popup extender para contener algo diferente de un label que cambie de texto; resulto que, pese a lo que habia escuchado a través de las introducciones y propagandas, los&lt;br /&gt;controles AJAX no eran tan sencillos como me habian prometido.&lt;br /&gt;Sucede que este control, (y no solamente este del toolkit de ajax) utiliza webservices, y para poder llegar a sacarles el jugo completamente es necesario tener tambien varios conocimientos de javascript (conocimientos de los cuales en su momento no disponia). Pero, siendo que en la red no encontre otro ejemplo que se ajustara mejor a mis necesidades me puse manos a la obra con el que encontre &lt;a href=&quot;http://www.aspdotnetcodes.com/Ajax_ModalPopup_PostBack_GridView.aspx&quot;&gt;AQUI&lt;/a&gt;, pero tuve que adaptarlo a un escenario un poco diferente y más comun, pues yo estaba utilizando MasterPages.&lt;br /&gt;El control modalpopup posee la posibilidad de utilizar contenido dinámico, para lo que es necesario utilizar las propiedades DynamicContextKey(el parametro que se enviará al webservice), DynamicServiceMethod(El nombre del método del webservice) y DynamicServicePath(El path al webservice), DynamicControlID(el control destino que va a recibir la información del webservice para mostrarla),(pueden encontrar el detalle de varias de las otras propiedades del modal popup extender &lt;a href=&quot;http://www.codeproject.com/Ajax/Dynamic_AJAX_Modal_Popup.asp&quot;&gt;AQUI&lt;/a&gt;). El principal problema con el que me encontré fue que, al tratar de utilizar algun otro control como destino de la información diferente al clásico label, la cosa no andaba para nada(nullreference en el ModalPopupExtender).&lt;br /&gt;&lt;br /&gt;Esto va a ser, básicamente, un paso a paso del ejemplo en el link anterior con aquella información que no esta en el artículo y que tuve que descubrir por mi mismo:&lt;br /&gt;&lt;br /&gt;Bueno para empezar, necesitaremos un gridview y un método para cargarle los datos que necesitamos (pueden utilizar el bindeo sencillo de asignar la fuente de datos a través del asistente para cargar la grilla, pero si también quieren actualizar los datos utilizando el modal es necesario que, una vez que se modificaron en el modalpopup se &quot;refresque&quot; la grilla, y es más sencillo(y rápido, y.... estético, y... todo) que vuelvan a invocar el método de cargado de la grilla en lugar de tener que hacer un postback completo).&lt;br /&gt;En este caso asumimos que estoy queriendo ver y modificar la lista de una tabla clientes :&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; LlenarGrillaClientes()&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; sql = &lt;span class=&quot;str&quot;&gt;&quot;Select * from Clientes&quot;&lt;/span&gt;;&lt;br /&gt;SqlDataAdapter da = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; SqlDataAdapter(sql, “ connection &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;”);&lt;br /&gt;DataTable dt = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; DataTable();&lt;br /&gt;da.Fill(dt);&lt;br /&gt;GridView1.DataSource = dt;&lt;br /&gt;GridView1.DataBind();&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Una vez definido el método, es necesario que lo invoquemos en el Page_Load de la página. Procedemos a agregar un templatefield al gridview, y dentro del mismo agregamos un hyperlink(porque un hyperlink y nop un boton? porque si utilizamos un boton y no configuramos un par de cosillas extra, por defecto cuando presionemos el boton se producira un postback que evitará que el modal se muestre).&lt;br /&gt;&lt;br /&gt;El siguiente paso es colocar los campos que necesitemos &quot;expuestos&quot; en el gridview a través del uso de DataKeys. En este caso seria&quot;ID_Cliente&quot;; al hacer esto, podemos &quot;tomar&quot; el valor del campo que pusimos en el DataKey para el row seleccionado en el evento RowDataBound.&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; GridView1_RowDataBound(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; sender, GridViewRowEventArgs e)&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (e.Row.RowType == DataControlRowType.DataRow)&lt;br /&gt;{&lt;br /&gt;HyperLink HyperLink1 = (HyperLink)e.Row.FindControl(&lt;span class=&quot;str&quot;&gt;&quot;HyperLink1&quot;&lt;/span&gt;);&lt;br /&gt;HyperLink1.Attributes.Add(&lt;span class=&quot;str&quot;&gt;&quot;onclick&quot;&lt;/span&gt;,&lt;br /&gt;&lt;span class=&quot;str&quot;&gt;&quot;MostrarPopup(&#39;&quot;&lt;/span&gt;+GridView1.DataKeys[e.Row.RowIndex].Value+&lt;span class=&quot;str&quot;&gt;&quot;&#39;)&quot;&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;En el codigo anterior, lo que hago es, primero buscar el hyperlink que agregue a la grilla, y luego agregarle el metodo onclick, para que invoque al método de Javascript MostrarPopup, al que paso como parámetro el valor del campo que especifique en el DataKey para el row seleccionado.&lt;br /&gt;&lt;br /&gt;Aclaro algo, en el caso de que deseen activar el modalpopup a traves de un único boton &quot;Actualizar&quot; en la pagina, y no a través del hyperlink dentro de el grid, lo anterior deberia cambiar un poco:&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; GridView1_RowCommand(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; sender, GridViewCommandEventArgs e)&lt;br /&gt;{&lt;br /&gt;   &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; index = Int32.Parse(e.CommandArgument.ToString());&lt;br /&gt;   BtnActualizarUsuario.Attributes.Add(&lt;span class=&quot;str&quot;&gt;&quot;onclick&quot;&lt;/span&gt;, &lt;span class=&quot;str&quot;&gt;&quot;ShowMyModalActualizar(&#39;&quot;&lt;/span&gt; + GrdVwListaAdministradores.DataKeys[index].Value+ &lt;span class=&quot;str&quot;&gt;&quot;&#39;);return false;&quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Es muy importante que agreguen el return false, para evitar que el botón con el cual estan queriendo invocar al modal cause un postback que refresque toda la pantalla y termine por hacer flashear la ventana modal para finalmente dejarla escondida, tambien noten que ya no se hace en el evento rowdatabound, sino en el command, esto es para tomar el valor seleccionado del gridview(utilizando el valor del index).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bueno, hasta aqui lo sencillo, vayamos ahora a algo un poquito mas interesante, la parte webservice.&lt;br /&gt;NO tuve buenas experiencias con el pseudo-webservice que me define por defecto el modal cuando le digo que voy a querer contenido dinamico, y después de muchas pruebas y errores decidi agregar el webservice yo mismo &quot;Old Fashion Way&quot;, utilizando &quot;Agregar Nuevo elemento&quot; en ASP. (Nota al pie: No usen el nombre webservice que viene por defecto, porque es solo para confusiones, trust me en esto).&lt;br /&gt;Asi que agregamos el webservice, pero es IMPORTANTE que agregue un par de cosas al ya definido webservice:&lt;br /&gt;Ademas de las referencias que de por sí van a necesitar si pretenden utilizar sql (data, data.sqlclient) DEBEN agregar una referencia a System.Web.Script.Services, y agregar las clases [ScriptService] y [ScriptMethod] al servicio y al método del servicio respectivamente, sino no podrán referenciarlo desde el javascript.&lt;br /&gt;Les va a quedar algo asi:&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;pre class=&quot;csharpcode&quot;&gt;[WebService(Namespace = &lt;span class=&quot;str&quot;&gt;&quot;http://tempuri.org/&quot;&lt;/span&gt;)]&lt;br /&gt;[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]&lt;br /&gt;[ScriptService]&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; CargarDatos : System.Web.Services.WebService {&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; CargarDatos () {&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;//Uncomment the following line if using designed components&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;//InitializeComponent();&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[WebMethod]&lt;br /&gt;[ScriptMethod]&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; CargarDatosClientes(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; ID_Cliente)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; sql = &lt;span class=&quot;str&quot;&gt;&quot;select * from Clientes where ID_Cliente=&quot;&lt;/span&gt; + ID_Cliente;&lt;br /&gt;SqlDataAdapter da = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; SqlDataAdapter(sql, “connection &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;”);&lt;br /&gt;DataSet ds = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; DataSet();&lt;br /&gt;&lt;br /&gt;da.Fill(ds);&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (ds.Tables.Count &amp;gt; 0)&lt;br /&gt;  {&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; ds.GetXml();&lt;br /&gt;  }&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;&lt;br /&gt;  {&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;El siguiente paso es agregar las referencias pertinentes al webservice al proyecto, utilizando &quot;...Add web reference&quot;, y otra cosa más que muy importante es agregar la referencia al webservice dentro del scriptmanager (en la MasterPage):&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;asp:ScriptManager&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ScriptManager1&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;runat&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;server&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;Services&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;asp:ServiceReference&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;CargarDatos.asmx&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;Services&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;asp:ScriptManager&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si no siguen estos pasos no van a lograr &quot;Encontrar&quot; el webservice a la hora de llamarlo desde su codigo de Javascript.&lt;br /&gt;Algo que cabe destacar en el codigo del webservice es que retorno el dataset en formato XML, lo que nos va a permitir &quot;desmembrarlo&quot; luego desde mi funcion en javascript, para obtener los datos necesarios.&lt;br /&gt;&lt;br /&gt;Lo siguiente es agregar un panel (para estructura del modalpopup y contenedor de los controles), y el modalpopupextender a la página. Colocamos los controles que necesitemos dentro del panel, en este caso yo uso textboxes (para poder editar la información que recuperamos del webservice) y un hiddenfield (que me almacena el ID_Cliente que voy a necesitar a la hora de actualizar la informacion en la BD cuando presione el boton actualizar en el modalpopup con la información ya alterada en los textboxes).&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;asp:Panel&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Panel1&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;runat&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;server&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;BackColor&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;LightGray&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;Height&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;269px&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;Width&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;428px&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;display:none&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;asp:HiddenField&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;hidCusCode&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;runat&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;server&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;asp:TextBox&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;TxBxNombre&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;runat&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;server&quot;&lt;/span&gt;&amp;amp;&lt;span class=&quot;attr&quot;&gt;lt&lt;/span&gt;;/&lt;span class=&quot;attr&quot;&gt;asp:TextBox&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;asp:TextBox&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;TxBxCiudad&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;runat&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;server&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;asp:TextBox&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;asp:TextBox&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;TxBxLocalidad&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;runat&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;server&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;asp:TextBox&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;asp:Button&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Button1&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;runat&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;server&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;Text&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Update&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;OnClick&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot; Button1_Click&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;asp:Button&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Button2&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;runat&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;server&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;Text&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Cancel&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;asp:Panel&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;cc1:ModalPopupExtender&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ModalPopupExtender1&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;runat&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;server&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;PopupControlID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Panel1&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;behaviorID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ModalPopupExtender&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;TargetControlID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Panel1&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;BackgroundCssClass&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;modalBackground&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;CancelControlID&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Button2&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;OnCancelScript&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;HideModalPopup()&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;cc1:ModalPopupExtender&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Observen que solo defino un boton cancel, que me va a esconder el modal despues, y que tengo un evento click asociado al boton actualizar, y como target control NO utilizo el hyperlink.&lt;br /&gt;&lt;br /&gt;Okas hasta ahora todo mas o menos sencillo, ahora viene la parte... no tan pintoresca pero fundamental, el Javascript.&lt;br /&gt;&lt;br /&gt;Defino 3 funciones en javascript en un bloque &amp;lt; type=&quot;text/javascript&quot;&amp;gt;&amp;lt; /script&amp;gt; EN la pagina contenido en la que tengo el panel, la grilla y el modal (probe de varias maneras esto, poniendolo en la masterpage, y en un archivo aparte de jscript, pero en ambos casos fui incapaz de poder referenciar a los controles a traves de su .ClientID, y tenia que usar el nombre que se le asigna cuando se arma el HTML, lo que francamente no es óptimo para nada y te quita escalabilidad, por lo que decidi ponerlo en la pagina contenido).&lt;br /&gt;Observen que utilizo el behaviorID en el modal, hago esto para poder &quot;encontrarlo&quot; efectivamente, puesto que tampoco fui capaz de hacerlo de otra manera(esto tiene una explicacion de fondo que no voy a poner aca... pero sientanse libres de goooooglear your guts off :D).&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;pre&gt;function MostrarPopup(ID_Cliente)&lt;br /&gt;{&lt;br /&gt;var modal=$find(&#39;ModalPopupExtender1&#39;);  //haciendo referencia al behavior, y NO al id&lt;br /&gt;modal.show();&lt;br /&gt;CargarDatos.CargarDatosClientes(ID_Cliente,MostrarResultados);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;//paso ID_Cliente al metodo del WS, y, si todo se desarrolla con exito en el WS, invoco a la funcion MostrarResultados (tambien hay bastante info sobre los parametros del WS cuando lo invoco desde javascript en internet, search my boys, search).&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;function MostrarResultados(result)&lt;br /&gt;{&lt;br /&gt;var doc;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (window.ActiveXObject)&lt;br /&gt;{&lt;br /&gt;doc=&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ActiveXObject(&lt;span class=&quot;str&quot;&gt;&quot;Microsoft.XMLDOM&quot;&lt;/span&gt;);&lt;br /&gt;doc.async=&lt;span class=&quot;str&quot;&gt;&quot;false&quot;&lt;/span&gt;;&lt;br /&gt;doc.loadXML(result);&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;var parser=&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; DOMParser();&lt;br /&gt;var doc=parser.parseFromString(result,&lt;span class=&quot;str&quot;&gt;&quot;text/xml&quot;&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var root=doc.documentElement.childNodes;&lt;br /&gt;var tags;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt;(var i=0;i&amp;lt;root.length;i++)&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (root[i].nodeType==1)&lt;br /&gt;{&lt;br /&gt;   tags=root[i].childNodes;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt;(var i=0;i&amp;lt;tags.length;i++)&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (tags[i].nodeType==1)&lt;br /&gt;{&lt;br /&gt; var xmlvalue=tags[i].childNodes[0].nodeValue;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;switch&lt;/span&gt; (tags[i].nodeName)&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&quot;ID_Cliente&quot;&lt;/span&gt;:&lt;br /&gt;document.getElementById(&lt;span class=&quot;str&quot;&gt;&#39;&amp;lt;%=HiddenField1.ClientID%&amp;gt;&#39;&lt;/span&gt;).&lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt;=xmlvalue;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&quot;Nombre&quot;&lt;/span&gt;:&lt;br /&gt;document.getElementById(&lt;span class=&quot;str&quot;&gt;&#39;&amp;lt;%=TxBxNombre.ClientID%&amp;gt;&#39;&lt;/span&gt;).&lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt;=xmlvalue;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&quot;Ciudad&quot;&lt;/span&gt;:&lt;br /&gt;document.getElementById(&lt;span class=&quot;str&quot;&gt;&#39;&amp;lt;%=TxBxCiudad.ClientID%&amp;gt;&#39;&lt;/span&gt;).&lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt;=xmlvalue;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&quot;Localidad&quot;&lt;/span&gt;:&lt;br /&gt;document.getElementById(&lt;span class=&quot;str&quot;&gt;&#39;&amp;lt;%=TxBxCiudad.ClientID%&amp;gt;&#39;&lt;/span&gt;).&lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt;=xmlvalue;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;la parte de.ClientID es necesaria para poder encontrar el control cuando se arma el html, puesto que en el momento que la funcion va a ser llamada, cada control ya no se llama de la manera &quot;TxBxNombre&quot;, sino ctl00$ContentPlaceHolder1$TxBxNombre; que es una identidficacion generada automaticamente; al usar CLientID obtenemos el ctl00$ContentPlaceHolder1$TxBxNombre en el momento en el que se genera el html sin la necesidad de ESPECIFICAMENTE escribirlo en tiempo de codificacion, con las desventajas que esto traeria aparejado.&lt;br /&gt;Basicamente la funcion anterior lo que hace es tomar el xml y &quot;desmembrarlo&quot;, cargando cada control en funcion al valor del mismo.&lt;br /&gt;Ok, ahora la funcion que esconde el modal:&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;pre class=&quot;csharpcode&quot;&gt;function HideModalPopup()&lt;br /&gt;{&lt;br /&gt;var modal = $find(&lt;span class=&quot;str&quot;&gt;&#39;ModalPopupExtender1&#39;&lt;/span&gt;);&lt;br /&gt;modal.hide();&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Perfecto, so far so good; con esto deberian ser capaces de mostrar el modalpopup con los datos cargados desde el xml(recuerden crear una clase css para modalpopup y modalbackground).&lt;br /&gt;Ahora vamos a proceder a hacer &quot;impactar&quot; los cambios que formulen en los texboxes en la base de datos, para esto lo que hacemos es lo siguiente:&lt;br /&gt;En Page_load agregamos:&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;Button1.OnClientClick=String.Format(&lt;span class=&quot;str&quot;&gt;&quot;fnClickUpdate(&#39;{0}&#39;,&#39;{1}&#39;)&quot;&lt;/span&gt;, Button1.UniqueID, &lt;span class=&quot;str&quot;&gt;&quot;&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;y dentro del&lt;code&gt;&lt;br /&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/code&gt;agregamos otra funcion mas:&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;function fnClickUpdate(sender, e)&lt;br /&gt;{&lt;br /&gt;__doPostBack(sender,e);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;que basicamente lo que nos va a permitir es hacer un postback DESDE el modal para asi poder realizar la actualizacion de los datos.&lt;br /&gt;Ahora lo que hacemos es agregar la logica sql de actualizacion dentro del evento click del boton 1(el de actualizar)&lt;br /&gt;&lt;div class=&quot;scrollbox&quot;&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Button1_Click(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; sql = &lt;span class=&quot;str&quot;&gt;&quot;Update Clientes Set Nombre=’”+TxBxNombre.Text+”’,     &lt;br /&gt;otros_controles=otros_campos Where ID_Cliente=&quot;&lt;/span&gt;+HiddenField1.Value;&lt;br /&gt;SqlConnection conn = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; SqlConnection(“Connection String”);&lt;br /&gt;conn.Open();&lt;br /&gt;SqlCommand cmd = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; SqlCommand(sql, conn);&lt;br /&gt;cmd.ExecuteNonQuery();&lt;br /&gt;conn.Close();&lt;br /&gt;LlenarGrillaClientes();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Y voilá, tienen una linda ventanita modal que no solo muestra datos de una grilla, sino que ademas les permite actualizarlos.&lt;br /&gt;&lt;br /&gt;Creo que no se me olvido nada, en caso de alguna duda pregunten nomas que para eso estamos...&lt;br /&gt;&lt;br /&gt;Saludos y happy programming&lt;br /&gt;&lt;br /&gt;P.D:Es mi primer post y es mas que factible que tenga algun error, el funcionamiento del ejemplo es completo, lo estoy usando actualmente, asi que si algo no funciona puede ser error mio al armar el post, o de ustedes al interpretarlo, asi que no duden en preguntar o avisarme si ven algo mal.&lt;br /&gt;&lt;br /&gt;P.D.2: Grax Dario por el tip de formateo de codigo en el blog&lt;br /&gt;&lt;br /&gt;Saludos</content><link rel='replies' type='application/atom+xml' href='http://elrincondeaspnetyajax.blogspot.com/feeds/4569057672705177718/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4932669040823648594/4569057672705177718' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/4569057672705177718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/4569057672705177718'/><link rel='alternate' type='text/html' href='http://elrincondeaspnetyajax.blogspot.com/2007/10/uso-de-un-modal-popup-para-mostrar-y.html' title='(ModalPopup)Uso de un Modal Popup para mostrar y actualizar el contenido de un gridview'/><author><name>Leandro Filipczyk</name><uri>http://www.blogger.com/profile/09725881425296069937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4932669040823648594.post-2939727217782808602</id><published>2007-10-14T00:30:00.000-03:00</published><updated>2008-01-10T22:58:16.408-02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ajax"/><category scheme="http://www.blogger.com/atom/ns#" term="asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="aspnet"/><title type='text'>Bienvenido</title><content type='html'>&lt;span style=&quot;font-family:georgia;&quot;&gt;Hola, bienvenidos al rincon de ASp.Net y AJAX, (y a mi primer blog dicho sea de paso), aqui voy a intentar darle una mano a todas aquellas personas que se estan iniciando en el uso de ASP.Net y AJAX en el desarrollo de sus sites; cabe aclarar que yo mismo estoy aun en fase de exploracion tambien, con lo que no siempre tendre todas las respuestas, pero aun asi podrán valerse de mis experiencias para poder utilizarlas de base en sus propios proyectos. Sientanse libres de tomar todo lo que necesiten de aqui, asi como hacer las referencias necesarias al sitio.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:georgia;&quot;&gt;A medida que vaya solucionando diferentes problemas los ire subiendo aqui para que mi trabajo de busqueda pueda servirle a otras personas, y no tengan que perder tiempo solucionando problemas ya solucionados; con este pensamiento en mente podremos aprender de las experiencias de los demas y lograran avanzar mucho mas rapido.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:georgia;&quot;&gt;Tengo en el tintero un par de soluciones a problemas bastante comunes cuando enfrentamos el desarrollo de un site promedio, con acceso a Base de datos y manejo de usuarios, que ire subiendo en la medida de lo posible en estos dias.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:georgia;&quot;&gt;Saludos y happy programming.&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://elrincondeaspnetyajax.blogspot.com/feeds/2939727217782808602/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4932669040823648594/2939727217782808602' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/2939727217782808602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4932669040823648594/posts/default/2939727217782808602'/><link rel='alternate' type='text/html' href='http://elrincondeaspnetyajax.blogspot.com/2007/10/bienvenido.html' title='Bienvenido'/><author><name>Leandro Filipczyk</name><uri>http://www.blogger.com/profile/09725881425296069937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>