Skip to main content

Posts

Showing posts from August, 2006

Formation ASP.net 2.0

Comme promis , j'anime maintenant des formations inter-entreprises . Qualité et faibles tarifs sont au rendez-vous. Pour commencer, ma formation "Développer une application Web dynamique avec ASP.net 2.0" est programmée dès octobre . Inscrivez-vous vite!

Intégrer un flux RSS à un formulaire Web ASP.net

Je souhaitais afficher les derniers articles de ce blog sur mon site Web . Le contrôle serveur Xml sait récupérer du XML et lui appliquer une transformation XSL/T . Et justement, le RSS c'est du XML . Mais il faut écrire la transformation XSL/T, et je me rappelle qu'un professeur d'informatique disait qu'un bon informaticien est fainéant. Après une petite recherche, je suis tombé sur le contrôle serveur RssFeed . En deux temps et trois mouvements, il était intégré à ma page. Et il fonctionne bien. Il est compilé pour le .net framework 1.1 , et fonctionne donc avec Visual Studio 2003 et 2005. A mettre dans vos favoris!

La limite des ObjectDataSources

En ASP.net V2.0 nous avons les contrôles DataSource qui permettent de créer des WebForms de manipulation de données sans écrire de code. Ils sont plutôt bien faits , même si j'ai tendance à leur reprocher le fait qu'ils introduisent l'utilisation de contrôles non-graphiques dans le gabarit des formulaires Web. Aujourd'hui, je suis tombé sur l'une de leurs limitations, plutôt frustrantes. J'imbrique un contrôle Repeater dans un DataGrid , et j'ai besoin que les données du Repeater varient en fonction de la ligne du DataGrid. Le Repeater étant lié à un ObjectDataSource, j''ai simplement écrit que je souhaite récupérer comme paramètre du DataSource une colonne des données de la ligne courante : <asp:ObjectDataSource ID="ObjectDataSourceSessionsFutures" runat="server" SelectMethod="SessionsFutures"     TypeName="Training.Sessions">     <SelectParameters>         <asp:Parameter DefaultValue=&q

Requêtes de TableAdapters paramétrées et Access

Vous connaissez mon point de vue sur les TableAdapters : ce ne sont pas mes grands amis. Mais comme ils permettent de créer des formulaires simplement sous Visual Studio 2005 , j'apprends à vivre avec pour simplifier la vie de mes clients. Pour chaque TableAdapter , on peut créer des requêtes qui seront stockées dans la définition du DataSet typé et accessibles en tant que méthodes du TableAdapter. Pour leur passer des paramètres , j'étais habitué à utiliser des requêtes du style: SELECT Champ FROM Table WHERE Valeur = @Param Mais, à ma grande surprise, ça ne fonctionnait plus. Pourquoi? Parce que j'utilisais Access . Dans ce cas, la requête doit être du style: SELECT Champ FROM Table WHERE Valeur = ? J'ai eu du mal à trouver cette réponse, et je ne suis pas le seul si on en juge ces articles sans réponse correcte: article 1 , article 2 . En fait, c'est le provider utilisé qui détermine la façon de nommer les paramètres: avec SqlClient c'est les &q

Permettre le chargement dynamique des noeuds d'un TreeView

J'ai besoin d'afficher sous la forme d'un arbre les données d'une grosse base de données. La méthode bête consiste à récupérer toutes les données d'un coup et laisser l'utilisateur naviguer dedans. Une méthode plus fine est de ne charger que le premier niveau de noeuds, et lorsque l'utilisateur clique sur le signe "+" à côté d'un noeud, d'aller chercher les données correspondantes au niveau suivant en base. Bref, de charger au fur et à mesure (dynamiquement) les données. Cependant, s'il n'y a pas de noeuds sous les noeuds de premier niveau, le signe "+" ne s'affichera pas à côté de ceux-ci. Comment l'afficher? Le TreeView des Windows Forms ne semble pas le permettre, contrairement à celui des WebForms qui prévoit l'affichage dynamique . Je n'ai rien trouvé de mieux que d'ajouter un sous-noeud temporaire, que je supprime au moment ou l'utilisateur veut voir les sous noeuds. Ce n'est pas tr

Automatiser un déclenchement d'événement thread-safe en C#

J'ai fait un composant détectant la présence du réseau, car la classe NetworkChange était trop limitée pour les besoins d'un client. Ce composant émet périodiquement des pings vers un serveur pour détecter sa disponibilité. Lorsque le serveur devient accessible ou inaccessible, un événement est levé. Le problème, c'est que si je lève simplement l'événement en appelant le (tableau de) délégué(s) correspondant, le gestionnaire d'événements est appelé par le thread de travail qui fait les pings. Or, en Windows Forms , je n'ai pas le droit de mettre à jour un contrôle avec un thread autre que celui qui est affecté à ce contrôle . Plutôt qu'un long discours, voici le code qui détecte le fait que le gestionnaire d'événements est au sein d'un contrôle, et invoque le gestionnaire d'événements avec le thread du contrôle le cas échéant: if (ServerAvailabilityChanged != null) {     foreach (ServerAvailabilityChangedEventHandler targetHandler in Serv

Debug = true

Lorsqu'une application ASP.net est déployée, on ne doit pas trouver de debug="true" dans le fichier web.config . C'est vrai pour un certain nombre de raisons, dont la performance n'est pas la moindre. Malheureusement, si la procédure de déploiement n'est pas rigoureuse, c'est le genre d'instruction qui peut passer d'une machine de développement à une machine en production. Si, si, j'ai des exemples. Bonne nouvelle: Tess nous indique qu'en ASP.net V2.0, il est possible de demander à faire fonctionner toutes les applications ASP.net en debug="false", quelle que soit la valeur de cet attribut dans leur web.config. Et c'est simple à faire: il suffit d'ajouter l'élément suivant dans le fichier machine.config : <configuration>     <system.web>           <deployment retail=”true”/>     </system.web> </configuration> Et c'est tout! En outre, cet élément désactive l'affichage d

Access permet-il réellement un accès distant?

Microsoft Access peut être un gestionnaire de base de donnée intéressant puisqu'il fait souvent partie des licences Office des entreprises. Pour permettre un accès distant à une base Access partagée entre plusieurs client, il suffit de placer le fichier *.mdb correspondant dans un répertoire partagé . C'est une solution très simple à mettre en oeuvre, mais l'avantage s'arrête là dès que l'on veut gérer des bases volumineuses . En effet, le moteur d'Access, Jet, tourne sur les machines clientes . Si je fais une requête SELECT * FROM MaTable WHERE Date>#2006/08/01#, c'est toute la table MaTable qui va être parcourue, autrement dit toutes les données de la table vont transiter entre le serveur et le client, alors que je n'ai besoin que des plus récentes d'après ma requête. En utilisant un vrai serveur, comme SQL Server (ou Oracle, bien sûr), Les seules données transitant entre le client et le serveur seraient la requête et les lignes de MaTable q

Technique: Introduction à Windows Workflow Foundation (WF)

Windows Workflow Foundation , qui fait partie du .net Framework 3.0 , permet de créer simplement des tâches et de définir graphiquement (avec Visual Studio) ou en XML (XOML plus exactement) leur chemin d'exécution (workflow). Avec des conditions, des paramètres et tout et tout. Ce dont presque toute application a besoin, en somme. Pour plonger dans cette prometteuse technologie, Sahil Malik nous propose un article succint sur la réalisation d'un "Hello, World" avec WF .

Technique: Appliquer un thème à toutes les pages

Dans un article précédent , je n'arrivais pas à trouver une manière centralisée d' appliquer un thème (indiqué dans le Profile ) à toutes les pages de l'application. Daniel Tizon m'a fourni la solution: dans le global.asax , il suffit de traiter l'événement Pre_Init de toutes les pages. Le code qu'il m'a fourni est de surcroit un exemple de simplicité: protected void Application_PreRequestHandlerExecute(object sender, EventArgs e) { System.Web.UI.Page Page = HttpContext.Current.Handler as System.Web.UI.Page; if (Page != null) Page.PreInit += new System.EventHandler(Page_PreInit); } void Page_PreInit(object sender,EventArgs e) { System.Web.UI.Page Page = sender as System.Web.UI.Page; if (Page != null) { if(Profile.Theme!=null) Page.Theme = Profile.Theme; } } Merci Daniel.

Technique: Le mythe des procédures stockées

Jusqu'à il y a peu, Microsoft nous recommandait d'utiliser des procédures stockées plutôt que des requêtes SQL générées pour exécuter des requêtes sur SQL Server depuis une application. Cela permet notamment d'avoir une granularité plus fine sur la sécurité et, nous disait-on, une exécution plus rapide puisque SQL Server pouvait pré-calculer le meilleur chemin d'exécution de la requête. Mais depuis que Microsoft a décidé de générer les requêtes depuis l'application avec LinQ, les procédures stockées sont devenues plus lentes. Je viens encore d'en voir la justification de Microsoft : "une requête SQL paramétrée s'exécute plus vite que la procédure stockée équivalente, puisque SQL Server ne peut optimiser correctement le chemin d'exécution qu'une fois qu'il a la valeur du paramètre". Et tout le monde semble gober leur explication. Soyons honnêtes: pourquoi Microsoft n'ajoute pas une option sur les procédures stockées qui permet de

Technique: Convertir du C# en VB.net

J'ai créé une classe en C# pour une formation, et il faut aussi la fournir en VB.net . Comme je déteste le travail bête et méchant, j'ai fait une petite recherche et j'ai trouvé plusieurs services de conversion . Cette page a fonctionné presque parfaitement avec mon code. Deux copier-coller et un peu de correction, et le tour était joué. Merci à Andres Aguiar pour avoir indiqué cette page.

Technique: XAML alias WinASP.net

Avec ASP.net, l e développement Web avait clairement pris une remarquable avance sur le développement Windows (les Windows Forms), en se basant sur ce principe simple: la séparation de la présentation et du code. En ASP.net , la présentation se décrit en XML dans un fichier .aspx et la logique en langage .net dans un autre fichier. En Windows Forms , tout est mélangé dans le même fichier. Visual Studio 2003 masquait ce mélange en créant une section de code "cachée", tandis que Visual Studio 2005 place le code de présentation dans un autre fichier qui fait pourtant partie de la même classe. Avec Windows Presentation Foundation (anciennement Avalon), nous avons enfin droit à la séparation présentation / code dans le monde des applications Windows. Ce qui permet notamment de faire travailler indépendamment un graphiste et un programmeur sur le même formulaire. Et la bonne nouvelle c'est que WPF est intégré au .net Framework 3.0 , qui tourne sous Windows XP et Vista. Pour m

Technique: Thèmes dynamiques: pas encore au point

Avec les thèmes d'ASP.net 2.0, on peut facilement changer l'apparence d'un site . Il suffit de changer le nom du thème à utiliser dans le fichier web.config. Mais c'est un changement statique , fait par l'administrateur du site. Comment faire si l'on veut qu'un utilisateur puisse choisir lui-même un thème pour tout son site? Il existe la propriété Theme sur chaque Page, que l'on peut régler dynamiquement, mais le gros problème c'est que la propriété Theme n'est pas disponible sur la classe Master (pour les master pages). Nous sommes donc condamnés à écrire sur chaque page le code affectant dynamiquement le thème. C'est lourd. L'autre possibilité est d' écrire ce code dans une classe de base (héritant de la classe Page), dont hériteraient toutes nos pages. C'est mieux, mais ça oblige à faire hériter toutes nos pages de cette classe de base. Or Visual Studio n'a pas d'option qui permettrait d'avoir cet héritage auto