<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7876279692288873799</id><updated>2011-07-08T07:55:11.751-07:00</updated><category term='parseInt'/><category term='listitem'/><category term='HtmlEncode'/><category term='dropdownlist'/><category term='Méthode d&apos;extension'/><category term='select'/><category term='MVVM'/><category term='MVC'/><category term='WebBrowser'/><category term='GetShortPathName'/><category term='System.Web.UI.WebControls'/><category term='TechDays 2009'/><category term='GridView'/><category term='MVP'/><category term='Popup'/><category term='ImageUrl'/><category term='NewWindow3'/><category term='IDWebBrowserEvents'/><category term='Compilation'/><category term='API'/><category term='sql server'/><category term='TabContainer'/><category term='ASP.NET MVC'/><category term='ASP.NET'/><category term='C#'/><category term='Reflection'/><category term='Flash'/><category term='Microsoft Parallel Extensions'/><category term='DataFormatString'/><category term='optimiser'/><category term='System.Web.Abstraction'/><category term='HTML'/><category term='COM Interop'/><category term='showModalDialog'/><category term='JavaScript'/><category term='UpdatePanel'/><category term='AjxControlToolKit'/><category term='System.Web.Routing'/><category term='.NET'/><title type='text'>&lt;asp:Blog FirstName=''Sébastien'' LastName=''DOUCET'' /&gt;</title><subtitle type='html'>Vous entrez dans une zone Dot NET... développements JavaScript accéptés</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-8323796604004107139</id><published>2010-05-05T19:22:00.001-07:00</published><updated>2010-05-05T20:30:30.655-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Méthode d&apos;extension'/><title type='text'>ASP.NET MVC : Helpers et méthodes d'extentions, le mariage parfait</title><content type='html'>ASP.NET MVC fournit 3 Helpers essentiels au framework : UrlHelper, HtmlHelper et AjaxHelper que l'on retrouve respectivement sous le nom de Url, Html et Ajax comme propriété.&lt;br /&gt;Ces helpers fournissent un contexte qui expose l'essentiel des méthodes et propriétés "core" les concernant.&lt;br /&gt;Les helpers deviennent alors des accrocheurs de méthodes d'extensions qui vont étendre les fonctionnalités en utilisant le contexte de celui ci. Ainsi, au lieu de créer une méthode d'extension pour ViewPage, ViewPage&amp;lt;T&amp;gt;, ViewUserControl, ViewUserControl&amp;lt;T&amp;gt;, ViewMasterPage et ViewMasterPage&amp;lt;T&amp;gt;, une seule suffit sur HtmlHelper. On peut constater d'ailleur que la plupart des méthodes que l'on retrouve sur ces objets sont des méthodes d'extensions :&lt;br /&gt;&lt;div style="TEXT-ALIGN: center; MARGIN: 5px"&gt;&lt;img src="http://2.bp.blogspot.com/_8tc08bqaLnU/S-IwfYWkWNI/AAAAAAAAB8U/TvcB5ePZepk/s320/HtmlHelper.png" /&gt;&lt;/div&gt;Les helpers permettent donc de fournir un contexte aux méthodes d'extensions sans polluer le reste des objets et permettant ainsi de classer ces méthodes, de créer des catalogues de méthodes statiques. Le helper devient un "this" et son écriture devrait justement omettre l'écriture du "this". J'ai ainsi 3 helpers me permettant de résoudre bien des problèmes d'implémentations dans mon application MVC (Ex : AccountHelper, FileHelper). On peut imaginer que ce genre de concept peut s'appliquer dans bien d'autres cas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-8323796604004107139?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/8323796604004107139/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2010/05/aspnet-mvc-helpers-et-methodes.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/8323796604004107139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/8323796604004107139'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2010/05/aspnet-mvc-helpers-et-methodes.html' title='ASP.NET MVC : Helpers et méthodes d&apos;extentions, le mariage parfait'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8tc08bqaLnU/S-IwfYWkWNI/AAAAAAAAB8U/TvcB5ePZepk/s72-c/HtmlHelper.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-851616824245477988</id><published>2010-05-04T19:10:00.000-07:00</published><updated>2010-05-05T19:19:43.095-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql server'/><category scheme='http://www.blogger.com/atom/ns#' term='listitem'/><category scheme='http://www.blogger.com/atom/ns#' term='optimiser'/><category scheme='http://www.blogger.com/atom/ns#' term='select'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='dropdownlist'/><title type='text'>Optimisation de listes SQL Server - ASP.NET - HTML</title><content type='html'>Il est assez fréquent d'avoir des listes simples (listes de liens, DropDownList's, ListItem's, etc.) de clefs/valeurs nécessitant de multiples requêtes, mappings, objets, etc...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Voici ma solution permettant d'alléger le travail du développeur et des serveurs :&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;em&gt;Énoncé :&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;On souhaite afficher une fiche "détail" issue d'une table d'aliments ([produits]). Chaque aliment possède une ou plusieurs catégories (Ex : Légume, Viande, Produit Frais, Cru, etc...) issues d'une table ([categories_in_produits]) en liaison avec une table de référence ([categories]).&lt;br /&gt;On souhaite maintenant afficher ces catégories sous formes de liens dans la fiche du produit afin de pouvoir rediriger vers une liste des produits pour la catégorie en question.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;1. Script T-SQL :&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;Voici le corps de la procédure stockée :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;DECLARE&lt;/span&gt; @categories &lt;span style="color:#3333ff;"&gt;varchar&lt;/span&gt;(1000)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="color:#006600;"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;-- Concaténation des catégories. ex : 55=Légumes;45=Cru;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;SET&lt;/span&gt; @categories = &lt;span style="color:#ff0000;"&gt;''&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;SELECT&lt;/span&gt; @categories = @categories + c.id + &lt;span style="color:#ff0000;"&gt;'='&lt;/span&gt; + c.display_name +&lt;span style="color:#ff0000;"&gt; ';'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;FROM&lt;/span&gt; categories c&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#666666;"&gt;INNER JOIN&lt;/span&gt; categories_in_produits cp &lt;span style="color:#3333ff;"&gt;ON&lt;/span&gt; c.id = cp.category_id&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;WHERE&lt;/span&gt; cp.produit_id = @produit_id&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;color:#006600;"&gt;-- Requête de résultat&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;SELECT&lt;/span&gt; *, @categories categories&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;FROM&lt;/span&gt; produits&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;WHERE&lt;/span&gt; id = @produit_id&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On obtient donc toutes nos catégories en 1 seule requête.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;2. Étendre jQuery :&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;Cette méthode va permettre de parser coté client notre chaine de catégories et de les binder sur un template :&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;(&lt;span style="color:#3333ff;"&gt;function&lt;/span&gt;($) {&lt;br /&gt;$.fn.databind = &lt;span style="color:#3333ff;"&gt;function&lt;/span&gt;(d, r) {&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;var&lt;/span&gt; p = $.extend({ r: /([^=]*)=([^;]*);/gi, d: &lt;span style="color:#660000;"&gt;''&lt;/span&gt; }, { d: d, r: r });&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;return this&lt;/span&gt;.each(&lt;span style="color:#3333ff;"&gt;function&lt;/span&gt;() {&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;var&lt;/span&gt; s = $(&lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;var&lt;/span&gt; h = s.html();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;var&lt;/span&gt; l = h.length - 3;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;if&lt;/span&gt;(l &gt; 4 &amp;amp;&amp;amp; h.indexOf(&lt;span style="color:#660000;"&gt;'&lt;!--'&lt;/span&gt;, 0) == 0 &amp;amp;&amp;amp; h.indexOf(&lt;span style="color:#660000;"&gt;'--&gt;'&lt;/span&gt;, l) == l)&lt;br /&gt;h = h.substring(4, l);&lt;br /&gt;s.html(p.d.replace(p.r, h)).show();&lt;br /&gt;});&lt;br /&gt;};&lt;br /&gt;})(jQuery);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;3. Allégez votre Html :&lt;/em&gt;&lt;br /&gt;&lt;/strong&gt;Laisser le client parser la chaine de catégories (utilisation du model MVC) :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#660000;"&gt;script&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;="text/javascript"&amp;gt;&lt;/span&gt;&lt;br /&gt;$(document).ready(&lt;span style="color:#3333ff;"&gt;function&lt;/span&gt;() {&lt;br /&gt;$(&lt;span style="color:#660000;"&gt;'#template'&lt;/span&gt;).databind(&lt;span style="color:#660000;"&gt;'&amp;lt;%= Model.Categories %&amp;gt;'&lt;/span&gt;);&lt;br /&gt;});&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#660000;"&gt;script&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#660000;"&gt;p&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;="template"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;style&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;="&lt;span style="color:#ff0000;"&gt;display&lt;/span&gt;: none"&amp;gt;&lt;/span&gt;[&lt;span style="color:#3333ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#660000;"&gt;a&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;href&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;="&amp;lt;%= Url.Action("CategoryList") %&amp;gt;/$1"&amp;gt;&lt;/span&gt;$2&lt;span style="color:#3333ff;"&gt;&amp;lt;&lt;span style="color:#660000;"&gt;a&lt;/span&gt;&amp;gt;&lt;/span&gt;] &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;color:#3333ff;"&gt;&amp;lt;/&lt;span style="color:#660000;"&gt;p&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Grâce à cette méthode, on économise les transactions avec notre serveur de bases de données, on ne transforme rien coté IIS/ASP.NET, on optimise le HTML généré et on laisse le client parser la chaine. Coté développeur, une seule procédure stockée est nécessaire ainsi que tout ce qui en découle (objets, mapping, data access).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Un exemple testable directement (en incluant jQuery et l'extension de jQuery du point 2) :&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;Il est possible de spécifier une expression régulière personnalisée pour gérer vos propres concaténations :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#660000;"&gt;script&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;="text/javascript"&amp;gt;&lt;/span&gt;&lt;br /&gt;$(document).ready(&lt;span style="color:#3333ff;"&gt;function&lt;/span&gt;() {&lt;br /&gt;$(&lt;span style="color:#660000;"&gt;'#list-languages'&lt;/span&gt;).databind(&lt;span style="color:#660000;"&gt;'FR;EN;IT;ES;', &lt;/span&gt;&lt;span style="color:#000000;"&gt;/([^;]*);/gi&lt;/span&gt;);&lt;br /&gt;$(&lt;span style="color:#660000;"&gt;'#list-languages2'&lt;/span&gt;).databind(&lt;span style="color:#660000;"&gt;'fr=Francais;en=Anglais;it=Italien;es=Espagnol;'&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;});&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#660000;"&gt;script&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#660000;"&gt;select&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;="list-languages"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#ff0000;"&gt;style&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;="&lt;span style="color:#ff0000;"&gt;display&lt;/span&gt;:none"&amp;gt;&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#660000;"&gt;option&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;="$1" &lt;/span&gt;&lt;span style="color:#3333ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;$1&lt;/span&gt;&lt;span style="font-family:courier new;color:#3333ff;"&gt;&amp;lt;/&lt;span style="color:#660000;"&gt;option&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family:courier new;color:#3333ff;"&gt;&amp;lt;/&lt;span style="color:#660000;"&gt;select&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#660000;"&gt;select&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;="list-languages2"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;style&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;="&lt;span style="color:#ff0000;"&gt;display&lt;/span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;none"&amp;gt;&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#660000;"&gt;option&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;="$1" &lt;/span&gt;&lt;span style="color:#3333ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;$2&lt;/span&gt;&lt;span style="font-family:courier new;color:#3333ff;"&gt;&amp;lt;/&lt;span style="color:#660000;"&gt;option&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family:courier new;color:#3333ff;"&gt;&amp;lt;/&lt;span style="color:#660000;"&gt;select&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Le fonctionnement de la méthode 'databind' ajoutée à jQuery étant basé sur une expression régulière, il faudra utiliser la syntaxe correspondante pour le template.&lt;br /&gt;&lt;br /&gt;Sur certains navigateurs, vous serrez obligé de mettre le template en commentaire (&lt;span style="font-family:courier new;font-size:85%;color:#006600;"&gt;&lt;!-- --&gt;&lt;/span&gt;) parce que les quotes autour des valeurs des attributs disparaissent. La mise en commentaire peut aussi permettre d'afficher le cadre container avant le binding évitant ainsi d'éventuels sauts lors du chargement de votre page car il n'est plus nécessaire de placer le style "&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;color:#cc0000;"&gt;display&lt;/span&gt;&lt;span style="font-family:courier new;color:#3333ff;"&gt;:none&lt;/span&gt;&lt;/span&gt;".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-851616824245477988?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/851616824245477988/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2010/05/optiomisation-de-listes-au-niveau-sql.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/851616824245477988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/851616824245477988'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2010/05/optiomisation-de-listes-au-niveau-sql.html' title='Optimisation de listes SQL Server - ASP.NET - HTML'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-702211896283643540</id><published>2009-09-14T09:30:00.001-07:00</published><updated>2009-09-14T15:08:38.210-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Reflection'/><category scheme='http://www.blogger.com/atom/ns#' term='Méthode d&apos;extension'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Méthode d’extension : Object To Dictionary&lt;string, object&gt;</title><content type='html'>&lt;p&gt;Je parle dans le précédent post de la méthode utilisée pour initialisé un dictionnaire de valeur par certaines briques de la SP1 du 3.5. Elle est souvent utilisée où l’écriture d’un objet anonyme simplifie l’écriture ou pour initialiser un objet en une seule ligne dans la nouvelle syntaxe. Cette méthode consiste à scanner un objet par réflexion pour créer un dictionnaire &amp;lt;Nom de la propriété, Valeur de la propriété&amp;gt;. Cette méthode n’est pas performante pour alimenter un dictionnaire, mais elle peut être utile. Voici donc une méthode d’extension plus générique permettant d’obtenir un résultat similaire :&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;public static class&lt;/font&gt; &lt;font color="#008080"&gt;MyExtensions&lt;/font&gt;       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;public static&lt;/font&gt; &lt;font color="#008080"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string, object&lt;/font&gt;&amp;gt; ToDictionary(&lt;font color="#0000ff"&gt;this object&lt;/font&gt; obj)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008080"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string, object&lt;/font&gt;&amp;gt; dic = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#008080"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string, object&lt;/font&gt;&amp;gt;();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008080"&gt;Type&lt;/font&gt; t = obj.GetType();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008080"&gt;foreach&lt;/font&gt; (&lt;font color="#0000ff"&gt;var&lt;/font&gt; item &lt;font color="#0000ff"&gt;in&lt;/font&gt; t.GetProperties())       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dic.Add(item.Name, item.GetValue(obj,&lt;font color="#0000ff"&gt;null&lt;/font&gt;));       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;return&lt;/font&gt; dic;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Cette méthode est simple, mais elle peut s’agrémenter de plusieurs surcharges permettant ainsi de filtrer les types ou d’effectuer des conversions par exemple.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-702211896283643540?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/702211896283643540/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2009/09/methode-dextension-object-to-dictionary.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/702211896283643540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/702211896283643540'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2009/09/methode-dextension-object-to-dictionary.html' title='Méthode d’extension : Object To Dictionary&amp;lt;string, object&amp;gt;'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-2860187069211209522</id><published>2009-09-11T15:58:00.001-07:00</published><updated>2009-09-11T16:41:58.533-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='System.Web.Abstraction'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='System.Web.Routing'/><title type='text'>“System.Web.Routing” dans les applications ASP.NET</title><content type='html'>&lt;p&gt;Cette assembly apporté par le .NET 3.5 SP1 principalement pour ASP.NET MVC et Dynamic Data nous permet d’écrire nos Url’s dans le format de notre choix. L’utilisation de cette assembly va de pair avec “System.Web.Abstraction” utilisée par “System.Web.Routing” dans l’encapsulation du HttpContext dans un HttpContextWrapper et représenté dans un HttpContextBase dans un object RequestContext :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_8tc08bqaLnU/SqrWFAR_RgI/AAAAAAAAB7s/KqrVzhsz4D0/s1600-h/RequestContext%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="RequestContext" border="0" alt="RequestContext" src="http://lh4.ggpht.com/_8tc08bqaLnU/SqrWF3Hq1mI/AAAAAAAAB7w/eEpIGUz3cwQ/RequestContext_thumb%5B2%5D.jpg?imgmax=800" width="644" height="222" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Son utilisation et implémentation est extrêmement simple et elle commence par l’ajout d’une référence à l’Assembly “System.Web.Routing” et “System.Web.Abstraction” et la spécification du HttpModule analysant les Url’s à la source dans la configuration (version IIS 6) :    &lt;br /&gt;    &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font size="2" face="Courier New"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#800000" size="2" face="Courier New"&gt;httpModules&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;add&lt;/font&gt; &lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;RoutingModule&amp;quot; &lt;/font&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;type&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;=&amp;quot;System.Web.Routing.UrlRoutingModule,System.Web.Routing,Version=3.5.0.0,          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Culture=neutral, PublicKeyToken=31bf3856ad364e35&amp;quot;/&amp;gt;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;httpModules&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;L’étape suivante consistera à créer une classe permettant de résoudre le HttpHandler de la réponse. Pour que cette classe puisse être utilisé par la table de routage, elle doit implémenter l’interface “System.Web.Routing.IRouteHandler” :&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;public class&lt;/font&gt; &lt;font color="#408080"&gt;PageRouteHandler&lt;/font&gt; : &lt;font color="#408080"&gt;IRouteHandler&lt;/font&gt;         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;public string&lt;/font&gt; UrlFormat { &lt;font color="#0000ff"&gt;get&lt;/font&gt;; &lt;font color="#0000ff"&gt;set&lt;/font&gt;; } &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;public&lt;/font&gt; PageRouteHandler(&lt;font color="#0000ff"&gt;string&lt;/font&gt; urlFormat)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;this&lt;/font&gt;.UrlFormat = urlFormat;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#408080"&gt;IHttpHandler IRouteHandler&lt;/font&gt;.GetHttpHandler(&lt;font color="#408080"&gt;RequestContext&lt;/font&gt; requestContext)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;string&lt;/font&gt; vp = &lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(&lt;font color="#0000ff"&gt;this&lt;/font&gt;.UrlFormat, requestContext.RouteData.Values[&lt;font color="#800000"&gt;&amp;quot;page&amp;quot;&lt;/font&gt;]);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;return&lt;/font&gt; (&lt;font color="#408080"&gt;IHttpHandler&lt;/font&gt;)&lt;font color="#408080"&gt;BuildManager&lt;/font&gt;.CreateInstanceFromVirtualPath(vp, &lt;font color="#0000ff"&gt;typeof&lt;/font&gt;(&lt;font color="#408080"&gt;IHttpHandler&lt;/font&gt;));       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Cette classe va donc nous permettre de résoudre le chemin virtuel d’une page grâce à un format de base et à l’information “page” située dans les valeurs de “RouteData” résultat du parsing de l’url. Afin de suivre la méthodologie de ASP.NET MVC, on va maintenant utiliser les méthodes d’extensions pour ajouter simplement un format à la table de routage :&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;public static class&lt;/font&gt; &lt;font color="#408080"&gt;PageRouteExtentions&lt;/font&gt;         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;public static void&lt;/font&gt; MapPage(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#008080"&gt;RouteCollection&lt;/font&gt; routes, &lt;font color="#0000ff"&gt;string&lt;/font&gt; routeName, &lt;font color="#0000ff"&gt;string&lt;/font&gt; serverFormat, &lt;font color="#0000ff"&gt;string&lt;/font&gt; clientUrl)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; routes.Add(routeName, &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#008080"&gt;Route&lt;/font&gt;(clientUrl, &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#008080"&gt;PageRouteHandler&lt;/font&gt;(serverFormat)));         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Grâce à cette méthode d’extension, il devient très aisé d’enregistrer une route :&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;font color="#0000ff"&gt;public class&lt;/font&gt; &lt;font color="#008080"&gt;Global&lt;/font&gt; : System.Web.&lt;font color="#008080"&gt;HttpApplication&lt;/font&gt;       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;protected void&lt;/font&gt; Application_Start(&lt;font color="#0000ff"&gt;object&lt;/font&gt; sender, &lt;font color="#008080"&gt;EventArgs&lt;/font&gt; e)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008080"&gt;RouteTable&lt;/font&gt;.Routes.MapPage(&lt;font color="#800000"&gt;&amp;quot;Base&amp;quot;&lt;/font&gt;, &lt;font color="#800000"&gt;&amp;quot;~/{0}.aspx&amp;quot;&lt;/font&gt;, &lt;font color="#800000"&gt;&amp;quot;{page}.php&amp;quot;&lt;/font&gt;);       &lt;br /&gt;…&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Comme on le voit, le paramètre “page” est entouré de 2 accolades dans l’url client, c’est une règle permettant à la Route de résoudre le format de notre url. Il y a pleins d’autres options, comme des contraintes de formats, des valeurs attachées à la routes dans rapport à l’url, des valeurs par défaut…&lt;/p&gt;  &lt;p&gt;On notera que l’objet “System.Web.Routing.RouteDataDictionary” utilisé pour toutes les valeurs d’une “System.Web.Routing.RouteData” à la particularité d’avoir un constructeur permettant de scanner un objet par réflexion pour obtenir clef/valeur de chaque propriété. Cette méthode est très répandue dans l’ASP.NET MVC, elle permet de faire usage à volonté des objets anonymes.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-2860187069211209522?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/2860187069211209522/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2009/09/systemwebrouting-dans-les-applications.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/2860187069211209522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/2860187069211209522'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2009/09/systemwebrouting-dans-les-applications.html' title='“System.Web.Routing” dans les applications ASP.NET'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_8tc08bqaLnU/SqrWF3Hq1mI/AAAAAAAAB7w/eEpIGUz3cwQ/s72-c/RequestContext_thumb%5B2%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-5925506877484173541</id><published>2009-08-19T12:37:00.000-07:00</published><updated>2009-09-11T16:44:36.437-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compilation'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>BuildProvider : Custum compilation ASP.NET</title><content type='html'>&lt;p&gt;L’ASP.NET est extensible de multiple façon : IHttpHandler &amp;amp; Factory’s, les contrôles ASP.NET. Mais l’extension la plus intéressante du moteur ASP.NET est la compilation personnalisé.   &lt;br /&gt;Comment cela marche t-il ? Grâce à BuilderProvider. La classe BuilderProvider va nous permettre de compiler du code sur le même principe que l’ASP.NET avec les pages ASPX, ASCX, Master, etc. On va donc créer un générateur pour une extension de fichier définie dans la configuration et le moteur ASP.NET se chargera de compiler le code généré et l’intégrer dans notre application au démarrage de celle-ci.&lt;/p&gt;  &lt;h5&gt;Étape 1 : Génération du code source et création du provider de génération :&lt;/h5&gt;  &lt;p&gt;&lt;span style="font-family: courier new; font-size: 85%"&gt;&lt;span style="color: #0000ff"&gt;public class&lt;/span&gt; &lt;span style="color: #339999"&gt;SampleBuildProvider&lt;/span&gt; : &lt;span style="color: #339999"&gt;BuildProvider&lt;/span&gt;      &lt;br /&gt;{      &lt;br /&gt;&lt;span style="color: #3333ff"&gt;private&lt;/span&gt; &lt;span style="color: #339999"&gt;CompilerType&lt;/span&gt; _compilerType = &lt;span style="color: #3333ff"&gt;null&lt;/span&gt;; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; font-size: 85%"&gt;&lt;span style="color: #3333ff"&gt;public&lt;/span&gt; SampleBuildProvider()      &lt;br /&gt;{      &lt;br /&gt;_compilerType = &lt;span style="color: #3333ff"&gt;base&lt;/span&gt;.GetDefaultCompilerTypeForLanguage(&lt;span style="color: #660000"&gt;&amp;quot;C#&amp;quot;&lt;/span&gt;);      &lt;br /&gt;} &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; font-size: 85%"&gt;&lt;span style="color: #3333ff"&gt;public override&lt;/span&gt; &lt;span style="color: #339999"&gt;CompilerType&lt;/span&gt; CodeCompilerType      &lt;br /&gt;{      &lt;br /&gt;&lt;span style="color: #3333ff"&gt;get&lt;/span&gt; { &lt;span style="color: #3333ff"&gt;return&lt;/span&gt; _compilerType; }      &lt;br /&gt;} &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; font-size: 85%"&gt;&lt;span style="color: #3333ff"&gt;public override void&lt;/span&gt; GenerateCode(&lt;span style="color: #339999"&gt;AssemblyBuilder&lt;/span&gt; assemblyBuilder)      &lt;br /&gt;{      &lt;br /&gt;&lt;span style="color: #3333ff"&gt;using&lt;/span&gt; (&lt;span style="color: #339999"&gt;TextWriter&lt;/span&gt; wr = assemblyBuilder.CreateCodeFile(&lt;span style="color: #3333ff"&gt;this&lt;/span&gt;))      &lt;br /&gt;{      &lt;br /&gt;wr.WriteLine(&lt;span style="color: #660000"&gt;&amp;quot;using System;&amp;quot;&lt;/span&gt;);      &lt;br /&gt;wr.WriteLine(&lt;span style="color: #660000"&gt;&amp;quot;using System.Collections.Generic;&amp;quot;&lt;/span&gt;);      &lt;br /&gt;wr.WriteLine(&lt;span style="color: #660000"&gt;&amp;quot;using Builder;&amp;quot;&lt;/span&gt;); &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; font-size: 85%"&gt;wr.WriteLine(&lt;span style="color: #660000"&gt;&amp;quot;namespace MyNamespace&amp;quot;&lt;/span&gt;);      &lt;br /&gt;wr.WriteLine(&lt;span style="color: #660000"&gt;&amp;quot;{&amp;quot;&lt;/span&gt;);      &lt;br /&gt;&lt;span style="color: #339999"&gt;Uri&lt;/span&gt; uri = &lt;span style="color: #3333ff"&gt;new&lt;/span&gt; &lt;span style="color: #339999"&gt;Uri&lt;/span&gt;(&lt;span style="color: #3333ff"&gt;base&lt;/span&gt;.VirtualPath);      &lt;br /&gt;wr.WriteLine(&lt;span style="color: #660000"&gt;&amp;quot;public class My{0} : IHttpHandler&amp;quot;&lt;/span&gt;, &lt;span style="color: #339999"&gt;Path&lt;/span&gt;.GetFileName(&lt;span style="color: #3333ff"&gt;base&lt;/span&gt;.VirtualPath).Split(&lt;span style="color: #3333ff"&gt;new char&lt;/span&gt;[] { &lt;span style="color: #660000"&gt;'.'&lt;/span&gt; }));      &lt;br /&gt;wr.WriteLine(&lt;span style="color: #660000"&gt;&amp;quot;{&amp;quot;&lt;/span&gt;); &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; font-size: 85%"&gt;&lt;span style="color: #003300"&gt;// Implémentation de IHttpHandler&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; font-size: 85%"&gt;wr.WriteLine(&lt;span style="color: #660000"&gt;&amp;quot;}}&amp;quot;&lt;/span&gt;);      &lt;br /&gt;}      &lt;br /&gt;} &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; font-size: 85%"&gt;&lt;span style="color: #3333ff"&gt;public override&lt;/span&gt; &lt;span style="color: #339999"&gt;Type&lt;/span&gt; GetGeneratedType(&lt;span style="color: #339999"&gt;CompilerResults&lt;/span&gt; results)      &lt;br /&gt;{      &lt;br /&gt;&lt;span style="color: #3333ff"&gt;string&lt;/span&gt; type = &lt;span style="color: #3333ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #660000"&gt;&amp;quot;MyNamespace.My{0}&amp;quot;&lt;/span&gt;, &lt;span style="color: #339999"&gt;Path&lt;/span&gt;.GetFileName(&lt;span style="color: #3333ff"&gt;base&lt;/span&gt;.VirtualPath).Split(&lt;span style="color: #000099"&gt;new char&lt;/span&gt;[] { &lt;span style="color: #660000"&gt;'.'&lt;/span&gt; }));      &lt;br /&gt;&lt;span style="color: #3333ff"&gt;return&lt;/span&gt; results.CompiledAssembly.GetType(type);      &lt;br /&gt;}      &lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;h5&gt;Étape 2 : Spécifier dans la section “Compilation” du Web.Config quels sont les fichiers concernés :&lt;/h5&gt;  &lt;p&gt;&lt;span style="font-family: courier new; font-size: 85%"&gt;&lt;span style="color: #3333ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #660000"&gt;compilation&lt;/span&gt; &lt;span style="color: #ff0000"&gt;debug&lt;/span&gt;&lt;span style="color: #3333ff"&gt;=&amp;quot;true&amp;quot;&amp;gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: #3333ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #660000"&gt;buildProviders&lt;/span&gt;&lt;span style="color: #3333ff"&gt;&amp;gt;       &lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #660000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #3333ff"&gt;=&amp;quot;SampleBuildProvider&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;extension&lt;/span&gt;&lt;span style="color: #3333ff"&gt;=&amp;quot;.myExt&amp;quot;/&amp;gt;       &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #660000"&gt;buildProviders&lt;/span&gt;&lt;span style="color: #3333ff"&gt;&amp;gt;       &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #660000"&gt;compilation&lt;/span&gt;&lt;span style="color: #3333ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;h5&gt;Étape 3 : Utilisation des éléments générés :&lt;/h5&gt;  &lt;p&gt;Dans notre exemple, on implémente IHttpHandler, il nous suffit de créer alors un Factory de Handler pour cette nouvelle extension :&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; font-size: 85%"&gt;[&lt;span style="color: #339999"&gt;PermissionSet&lt;/span&gt;(&lt;span style="color: #339999"&gt;SecurityAction&lt;/span&gt;.LinkDemand, Unrestricted = &lt;span style="color: #3333ff"&gt;true&lt;/span&gt;), &lt;span style="color: #339999"&gt;PermissionSet&lt;/span&gt;(&lt;span style="color: #339999"&gt;SecurityAction&lt;/span&gt;.InheritanceDemand, Unrestricted = &lt;span style="color: #3333ff"&gt;true&lt;/span&gt;)]      &lt;br /&gt;&lt;span style="color: #3333ff"&gt;public class&lt;/span&gt; &lt;span style="color: #339999"&gt;MyHandlerFactory&lt;/span&gt; : &lt;span style="color: #339999"&gt;IHttpHandlerFactory&lt;/span&gt;      &lt;br /&gt;{      &lt;br /&gt;&lt;span style="color: #3333ff"&gt;public&lt;/span&gt; MyHandlerFactory()      &lt;br /&gt;{      &lt;br /&gt;} &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; font-size: 85%"&gt;&lt;span style="color: #3333ff"&gt;public virtual &lt;/span&gt;&lt;span style="color: #339999"&gt;IHttpHandler&lt;/span&gt; GetHandler(&lt;span style="color: #339999"&gt;HttpContext&lt;/span&gt; context, &lt;span style="color: #3333ff"&gt;string&lt;/span&gt; requestType, &lt;span style="color: #3333ff"&gt;string&lt;/span&gt; virtualPath, &lt;span style="color: #3333ff"&gt;string&lt;/span&gt; path)      &lt;br /&gt;{      &lt;br /&gt;&lt;span style="color: #339999"&gt;Type&lt;/span&gt; type = &lt;span style="color: #339999"&gt;BuildManager&lt;/span&gt;.GetCompiledType(virtualPath);      &lt;br /&gt;&lt;span style="color: #3333ff"&gt;return&lt;/span&gt; &lt;span style="color: #339999"&gt;Activator&lt;/span&gt;.CreateInstance(type) as &lt;span style="color: #339999"&gt;IHttpHandler&lt;/span&gt;;      &lt;br /&gt;} &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; font-size: 85%"&gt;&lt;span style="color: #3333ff"&gt;public virtual void&lt;/span&gt; ReleaseHandler(&lt;span style="color: #339999"&gt;IHttpHandler&lt;/span&gt; handler)      &lt;br /&gt;{      &lt;br /&gt;}      &lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;et de le spécifier dans la configuration :&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; font-size: 85%"&gt;&lt;span style="color: #3333ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #660000"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: #3333ff"&gt;&amp;gt;       &lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #660000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;verb&lt;/span&gt;&lt;span style="color: #3333ff"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;path&lt;/span&gt;&lt;span style="color: #3333ff"&gt;=&amp;quot;*.sb&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #3333ff"&gt;=&amp;quot;MyHandlerFactory&amp;quot;/&amp;gt;       &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #660000"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: #3333ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;On peut trouver de multiples applications, les plus courrantes vont utiliser le Xml pour décrire du code.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-5925506877484173541?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/5925506877484173541/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2009/08/buildprovider-custum-compilation-aspnet.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/5925506877484173541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/5925506877484173541'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2009/08/buildprovider-custum-compilation-aspnet.html' title='BuildProvider : Custum compilation ASP.NET'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-6016124162930135355</id><published>2009-06-04T14:40:00.001-07:00</published><updated>2009-06-05T07:56:44.576-07:00</updated><title type='text'>Fonctionnement du Dictionary grâce aux nombres premiers</title><content type='html'>&lt;p&gt;Le Dictionnaire est souvent utilisé pour obtenir une collection à accès rapide &lt;strike&gt;identique&lt;/strike&gt; presque identique via une clef.&lt;/p&gt;&lt;p&gt;Mais comment marche t-il ?&lt;br /&gt;Grâce aux nombres premiers !&lt;br /&gt;Pour ceux qui ne connaissent pas, les nombres premiers ne se divise que par 1 ou par eux même. Ceux-ci vont nous permettre de calculer les index de positionnement de nos valeurs dans la collection.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Rappelons qu’une List&amp;lt;T&amp;gt; se base à l’origine sur un tableau T[] et que la List&amp;lt;T&amp;gt; s’occupe de gérer la taille de ce tableau et l’agrandir au besoin.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Un dictionnaire fonctionne de la même manière qu’une List&amp;lt;T&amp;gt; en utilisant une structure pour stocker Clef/Valeur, appelée Entry&amp;lt;TKey,TValue&amp;gt; dans le framework :&lt;/p&gt;&lt;p&gt;Disons que notre structure contient pour le moment ceci :&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:#3333ff;"&gt;public struct&lt;/span&gt; &lt;span style="color:#339999;"&gt;Entry&lt;/span&gt;&amp;lt;TKey, TValue&amp;gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;public&lt;/span&gt; TKey key;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;public&lt;/span&gt; TValue value;&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p&gt;La différence avec une List&amp;lt;T&amp;gt;, c’est que le dictionnaire possède un index permettant un filtrage des données lors de leurs récupérations.&lt;br /&gt;Cet index est un tableau d’entier de la même taille que le tableau de valeur :&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;public class&lt;/span&gt; &lt;span style="color:#339999;"&gt;Dictionary&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;private int&lt;/span&gt;[] buckets;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;private&lt;/span&gt; &lt;span style="color:#339999;"&gt;Entry&lt;/span&gt;&amp;lt;TKey,TValue&amp;gt; entries;&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Les tailles des deux tableaux sont égales entre elle et à un nombre premier.&lt;br /&gt;Lors de l’ajout d’un item au tableaux “entries”, voici ce qui est effectué :&lt;/p&gt;&lt;ol&gt;&lt;li&gt;On récupère le HashCode de la clef pour obtenir un entier :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:#339999;"&gt;int&lt;/span&gt; hashCode = key.GetHashCode();&lt;/span&gt;&lt;/li&gt;&lt;li&gt;On récupère le reste de la division par le nombre premier utilisé pour la taille des tableaux :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:#339999;"&gt;int&lt;/span&gt; index = hashCode % entries.Length;&lt;/span&gt;&lt;br /&gt;On obtient ainsi un nombre strictement inférieur à la taille de la collection. Ce nombre correspondra à un index dans le tableau d’index “buckets”. À cette position, on y stockera un index du tableau “entries” correspondant à l’index de la dernière clef dont la division du HashCode retourne la même valeur.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Le problème est que maintenant, on ne peut que récupérer le dernier enregistrement ajouté. Il nous suffit alors de stocké ce lui du précédent dans notre structure “Entry” :&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;public struct&lt;/span&gt; &lt;span style="color:#339999;"&gt;Entry&lt;/span&gt;&amp;lt;TKey, TValue&amp;gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;public&lt;/span&gt; TKey key;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;public&lt;/span&gt; TValue value;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;public int&lt;/span&gt; previous; // Appelé next dans le framework&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;public int&lt;/span&gt; hasCode;&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;En simplifiant le code d’ajout d’item, on obtient ceci :&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;public void&lt;/span&gt; Add(&lt;span style="color:#000000;"&gt;TKey&lt;/span&gt; key, &lt;span style="color:#000000;"&gt;TValue &lt;/span&gt;value)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#006600;"&gt;// Calcul d'un hashcode (positif)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;int&lt;/span&gt; hashCode = key.GetHashCode() &amp;amp; &lt;span style="color:#3333ff;"&gt;int&lt;/span&gt;.MaxValue;&lt;br /&gt;&lt;span style="color:#006600;"&gt;// Reste de la division&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;int&lt;/span&gt; index = hashCode % &lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;.buckets.Length;&lt;br /&gt;&lt;span style="color:#006600;"&gt;// Positionnement dans le tableau de valeur&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;int&lt;/span&gt; freeEntry = &lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;.count;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;.count++;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;.entries[freeEntry].hashCode = hashCode;&lt;br /&gt;&lt;span style="color:#006600;"&gt;// Récupération de l'index de l'ancienne clef vu en premier&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;.entries[freeEntry].next = &lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;.buckets[index];&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;.entries[freeEntry].key = key;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;.entries[freeEntry].value = value;&lt;br /&gt;&lt;span style="color:#006600;"&gt;// Définition de la nouvelle entrée vu en premier&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;.buckets[index] = freeEntry;&lt;br /&gt;} &lt;/span&gt;&lt;/p&gt;&lt;p&gt;Code très simplifié (la suppression, la présence de la clef et l’augmentation de taille ne son pas gérés). &lt;/p&gt;&lt;p&gt;On récupèrera donc la valeur ainsi :&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;public&lt;/span&gt; TValue Get(TKey key)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;int&lt;/span&gt; hashCode = key.GetHashCode() &amp;amp; &lt;span style="color:#3333ff;"&gt;int&lt;/span&gt;.MaxValue;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;int&lt;/span&gt; index = hashCode % &lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;.buckets.Length;&lt;br /&gt;for (&lt;span style="color:#3333ff;"&gt;int&lt;/span&gt; i = &lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;.buckets[index]; i &gt;= 0; i = &lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;.entries[i].next)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#3333ff;"&gt;this&lt;/span&gt;.entries[i].hashCode == hashCode)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;return&lt;/span&gt; this.entries[i].value;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;return default&lt;/span&gt;(TValue);&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;La principale source de gains de performance vient à l’initialisation du dictionnaire, ce qui est aussi le cas des List&amp;lt;T&amp;gt; : La taille de départ. Celle ci est d’autant plus importante que le dictionnaire doit, en plus de la copie mémoire des tableaux, recalculer les index avec la nouvelle taille.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-6016124162930135355?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/6016124162930135355/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2009/06/fonctionnement-du-dictionary-grace-aux.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/6016124162930135355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/6016124162930135355'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2009/06/fonctionnement-du-dictionary-grace-aux.html' title='Fonctionnement du Dictionary grâce aux nombres premiers'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-1658010899911825988</id><published>2009-04-14T03:55:00.000-07:00</published><updated>2009-08-24T14:21:09.916-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='parseInt'/><title type='text'>JavaScript : parseInt ne retourne pas la valeur souhaitée</title><content type='html'>Sur des valeurs comme &lt;span style="font-style: italic;"&gt;"08"&lt;/span&gt; ou &lt;span style="font-style: italic;"&gt;"09"&lt;/span&gt;, le &lt;span style="font-style: italic;"&gt;parseInt &lt;/span&gt;de JavaScript écrit ainsi :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;var&lt;/span&gt; val = parseInt(&lt;span style="color: rgb(102, 0, 0);"&gt;"09"&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;alert(val);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nous affiche &lt;span style="font-weight: bold; font-style: italic;"&gt;0&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Pourquoi ? Parce que JavaScript par du principe que toutes chaines de caractères commençant par 0 est en base 8, comme une chaine commençant par un "x" est en base 16.&lt;br /&gt;&lt;br /&gt;Alors comment régler ce problème ? En lui spécifiant la base :&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;var&lt;/span&gt; &lt;/span&gt;val = parseInt(&lt;span style="color: rgb(102, 0, 0);"&gt;"09"&lt;/span&gt;, 10);&lt;br /&gt;alert(val);&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-1658010899911825988?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/1658010899911825988/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2009/04/javascript-parseint-ne-retourne-pas-la.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/1658010899911825988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/1658010899911825988'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2009/04/javascript-parseint-ne-retourne-pas-la.html' title='JavaScript : parseInt ne retourne pas la valeur souhaitée'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-8979586532745991977</id><published>2009-02-17T03:46:00.000-08:00</published><updated>2009-02-17T04:05:06.162-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ImageUrl'/><category scheme='http://www.blogger.com/atom/ns#' term='System.Web.UI.WebControls'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>ASP.NET : Attention au contrôle Image sans URL</title><content type='html'>Après avoir encore vu le problème réapparaître ce matin, voici l'explication du pourquoi il ne faut pas oublier de renseigner la propriété "&lt;span style="font-style: italic;"&gt;ImageUrl&lt;/span&gt;" d'un contrôle &lt;span style="font-style: italic; font-weight: bold;"&gt;System.Web.UI.WebControls.Image&lt;/span&gt;.&lt;br /&gt;Cette propriété non obligatoire contient le chemin de l'image (le "&lt;span style="font-style: italic;"&gt;src&lt;/span&gt;" de la balise "&lt;span style="font-style: italic;"&gt;img&lt;/span&gt;"). Il peut nous arriver de ne pas vouloir la renseigner pour x raison et ainsi laisser cette propriété vide.&lt;br /&gt;Mais cela peut poser un problème et pas toujours décelé.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ex :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;ASP.NET&lt;/span&gt; : &lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;&lt;span style="color: rgb(102, 0, 0);"&gt;asp:Image&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;ID&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="Image1"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="server" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;HTML généré&lt;/span&gt; : &lt;span style="font-size:85%;"&gt;&lt;&lt;span style="color: rgb(102, 0, 0);"&gt;img&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;id&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="Img1" &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;src&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;=""&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;style&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="border-width:0px;" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le problème est alors le suivant : n'ayant pas d'URL, la balise image appelle la page par défaut du répertoire en cours. Si aucune page par défaut n'y est présente, aucun soucis. Si une page par défaut est présente, elle est appelé.&lt;br /&gt;Il vous suffit d'essayer en posant un point d'arrêt dans cette page par défaut et lancer la page contenant la balise image.&lt;br /&gt;&lt;br /&gt;La conséquence direct est un appel inutile vers cette page, mais elle peut s'avérer bien plus grâve.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-8979586532745991977?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/8979586532745991977/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2009/02/aspnet-attention-au-controle-image-sans.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/8979586532745991977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/8979586532745991977'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2009/02/aspnet-attention-au-controle-image-sans.html' title='ASP.NET : Attention au contrôle Image sans URL'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-1132512723236781962</id><published>2009-02-15T10:15:00.000-08:00</published><updated>2009-02-17T00:29:50.417-08:00</updated><title type='text'>TechDays 2009 : La démo jQuery</title><content type='html'>Lors de la session sur ASP.NET 4.0, il fut évoqué l'integration de jQuery en complément et non en remplacement, du Framework Microsoft Ajax. La démo sur jQuery ne portait que sur ce Framework et donc sur une simple page HTML. L'exercice, 6 images brutes à réduire et ajouter des effets de mouseover et un agrandissement sur click... en une ligne de code JavaScript.&lt;br /&gt;Voici ma reproduction de ce code qui doit être assez proche de la démo :&lt;br /&gt;&lt;div style="border: 1px solid gray; margin: 15px; padding: 5px; background-color: rgb(240, 240, 240);"&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;&lt;span style="color: rgb(102, 0, 0);"&gt;img&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;alt&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;=""&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;src&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="Images/Butterfly.jpg" /&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;img&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;alt&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;=""&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;src&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="Images/Field.jpg" /&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;img&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;alt&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;=""&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;src&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="Images/Flower.jpg" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;&lt;span style="color: rgb(102, 0, 0);"&gt;img&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;alt&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;=""&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;src&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="Images/Leaves.jpg" /&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;img&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;alt&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;=""&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;src&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="Images/Rocks.jpg" /&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;img&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;alt&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;=""&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;src&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="Images/Tulip.jpg" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;script&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;"text/javascript"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;$&lt;span style="color: rgb(102, 0, 0);"&gt;("&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;img"&lt;/span&gt;).css({height:&lt;span style="color: rgb(102, 0, 0);"&gt;"75px"&lt;/span&gt;, opacity: 0.7, margin:&lt;span style="color: rgb(0, 0, 153);"&gt;"5px"&lt;/span&gt;, border: &lt;span style="color: rgb(102, 0, 0);"&gt;"gray 1px solid"&lt;/span&gt;, padding:&lt;span style="color: rgb(102, 0, 0);"&gt; "5px"&lt;/span&gt;})&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;.hover(&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;(){$(&lt;span style="color: rgb(0, 0, 153);"&gt;this&lt;/span&gt;).css({opacity: 1, border: &lt;span style="color: rgb(102, 0, 0);"&gt;"black 1px solid"&lt;/span&gt;});},&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;(){$(&lt;span style="color: rgb(0, 0, 153);"&gt;this&lt;/span&gt;).css({opacity: 0.7, border: &lt;span style="color: rgb(102, 0, 0);"&gt;"gray 1px solid"&lt;/span&gt;});})&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;.click(&lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;$(&lt;span style="color: rgb(102, 0, 0);"&gt;"#img-preview"&lt;/span&gt;).animate({height:&lt;span style="color: rgb(102, 0, 0);"&gt;"0px"&lt;/span&gt;,width&lt;span style="color: rgb(102, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;"0px"&lt;/span&gt;, marginLeft:&lt;span style="color: rgb(102, 0, 0);"&gt;"0px"&lt;/span&gt;, marginTop:&lt;span style="color: rgb(102, 0, 0);"&gt;"0px"&lt;/span&gt;}, &lt;span style="color: rgb(102, 0, 0);"&gt;"normal"&lt;/span&gt;, &lt;span style="color: rgb(102, 0, 0);"&gt;"linear"&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;(){$(&lt;span style="color: rgb(0, 0, 153);"&gt;this&lt;/span&gt;).remove();});&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;$(&lt;span style="color: rgb(0, 0, 153);"&gt;this&lt;/span&gt;).clone()&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;.css({height:&lt;span style="color: rgb(102, 0, 0);"&gt;"0px"&lt;/span&gt;,width:&lt;span style="color: rgb(102, 0, 0);"&gt;"0px"&lt;/span&gt;, position:&lt;span style="color: rgb(102, 0, 0);"&gt;"absolute"&lt;/span&gt;, left&lt;span style="color: rgb(102, 0, 0);"&gt;:"50%"&lt;/span&gt;, top:&lt;span style="color: rgb(102, 0, 0);"&gt;"50%"&lt;/span&gt;})&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;.attr(&lt;span style="color: rgb(102, 0, 0);"&gt;"id"&lt;/span&gt;, &lt;span style="color: rgb(102, 0, 0);"&gt;"img-preview"&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;.appendTo($(&lt;span style="color: rgb(102, 0, 0);"&gt;"body"&lt;/span&gt;))&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;.animate({height:&lt;span style="color: rgb(102, 0, 0);"&gt;"768px"&lt;/span&gt;,width:&lt;span style="color: rgb(102, 0, 0);"&gt;"1024px"&lt;/span&gt;, marginLeft:&lt;span style="color: rgb(102, 0, 0);"&gt;"-512px"&lt;/span&gt;, marginTop:&lt;span style="color: rgb(102, 0, 0);"&gt;"-384px"&lt;/span&gt;}, &lt;span style="color: rgb(102, 0, 0);"&gt;"normal"&lt;/span&gt;, &lt;span style="color: rgb(102, 0, 0);"&gt;"linear"&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;.click(&lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;(){$(&lt;span style="color: rgb(0, 0, 153);"&gt;this&lt;/span&gt;).animate({height:&lt;span style="color: rgb(102, 0, 0);"&gt;"0px"&lt;/span&gt;,width:&lt;span style="color: rgb(102, 0, 0);"&gt;"0px"&lt;/span&gt;, marginLeft:&lt;span style="color: rgb(102, 0, 0);"&gt;"0px"&lt;/span&gt;, marginTop:&lt;span style="color: rgb(102, 0, 0);"&gt;"0px"&lt;/span&gt;}, &lt;span style="color: rgb(102, 0, 0);"&gt;"normal"&lt;/span&gt;,&lt;span style="color: rgb(102, 0, 0);"&gt; "linear"&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 153);"&gt;function&lt;/span&gt;(){$(&lt;span style="color: rgb(0, 0, 153);"&gt;this&lt;/span&gt;).remove();});});&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;});&lt;/span&gt; &lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;&amp;lt;/&lt;span style="color: rgb(102, 0, 0);"&gt;script&lt;/span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span&gt;Pour télécharger jQuery : &lt;a href="http://docs.jquery.com/Downloading_jQuery"&gt;http://docs.jquery.com/Downloading_jQuery&lt;/a&gt; avec version spécial pour Visual Studio.&lt;br /&gt;&lt;br /&gt;Pour télécharger l'exemple complet : &lt;a href="http://sebdoucet.googlepages.com/jQuery.rar"&gt;http://sebdoucet.googlepages.com/jQuery.rar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-1132512723236781962?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/1132512723236781962/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2009/02/techdays-2009-la-demo-jquery.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/1132512723236781962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/1132512723236781962'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2009/02/techdays-2009-la-demo-jquery.html' title='TechDays 2009 : La démo jQuery'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-3434367744685594750</id><published>2009-02-10T11:15:00.000-08:00</published><updated>2009-02-10T15:15:50.962-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft Parallel Extensions'/><category scheme='http://www.blogger.com/atom/ns#' term='TechDays 2009'/><title type='text'>TechDays 2009 : Microsoft Parallel Extensions , la démo sur 24 processeurs</title><content type='html'>Pour les démos des TechDays sur les Parallel Extensions, un serveur de 24 corps et des résultats impressionnants.&lt;br /&gt;Parallel sur les boucles, PLinq pour Linq To Object et Linq To Xml, Task pour la gestions de taches... le framework promet beaucoup dans la simplification des traitements parallèles.&lt;br /&gt;Disponible en CTP pour les framework  3.5, il est seulement prévu pour être intégré dans le .NET 4.0 et Visual Studio 2010.&lt;br /&gt;Visual Studio 2010 ne sera pas en reste sur les traitements parallèles avec l'ajout d'une multitudes d'outils pour observer et déboguer vos Threads.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=348F73FD-593D-4B3C-B055-694C50D2B0F3&amp;amp;displaylang=en"&gt;Téléchargement de la CTP pour .NET 3.5&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-3434367744685594750?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/3434367744685594750/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2009/02/techdays-2009-microsoft-parallel.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/3434367744685594750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/3434367744685594750'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2009/02/techdays-2009-microsoft-parallel.html' title='TechDays 2009 : Microsoft Parallel Extensions , la démo sur 24 processeurs'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-6420184979297753122</id><published>2009-02-10T10:59:00.001-08:00</published><updated>2009-02-11T13:38:45.788-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVVM'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><category scheme='http://www.blogger.com/atom/ns#' term='TechDays 2009'/><title type='text'>TechDays 2009 : Les MVx</title><content type='html'>Microsoft et ses partenaires sont bien décidé à nous faire totalement abandonné le fichier de code behind : &lt;a href="http://www.asp.net/mvc/"&gt;MVC ASP.NET&lt;/a&gt;, &lt;a href="http://silverlight.net/"&gt;MV VM Silverlight 2&lt;/a&gt; et WPF, le &lt;a href="http://www.codeplex.com/aspnet/Wiki/View.aspx?title=AJAX&amp;referringTitle=Home"&gt;Full Ajax ASP.NET&lt;/a&gt;, etc...&lt;br /&gt;De très bon pattern permettant de supprimer complètement la liaison entre les actions et la présentation.&lt;br /&gt;Microsoft nous démontre en plus que l'utilisation de ce modèle simplifie la mise en place de routines de tests avec ses nouvelles librairies de tests.&lt;br /&gt;Ce modèle permet aussi de rendre le code plus maintenable par son abstraction, scinde la partie design de la partie code, comprend l'implémentation du pattern de commande...&lt;br /&gt;Il s'agit là d'une vrai volonté de Microsoft de nous changer nos habitudes de développement, ce qui n'est pas pour me déplaire.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-6420184979297753122?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/6420184979297753122/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2009/02/techdays-2009-les-mvx.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/6420184979297753122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/6420184979297753122'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2009/02/techdays-2009-les-mvx.html' title='TechDays 2009 : Les MVx'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-9222529576784704560</id><published>2008-07-16T14:33:00.000-07:00</published><updated>2008-07-16T15:19:15.597-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UpdatePanel'/><category scheme='http://www.blogger.com/atom/ns#' term='AjxControlToolKit'/><category scheme='http://www.blogger.com/atom/ns#' term='TabContainer'/><title type='text'>TabContainer : Chargement asynchrone des données lors de l'affichage de l'onglet</title><content type='html'>Le contrôle d'onglet de l'Ajax Control Toolkit permet d'immiter les onglets WinForm.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Le problème :&lt;/span&gt; ce contrôle charge  tous ces onglets même lorsque l'utilisateur ne les utilisent pas. Ce problème se pose d'autant plus si le chargement des onglets est lourd.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Le but :&lt;/span&gt; ne charger les onglets que lorsque vous les ouvrez en évitant de recharger la page complète.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La solution :&lt;/span&gt; elle s'appelle UpdatePanel.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Le principe : &lt;/span&gt;Ajouter un UpdatePanel dans chaque onglet. Chaque UpdatePanel contiendra un bouton dont l'évenement Click chargera et actualisera le contenu. Ensuite, il suffit d'utiliser le PostBack du bouton pour le placer sur la propriété OnClientClick des TabPanels.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La démo :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Code ASP.NET :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;    &lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;ajax:TabContainer &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="TabContainer1"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="server"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;ActiveTabIndex&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="0"&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;ajax:TabPanel &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="server"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;HeaderText&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="TabPanel1"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="TabPanel1"&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;ContentTemplate&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;asp:UpdatePanel &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="server"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="UpadatePanel1"&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                  &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;ContentTemplate&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;asp:Button &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="Button1"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="server"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;Text&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="Refresh" &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(255, 0, 0);"&gt;onclick&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="Button1_Click"&lt;/span&gt; /&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;br &lt;/span&gt;/&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;asp:TextBox &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="TextBox1"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="server"&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;asp:TextBox&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                  &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;ContentTemplate&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;asp:UpdatePanel&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;asp:UpdateProgress &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="server"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="UpadateProgress1" &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;AssociatedUpdatePanelID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="UpadatePanel1"&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;ProgressTemplate&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              Chargement en cours...&lt;br /&gt;              &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;ProgressTemplate&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;asp:UpdateProgress&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;ContentTemplate&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;ajax:TabPanel&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;ajax:TabPanel &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="TabPanel2"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="server"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;HeaderText&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="TabPanel2"&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;ContentTemplate&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;asp:UpdatePanel &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="UpadatePanel2"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="server"&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                  &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;ContentTemplate&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;asp:Button &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="Button2"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="server"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;Text&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="Refresh" &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;onclick&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="Button2_Click"&lt;/span&gt; /&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;br &lt;/span&gt;/&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;asp:TextBox &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="TextBox2"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="server"&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;asp:TextBox&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                  &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;ContentTemplate&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;asp:UpdatePanel&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;asp:UpdateProgress &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;runat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="server"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="UpadateProgress2"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;AssociatedUpdatePanelID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;="UpadatePanel2"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;ProgressTemplate&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              Chargement en cours...&lt;br /&gt;              &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;ProgressTemplate&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;asp:UpdateProgress&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;ContentTemplate&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;ajax:TabPanel&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="color: rgb(153, 0, 0);"&gt;ajax:TabContainer&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Code C# :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;private const string &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;POSTBACK = &lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);font-family:courier new;" &gt;"var {0}_clicked = false; {0}_Click=function(){{if(!{0}_clicked){{Sys.WebForms.PageRequestManager.getInstance()._doPostBack('{1}',''); {0}_clicked=true;}}}};"&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;protected override void &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;OnLoad(EventArgs e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;base&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.OnLoad(e);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:courier new;" &gt;StringBuilder &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;sb = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:courier new;" &gt;StringBuilder&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            sb.AppendFormat(POSTBACK, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;this&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Button1.ID, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;this&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Button1.UniqueID);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            sb.AppendFormat(POSTBACK, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;this&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Button2.ID, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;this&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Button2.UniqueID);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;this&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.TabPanel1.OnClientClick = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;string&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Format&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);font-family:courier new;" &gt;("{0}_Click"&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;this&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Button1.ID);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;this&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.TabPanel2.OnClientClick = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;string&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Format(&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);font-family:courier new;" &gt;"{0}_Click"&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;this&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Button2.ID);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            sb.AppendFormat(&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);font-family:courier new;" &gt;"function pageLoad(sender, args){{{0}_Click();}};"&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;this&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Button1.ID);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;this&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.ClientScript.RegisterStartupScript(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;this&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.GetType(), &lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);font-family:courier new;" &gt;"UPDATE_PANELS"&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;, sb.ToString(), &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;true&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;protected void &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Button1_Click(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;object &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;sender, &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:courier new;" &gt;EventArgs &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:courier new;" &gt;Thread&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Sleep(1000);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;this&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.TextBox1.Text = &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:courier new;" &gt;DateTime&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Now.ToString();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;protected void &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Button2_Click(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;object &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;sender, &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:courier new;" &gt;EventArgs &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:courier new;" &gt;Thread&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Sleep(1000);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:courier new;" &gt;this&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.TextBox2.Text = &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:courier new;" &gt;DateTime&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Now.ToString();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cette démo n'est pas forcément des mieux synthaxée, mais elle explique bien la mise en oeuvre d'un chargment différré des onglets.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-9222529576784704560?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/9222529576784704560/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2008/07/tabcontainer-chargement-asynchrone-des.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/9222529576784704560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/9222529576784704560'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2008/07/tabcontainer-chargement-asynchrone-des.html' title='TabContainer : Chargement asynchrone des données lors de l&apos;affichage de l&apos;onglet'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-4026216742493097374</id><published>2008-07-09T03:54:00.001-07:00</published><updated>2008-07-09T05:11:48.878-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HtmlEncode'/><category scheme='http://www.blogger.com/atom/ns#' term='DataFormatString'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView'/><title type='text'>Le DataFormatString et le GridView</title><content type='html'>Cette propriété permet de formater les données d'une colonne (&lt;span style="font-weight: bold;font-family:courier new;font-size:100%;"  &gt;System.Web.UI.WebControls.BoundField&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;par exemple) afin de les afficher dans un format particulier. Cette propriété fonctionne de la même façon que la méthode "&lt;span style="font-weight: bold;font-family:courier new;font-size:100%;"  &gt;Format&lt;/span&gt;" de &lt;span style="font-weight: bold;font-family:courier new;font-size:100%;"  &gt;System.string&lt;/span&gt;.&lt;br /&gt;On l'utilise souvent pour formater des champs de type &lt;span style="font-weight: bold;font-family:courier new;font-size:100%;"  &gt;System.DateTime &lt;/span&gt;et afficher seulement la date dans le format de notre choix :&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;asp:BoundField &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;DataField&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="LAST_UPDATE"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;DataFormatString&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="{0:dd/MM/yyyy}" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En C#, cela reviendrait à effectuer ceci :&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;string &lt;/span&gt;dtFormatee =  myDate.ToString(&lt;span style="color: rgb(102, 0, 0);"&gt;"dd/MM/yyyy"&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ou&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;string &lt;/span&gt;dtFormatee = &lt;span style="color: rgb(51, 51, 255);"&gt;string&lt;/span&gt;.Format(&lt;span style="color: rgb(102, 0, 0);"&gt;"{0:dd/MM/yyyy}&lt;/span&gt;", myDate);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;C'est bien la dernière méthode qu'utilise le &lt;span style="font-weight: bold;font-family:courier new;font-size:100%;"  &gt;System.Web.UI.WebControls.GridView&lt;/span&gt;, ce qui nous permet d'en déduire que les chaines de formats suivantes sont valide :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;asp:BoundField &lt;span style="color: rgb(255, 0, 0);"&gt;DataField&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="LAST_UPDATE"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;DataFormatString&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="{0:dd} du mois {0:MM}" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;--&gt;&gt; 02  du mois 05&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;asp:BoundField &lt;span style="color: rgb(255, 0, 0);"&gt;DataField&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="LAST_UPDATE"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;DataFormatString&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="Mise à jour un {0:dddd}" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;--&gt;&gt; Mise à jour un mercredi&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;asp:BoundField &lt;span style="color: rgb(255, 0, 0);"&gt;DataField&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="LAST_UPDATE"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;DataFormatString&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="Mise à jour en &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;b&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{0:MMMM}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;/b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; de l'an de grâce &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{0:yyyy}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;/b&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;--&gt;&gt; Mise à jour en  &lt;span style="font-weight: bold;"&gt;juillet&lt;/span&gt; de l'an de grâce &lt;span style="font-weight: bold;"&gt;2008&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Le "bug" rencontré :&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Il ne s'agit pas vraiment d'un bug, mais d'une petite logique pas forcement évidente : Lors de vos développement, ce petit formatage convient parfaitement, mais lors de la mise en production, on s'apperçoit que le format n'est plus pris en compte.&lt;br /&gt;Ceci vient du fait que le champ est encodé en Html (propriété &lt;span style="font-weight: bold;font-family:courier new;font-size:100%;"  &gt;HtmlEncode&lt;/span&gt;) et que du fait que cette propriété est à "&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;True&lt;/span&gt;&lt;/span&gt;", le formatage ne s'applique plus :&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;asp:BoundField &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;DataField&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="LAST_UPDATE"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;HtmlEncode&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="false"&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;DataFormatString&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="{0:dd MMMM}" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-4026216742493097374?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/4026216742493097374/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2008/07/le-dataformatstring-et-le-gridview.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/4026216742493097374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/4026216742493097374'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2008/07/le-dataformatstring-et-le-gridview.html' title='Le DataFormatString et le GridView'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-3143616520937436728</id><published>2008-06-01T04:33:00.000-07:00</published><updated>2008-07-09T05:12:58.366-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflection'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Réflection .NET</title><content type='html'>Une petite démo de réflection .NET permettant de récupérer la valeur d'une propriété d'un objet par son nom sous forme de chaine de caractères. Pour ce petit exercice assez simple, j'ai créé un type de liste générique triable par le nom d'un champs de l'objet en collection, si le champ en question implémente bien &lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;System.IComparable&lt;/span&gt;&lt;/span&gt;, ce qui est le cas des types primaires et courants du framework.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// &amp;lt;sumary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt; &lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt; &lt;summary&gt; &lt;summary&gt;&lt;/summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// Type permettant de spécifier le sens du tri&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// &amp;lt;sumary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt; &lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;br /&gt;public enum &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;font-size:85%;"  &gt;OrderType &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;: &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;int &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;{ Asc = 1, Desc = -1 }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// &amp;lt;sumary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt; &lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// Interface à implémenter pour la gestion de collections triables&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// &amp;lt;sumary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt; &lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;public interface &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;font-size:85%;"  &gt;IOrderableCollection&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// &amp;lt;sumary&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt; &lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// Obtient ou définit la propriété sur laquelle la collection est triée&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// &amp;lt;sumary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt; &lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;font-size:85%;"  &gt;PropertyInfo &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;PropertyOrder { get; set; }&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// &amp;lt;sumary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt; &lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// Obtient ou définit le sens du tri&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// &amp;lt;sumary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt; &lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;font-size:85%;"  &gt;OrderType &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;OrderType { get; set; }&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// &amp;lt;sumary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt; &lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// Tri la liste en fonction du nom du champ et du sens de tri&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// &amp;lt;sumary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt; &lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;void &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Sort(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;string &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;fieldName, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;font-size:85%;"  &gt;OrderType &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;orderType);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// &amp;lt;sumary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt; &lt;summary&gt; &lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt; &lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// Exemple d'implémentation sur une collection generics&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/// &amp;lt;sumary&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;summary&gt; &lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;font-size:85%;"  &gt;public class&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;font-size:85%;"  &gt;OrderableList &lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;t&gt;&lt;/t&gt;&lt;/span&gt;&lt;t&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;font-size:85%;"  &gt; &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;: &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;" &gt;List&lt;/span&gt;&lt;/span&gt;&lt;/t&gt;&lt;span style="color: rgb(0, 0, 0);font-family:trebuchet ms;font-size:85%;"  &gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;t&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);font-family:trebuchet ms;" &gt;&lt;t&gt;&lt;/t&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;t&gt;, &lt;/t&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;" &gt;IOrderableCollection&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;public &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;" &gt;PropertyInfo &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;PropertyOrder { &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;get&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;set&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;public &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;" &gt;OrderType &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;OrderType { &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;get&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;set&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;public void&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt; Sort(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;string &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;fieldName, &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;" &gt;OrderType &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;orderType)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;       {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;this&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;.OrderType = orderType;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;this&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;.PropertyOrder = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;typeof&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;(T).GetProperty(fieldName);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;if &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;this&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;.PropertyOrder != null) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;this&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;.Sort(Compare);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;private int&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt; Compare(T t1, T t2)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;       {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;object &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;obj1 = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;this&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;.PropertyOrder.GetValue(t1, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;null&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;object &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;obj2 = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;this&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;.PropertyOrder.GetValue(t2, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;null&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;" &gt;IComparable &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;obj1Comparable = obj1 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;as &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);font-family:trebuchet ms;" &gt;IComparable&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;if &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;(obj1Comparable &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;!= null&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;                  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;return &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;obj1Comparable.CompareTo(obj2) * (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;int&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;this&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;.OrderType;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;           &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:trebuchet ms;" &gt;return &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;(Les champs sont déclarés pour le dernier compilateur .NET)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;L'exemple est simple et sans doute moins performant que Link, mais il permet de voir comment utiliser la Réflection .NET&lt;br /&gt;&lt;/t&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-3143616520937436728?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/3143616520937436728/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2008/06/une-petite-dmo-de-rflection.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/3143616520937436728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/3143616520937436728'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2008/06/une-petite-dmo-de-rflection.html' title='Réflection .NET'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-1072686727514494559</id><published>2007-12-04T04:51:00.000-08:00</published><updated>2008-07-09T05:13:24.919-07:00</updated><title type='text'>XmlSerializer : Désérialiser correctement votre fichier</title><content type='html'>Lorsque vous utiliser le &lt;span style="font-weight: bold;font-family:courier new;font-size:100%;"  &gt;System.Xml.Serialization.XmlSerializer&lt;/span&gt;, la tentation de lui passer un &lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;System.IO.FileStream&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;directement est grande :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;StringCollection&lt;/span&gt; result = null;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(51, 153, 153);"&gt;FileStream&lt;/span&gt; fs = &lt;span style="color: rgb(0, 0, 153);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;FileStream&lt;/span&gt;(path, &lt;span style="color: rgb(51, 153, 153);"&gt;FileMode&lt;/span&gt;.OpenOrCreate))&lt;br /&gt;{&lt;br /&gt;result = (&lt;span style="color: rgb(51, 153, 153);"&gt;StringCollection&lt;/span&gt;)&lt;span style="color: rgb(0, 0, 153);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;XmlSerializer&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 153);"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(51, 153, 153);"&gt;StringCollection&lt;/span&gt;)).Deserialize(fs);&lt;br /&gt;} &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cela marche souvent très bien, mais la désérialisation n'est pas parfaite (ex : le "\r\n" sont remplacés par "\n").&lt;br /&gt;Afin de désérialiser correctement votre flux, il suffit de modifier légèrement votre code pour passer un &lt;span style="font-weight: bold;font-family:courier new;font-size:100%;"  &gt;System.Xml.XmlTextReader &lt;/span&gt;au lieu du &lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;System.IO.FileStream&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;StringCollection&lt;/span&gt; result = null;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(51, 153, 153);"&gt;FileStream&lt;/span&gt; fs = &lt;span style="color: rgb(0, 0, 153);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;FileStream&lt;/span&gt;(path, &lt;span style="color: rgb(51, 153, 153);"&gt;FileMode&lt;/span&gt;.OpenOrCreate))&lt;br /&gt;{&lt;br /&gt;result = (&lt;span style="color: rgb(51, 153, 153);"&gt;StringCollection&lt;/span&gt;)&lt;span style="color: rgb(0, 0, 153);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;XmlSerializer&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 153);"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(51, 153, 153);"&gt;StringCollection&lt;/span&gt;)).Deserialize(&lt;span style="color: rgb(0, 0, 153);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;XmlTextReader&lt;/span&gt;(fs));&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Et voilà vos données correctement récupérées.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-1072686727514494559?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/1072686727514494559/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2007/12/xmlserializer-dsrialiser-correctement.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/1072686727514494559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/1072686727514494559'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2007/12/xmlserializer-dsrialiser-correctement.html' title='XmlSerializer : Désérialiser correctement votre fichier'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-814789932580314188</id><published>2007-11-14T04:57:00.000-08:00</published><updated>2007-11-14T05:30:13.939-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='WebBrowser'/><title type='text'>Le WebBrowser et le Flash</title><content type='html'>Si vous avez déjà essayé de naviguer sur le Net avec notre ami le WebBrowser du .NET 2.0, vous avez sans doute remarqué qu'il n'apprécit guère le Flash. Le problème, bug, est connu (voir le lien plus bas) et se pose ainsi : Lorsqu'on est sur une application flash, le premier clique de souris marche et après plus rien.&lt;br /&gt;Il s'agirait d'un problème de focus. Voici une solution pour remédier à ce problème :&lt;br /&gt;&lt;br /&gt;Dans une classe héritant de WebBrowser, surchargez la méthode WndProc comme ceci :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="color:#000099;"&gt;protected override void &lt;/span&gt;WndProc(&lt;span style="color:#000099;"&gt;ref&lt;/span&gt; &lt;span style="color:#339999;"&gt;Message&lt;/span&gt; m)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#000099;"&gt;if&lt;/span&gt; (m.Msg == 0x0021 &amp;amp;&amp;amp; !DesignMode)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#339999;"&gt;Control&lt;/span&gt; control = &lt;span style="color:#000099;"&gt;this&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#000099;"&gt;while&lt;/span&gt; (control != &lt;span style="color:#000099;"&gt;null&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;if (control.GetType() == &lt;span style="color:#000099;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#339999;"&gt;ContainerControl&lt;/span&gt;))&lt;br /&gt;{&lt;br /&gt;control.Focus();&lt;br /&gt;&lt;span style="color:#000099;"&gt;break&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;control = control.Parent;&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;Le problème de focus est ainsi réglé en s'assurant que le conteneur principal garde le focus.&lt;br /&gt;&lt;br /&gt;Attention quand même, ce code ne fonctionnera pas si vous insérez votre WebBrowser dans un UserControl (celui ci hérite de ContainerControl), mais la plupart du temps, un UserControl peut se remplacer par un Control, même si cela ne se fait qu'après la mise en place des éléments plus aisée avec le mode Design du UserControl (En général, vous n'aurez qu'à supprimer 2 lignes pas importantes que le Control ne supporte pas).&lt;br /&gt;&lt;br /&gt;Une autre solution de contournement est proposée ici :&lt;br /&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=94320"&gt;https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=94320&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-814789932580314188?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/814789932580314188/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2007/11/le-webbrowser-et-le-flash.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/814789932580314188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/814789932580314188'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2007/11/le-webbrowser-et-le-flash.html' title='Le WebBrowser et le Flash'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-8597762797353051864</id><published>2007-10-28T02:03:00.000-07:00</published><updated>2007-10-28T02:45:40.169-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='COM Interop'/><category scheme='http://www.blogger.com/atom/ns#' term='IDWebBrowserEvents'/><category scheme='http://www.blogger.com/atom/ns#' term='NewWindow3'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='WebBrowser'/><category scheme='http://www.blogger.com/atom/ns#' term='Popup'/><title type='text'>IDWebBrowserEvents &amp; NewWindow3</title><content type='html'>Dans les &lt;a href="http://developpeur-net.blogspot.com/search/label/showModalDialog"&gt;précédents posts&lt;/a&gt;, je vous ai montré comment gérer les Popup's modales du JavaScript en surchargeant les méthodes "ShowDialog...". Mais il reste la méthode JS "window.open" et le lien avec un "target" dans une frame inconnu ou vide. Pour cela, nous allons utiliser une Interface COM du WebBrowser (n'oublions pas que notre WebBrowser est le Wrapper d'un controle ActiveX). L'interface utilisée est "IDWebBrowserEvents" et la méthode qui nous intéresse est "NewWindow3" :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:78%;"&gt;[&lt;span style="color:#339999;"&gt;ComImport&lt;/span&gt;()]&lt;br /&gt;[&lt;span style="color:#339999;"&gt;Guid&lt;/span&gt;(&lt;span style="color:#990000;"&gt;"34A715A0-6587-11D0-924A-0020AFC7AC4D"&lt;/span&gt;)]&lt;br /&gt;[&lt;span style="color:#339999;"&gt;InterfaceType&lt;/span&gt;(&lt;span style="color:#339999;"&gt;ComInterfaceType&lt;/span&gt;.InterfaceIsIDispatch)]&lt;br /&gt;[&lt;span style="color:#339999;"&gt;TypeLibType&lt;/span&gt;(&lt;span style="color:#339999;"&gt;TypeLibTypeFlags&lt;/span&gt;.FHidden)]&lt;br /&gt;&lt;span style="color:#330099;"&gt;public interface&lt;/span&gt; &lt;span style="color:#339999;"&gt;IDWebBrowserEvents&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;[&lt;span style="color:#339999;"&gt;DispId&lt;/span&gt;(273)]&lt;br /&gt;void NewWindow3([&lt;span style="color:#339999;"&gt;In&lt;/span&gt;, &lt;span style="color:#339999;"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:#339999;"&gt;UnmanagedType&lt;/span&gt;.IDispatch)] &lt;span style="color:#330099;"&gt;ref object&lt;/span&gt; pDisp,&lt;br /&gt;[&lt;span style="color:#339999;"&gt;In&lt;/span&gt;, &lt;span style="color:#339999;"&gt;Out&lt;/span&gt;] &lt;span style="color:#330099;"&gt;ref bool&lt;/span&gt; cancel, &lt;span style="color:#006600;"&gt;//Indique si on annule ou non l'événement&lt;/span&gt;&lt;br /&gt;[&lt;span style="color:#339999;"&gt;In&lt;/span&gt;] &lt;span style="color:#330099;"&gt;ref object&lt;/span&gt; flags,&lt;br /&gt;[&lt;span style="color:#339999;"&gt;In&lt;/span&gt;] &lt;span style="color:#330099;"&gt;ref object&lt;/span&gt; URLContext, &lt;span style="color:#006600;"&gt;//URL de la page d'origine&lt;br /&gt;&lt;/span&gt;[&lt;span style="color:#339999;"&gt;In&lt;/span&gt;] &lt;span style="color:#330099;"&gt;ref object&lt;/span&gt; URL); &lt;span style="color:#006600;"&gt;//URL de la Popup&lt;br /&gt;&lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Une fois cette interface ajoutée à votre projet, il nous faut créer une classe qui l'implémente :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:78%;"&gt;&lt;span style="color:#330099;"&gt;public class&lt;/span&gt; &lt;span style="color:#339999;"&gt;WBNewWindow&lt;/span&gt; : &lt;span style="color:#339999;"&gt;StandardOleMarshalObject&lt;/span&gt;, &lt;span style="color:#339999;"&gt;IDWebBrowserEvents&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#330099;"&gt;public void &lt;/span&gt;NewWindow3(&lt;span style="color:#330099;"&gt;ref object&lt;/span&gt; pDisp, &lt;span style="color:#330099;"&gt;ref bool&lt;/span&gt; cancel, &lt;span style="color:#330099;"&gt;ref object&lt;/span&gt; flags, &lt;span style="color:#330099;"&gt;ref object&lt;/span&gt; URLContext, &lt;span style="color:#330099;"&gt;ref object&lt;/span&gt; URL)&lt;br /&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:#33cc00;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:#006600;"&gt;//Traitement des nouvelles fenêtres&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il faut maintenant faire la liaison entre notre contrôle et le traitement de cette événement :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:78%;color:#000000;"&gt;&lt;span style="color:#330099;"&gt;public class&lt;/span&gt; &lt;span style="color:#339999;"&gt;WebBrowser2&lt;/span&gt; : &lt;span style="color:#339999;"&gt;WebBrowser&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#330099;"&gt;private&lt;/span&gt; &lt;span style="color:#339999;"&gt;AxHost.ConnectionPointCookie&lt;/span&gt; _cookieNewWindow;&lt;br /&gt;&lt;span style="color:#330099;"&gt;private&lt;/span&gt; &lt;span style="color:#339999;"&gt;WBNewWindow&lt;/span&gt; _eventNewWindow;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:78%;color:#000000;"&gt;&lt;br /&gt;&lt;span style="color:#330099;"&gt;protected override void&lt;/span&gt; CreateSink()&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#330099;"&gt;base&lt;/span&gt;.CreateSink();&lt;br /&gt;_eventNewWindow = &lt;span style="color:#330099;"&gt;new&lt;/span&gt; &lt;span style="color:#339999;"&gt;WBNewWindow&lt;/span&gt; ();&lt;br /&gt;_cookieNewWindow = &lt;span style="color:#330099;"&gt;new&lt;/span&gt; &lt;span style="color:#339999;"&gt;AxHost.ConnectionPointCookie&lt;/span&gt;(&lt;span style="color:#330099;"&gt;base&lt;/span&gt;.ActiveXInstance, _eventNewWindow, &lt;span style="color:#330099;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#339999;"&gt;IDWebBrowserEvents&lt;/span&gt;));&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:78%;color:#000000;"&gt;&lt;span style="color:#330099;"&gt;protected override void&lt;/span&gt; DetachSink()&lt;br /&gt;{&lt;br /&gt;if (&lt;span style="color:#330099;"&gt;this&lt;/span&gt;._cookieNewWindow != null)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#330099;"&gt;this&lt;/span&gt;._cookieNewWindow.Disconnect();&lt;br /&gt;&lt;span style="color:#330099;"&gt;this&lt;/span&gt;._cookieNewWindow = null;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:#330099;"&gt;base&lt;/span&gt;.DetachSink();&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;....&lt;br /&gt;&lt;br /&gt;Et voilà, la démo ne traite pas l'événement, mais ce qu'il reste à faire coule de source. Ici, on viens de voir comment ajouter un traitement personnalisé d'un interface COM d'un ActiveX.&lt;br /&gt;La méthode la plus propre pour organiser tout ceci consiste à insérer la classe qui implémente l'interface dans celle du WebBrowser et de la rendre privée. Ensuite, vous pouvez créer un événement qui gère les nouvelles fenêtres et le déclancher dans une méthode qui sera appellée par "NewWindow3".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-8597762797353051864?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/8597762797353051864/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2007/10/idwebbrowserevents-newwindow3.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/8597762797353051864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/8597762797353051864'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2007/10/idwebbrowserevents-newwindow3.html' title='IDWebBrowserEvents &amp; NewWindow3'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-6448402187814438458</id><published>2007-10-25T03:04:00.000-07:00</published><updated>2007-10-25T05:11:06.083-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDWebBrowserEvents'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='showModalDialog'/><category scheme='http://www.blogger.com/atom/ns#' term='WebBrowser'/><category scheme='http://www.blogger.com/atom/ns#' term='Popup'/><title type='text'>Exécution de C# via JavaScript</title><content type='html'>Après avoir vu comment remplacer la fonction "showModalDialog" dans le &lt;a href="http://developpeur-net.blogspot.com/2007/10/le-webbrowser-et-ses-popups.html"&gt;précédent post&lt;/a&gt;, on peut se douter que l'on peut personnaliser chaque méthodes du JS comme ceci :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:'Segoe UI';font-size:85%;"&gt;((&lt;span style="color:#2b91af;"&gt;IHTMLWindow2&lt;/span&gt;)&lt;span style="color:blue;"&gt;this&lt;/span&gt;.Document.Window.DomWindow).execScript(&lt;span style="color:#a31515;"&gt;"window.showModelessDialog = function(url, frame, option){ Alert('La méthode que le veux'); }"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"javascript"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;Mais il y a mieux encore : ObjectForScripting. Ceci est une propriété du WebBrowser permettant d'ajouter des options au JavaScript. Vous créez une classe, visible par COM, et vous y insérer vos propres méthodes en .NET. Il ne vous reste qu'à créer une instance de cette classe pour l'attribuer au champ "ObjectForScripting".&lt;br /&gt;&lt;br /&gt;Voici un exemple de classe très simple avec une procédure permettant de remplacer "showModalDialog" :&lt;br /&gt;&lt;span style="font-family:'Segoe UI';font-size:85%;"&gt;&lt;br /&gt;[&lt;span style="color:#339999;"&gt;ComVisible&lt;/span&gt;(&lt;span style="color:#000099;"&gt;true&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color:#000099;"&gt;public class&lt;/span&gt; &lt;span style="color:#339999;"&gt;ObjectScripting&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#000099;"&gt;public object&lt;/span&gt; OpenModal(&lt;span style="color:#000099;"&gt;string&lt;/span&gt; url, &lt;span style="color:#000099;"&gt;object&lt;/span&gt; frame, &lt;span style="color:#000099;"&gt;string&lt;/span&gt; options)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#339999;"&gt;MessageBox&lt;/span&gt;.Show(url, &lt;span style="color:#990000;"&gt;"Messages personnels"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#000099;"&gt;return true&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Vous pouvez ajouter ceci dans le constructeur de votre WebBrowser :&lt;br /&gt;&lt;span style="font-family:'Segoe UI';font-size:85%;"&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;this&lt;/span&gt;.ObjectForScripting = &lt;span style="color:#000099;"&gt;new&lt;/span&gt; &lt;span style="color:#339999;"&gt;ObjectScripting&lt;/span&gt;(); &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Et voici comment remplacer notre méthode "showModalDialog" :&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:'Segoe UI';font-size:85%;"&gt;((&lt;span style="color:#2b91af;"&gt;IHTMLWindow2&lt;/span&gt;)&lt;span style="color:blue;"&gt;this&lt;/span&gt;.Document.Window.DomWindow).execScript(&lt;span style="color:#a31515;"&gt;"window.showModelessDialog = function(url, frame, option){ return window.external.OpenModal(url, frame, option); }"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"javascript"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;Avec cette méthode, on peut imaginer faire la différence avec les Popup's classiques et gérer les fenêtres Modales.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;Attention :&lt;/strong&gt;&lt;/span&gt; Ce type de remplacement peut ouvrir de belles failles de sécurités, veillez à faire simple et à ne pas trop surcharger le JavaScript.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-6448402187814438458?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/6448402187814438458/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2007/10/excution-de-c-via-javascript.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/6448402187814438458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/6448402187814438458'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2007/10/excution-de-c-via-javascript.html' title='Exécution de C# via JavaScript'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-602804680042736256</id><published>2007-10-24T04:39:00.000-07:00</published><updated>2007-10-24T05:24:25.266-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDWebBrowserEvents'/><category scheme='http://www.blogger.com/atom/ns#' term='NewWindow3'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='showModalDialog'/><category scheme='http://www.blogger.com/atom/ns#' term='WebBrowser'/><category scheme='http://www.blogger.com/atom/ns#' term='Popup'/><title type='text'>Le WebBrowser et ses Popup's</title><content type='html'>Le Wrapper de base du WebBrowser dans le .NET Framework 2.0 est assez basique. Pour en faire un navigateur viable, il faut lui ajouter beaucoup d'options, via ses Interfaces COM ou directement en ajoutant de nouvelles fonctionnalités.&lt;br /&gt;L'option du jour, c'est la suppression des Popup's liées au JavaScript, les fenêtres modales : "window.showModalDialog".&lt;br /&gt;Afin de ne pas les supprimer, mais de les transformer en Popup standards et interceptables via l'interface "IDWebBrowserEvents" et sa méthode "NewWindow3" (voir dans un prochain post), voici comment la remplacer par la méthode "window.open" classique :&lt;br /&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:'Segoe UI';font-size:85%;color:blue;"&gt;&lt;br /&gt;protected&lt;/span&gt;&lt;span style="font-family:'Segoe UI';font-size:85%;"&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; OnNavigated(&lt;span style="color:#2b91af;"&gt;WebBrowserNavigatedEventArgs&lt;/span&gt; e)&lt;/span&gt;&lt;br /&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:'Segoe UI';font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:'Segoe UI';font-size:85%;"&gt;((&lt;span style="color:#2b91af;"&gt;IHTMLWindow2&lt;/span&gt;)&lt;span style="color:blue;"&gt;this&lt;/span&gt;.Document.Window.DomWindow).execScript(&lt;span style="color:#a31515;"&gt;"window.showModalDialog = window.open"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"javascript"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:'Segoe UI';font-size:85%;"&gt;((&lt;span style="color:#2b91af;"&gt;IHTMLWindow2&lt;/span&gt;)&lt;span style="color:blue;"&gt;this&lt;/span&gt;.Document.Window.DomWindow).execScript(&lt;span style="color:#a31515;"&gt;"window.showModelessDialog = window.open"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"javascript"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:'Segoe UI';font-size:85%;"&gt;&lt;span style="color:blue;"&gt;base&lt;/span&gt;.OnNavigated(e);&lt;/span&gt;&lt;span style="font-family:'Segoe UI';font-size:85%;"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Pour un premier, sans doute le plus simple, ce petit ajout peut aussi devenir une prise de tête pour rien étant donné la simplicité du code.&lt;br /&gt;Le principe ici est de remplacer la méthode "showModalDialog" par une autre ayant le même prototype.&lt;br /&gt;L'événement peut être aussi annulé en remplaçant par "null" la méthode "window.open".&lt;/p&gt;&lt;p&gt;Ce code est une surcharge de OnNavigated, pour une classe qui hérite de WebBrowser, mais vous pouvez aussi placer ce code dans l'événement "Navigated" de votre WebBrowser.&lt;/p&gt;&lt;p&gt;Afin d'accéder à l'IHTMLWindow2, vous devrez ajouter une référence .NET à "Microsoft.mshtml" et ajouter le namespace "mshtml"&lt;/p&gt;&lt;p&gt;Rappel : Ce code ne sert pas à supprimer les Popup's, seulement à les rendre interceptable par NewWindow2 et/ou NewWindow3 issus de l'interface COM "IDWebBrowserEvents".&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-602804680042736256?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/602804680042736256/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2007/10/le-webbrowser-et-ses-popups.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/602804680042736256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/602804680042736256'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2007/10/le-webbrowser-et-ses-popups.html' title='Le WebBrowser et ses Popup&apos;s'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-8474410176806808538</id><published>2007-10-05T09:35:00.000-07:00</published><updated>2007-10-24T05:25:32.346-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='GetShortPathName'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>L'API GetShortPathName</title><content type='html'>Suite à un besoin, je me suis penché sur la question de retrouver le chemin court d'un fichier (Ex : "C:\PROGRA~1\") afin de pouvoir ouvrir un fichier avec plus de 256 caractères sur le chemin long avec un FileInfo ou un FileStream.&lt;br /&gt;Après avoir cherché s'il existe une méthode Managed dans le Framework, je me suis tourné vers PInvoke.NET pour mapper l'API GetShortPathName :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;[&lt;span style="color:#339999;"&gt;DllImport&lt;/span&gt;(&lt;span style="color:#990000;"&gt;"kernel32.dll"&lt;/span&gt;, CharSet = &lt;span style="color:#339999;"&gt;CharSet&lt;/span&gt;.Auto, SetLastError = &lt;span style="color:#000099;"&gt;true&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color:#000099;"&gt;static extern int&lt;/span&gt; GetShortPathName(&lt;br /&gt;[&lt;span style="color:#339999;"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:#339999;"&gt;UnmanagedType&lt;/span&gt;.LPTStr)] &lt;span style="color:#000099;"&gt;string&lt;/span&gt; lpszLongPath,&lt;br /&gt;[&lt;span style="color:#339999;"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:#339999;"&gt;UnmanagedType&lt;/span&gt;.LPTStr)] &lt;span style="color:#339999;"&gt;StringBuilder&lt;/span&gt; lpszShortPath, &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#000099;"&gt;int&lt;/span&gt; cchBuffer);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;lpszLongPath&lt;/strong&gt; : Le chemin de fichier long (string)&lt;br /&gt;&lt;strong&gt;lpszShortPath&lt;/strong&gt; : Le chemin de fichier court : Un StringBuilder dont vous fixerez d'avant sa capacité à 256 caractères&lt;br /&gt;&lt;strong&gt;cchBuffer&lt;/strong&gt; : Le nombre de caractères du StringBuilder ()&lt;br /&gt;&lt;br /&gt;Une fois cette fonction appellée, récupérez la chaine du StringBuilder pour obtenir le chemin court.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-8474410176806808538?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/8474410176806808538/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2007/10/lapi-getshortpathname.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/8474410176806808538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/8474410176806808538'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2007/10/lapi-getshortpathname.html' title='L&apos;API GetShortPathName'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7876279692288873799.post-7568572044667362322</id><published>2007-09-07T07:04:00.001-07:00</published><updated>2007-09-07T07:43:15.483-07:00</updated><title type='text'>using NameSpace en JavaScript</title><content type='html'>Ben oui, pour ceux qui ne le savaient pas, on peut faire de la POO en JS... et classer nos objets dans des NameSpaces.&lt;br /&gt;Mais, programmeurs .NET, des namespaces c'est bien, mais pouvoir les déclarer en entête, c'est mieux.&lt;br /&gt;Et bien voilà ma solution :&lt;br /&gt;Partez du principe que dans tous vos fichiers JS, il y en a un minimum que vous déclarez dans votre code HTML. Et en entête de ce fichier, placez le code suivant :&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#000099;"&gt;function&lt;/span&gt; using(NameSpace)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#000099;"&gt;if&lt;/span&gt;(eval(NameSpace) != &lt;span style="color:#000099;"&gt;null&lt;/span&gt;) &lt;span style="color:#000099;"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#000099;"&gt;var &lt;/span&gt;XMLHttpRequest = &lt;span style="color:#000099;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;if(window.XMLHttpRequest)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;XMLHttpRequest = &lt;span style="color:#000099;"&gt;new&lt;/span&gt; XMLHttpRequest();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#000099;"&gt;else if&lt;/span&gt;(window.ActiveXObject)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;XMLHttpRequest = &lt;span style="color:#000099;"&gt;new&lt;/span&gt; ActiveXObject(&lt;span style="color:#660000;"&gt;"Microsoft.XMLHTTP");&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;XMLHttpRequest.open(&lt;span style="color:#660000;"&gt;"GET"&lt;/span&gt;, NameSpace + &lt;span style="color:#660000;"&gt;".js"&lt;/span&gt;,&lt;span style="color:#000099;"&gt;false&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;XMLHttpRequest.send(&lt;span style="color:#000099;"&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;eval(XMLHttpRequest.responseText);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;Maintenant, plusieurs conditions pour cette fonction marche :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Votre fichier JS dois quand même être présent&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Il doit porter le même nom que le NameSpace qu'il contient&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Et voilà, maintenant dans mon fichier "Wapiti.WebForm.js", j'ai besoin du fichier "Wapiti.Drawing.js", voilà donc mon entête de fichier JavaScript :&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;using(&lt;span style="color:#660000;"&gt;"Wapiti.Drawing"&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;Comme en C#... j'aime ça &lt;img style="border:0px solid white;" alt="" src="http://sebdoucet.googlepages.com/11.gif" border="0" /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7876279692288873799-7568572044667362322?l=developpeur-net.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developpeur-net.blogspot.com/feeds/7568572044667362322/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://developpeur-net.blogspot.com/2007/09/using-namespace-en-javascript.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/7568572044667362322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7876279692288873799/posts/default/7568572044667362322'/><link rel='alternate' type='text/html' href='http://developpeur-net.blogspot.com/2007/09/using-namespace-en-javascript.html' title='using NameSpace en JavaScript'/><author><name>Sébastien DOUCET</name><uri>http://www.blogger.com/profile/10470971671810862877</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_8tc08bqaLnU/SoxxWnjPncI/AAAAAAAAB7I/e66BJHdQISE/S220/sebdoucet.jpg'/></author><thr:total>0</thr:total></entry></feed>
