FAQ
Date de publication : 01/01/2006
Dernière mise à jour : 22/09/2007
Cette faq a été réalisée pour répondre aux questions les plus fréquemment posées sur le forum .
Je tiens à souligner que cette faq ne garantit en aucun cas que les informations qu'elle contient sont correctes. Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez Comment participer à cette faq ?.
Sur ce, je vous souhaite une bonne lecture.
Ont contribué à cette FAQ :
Clement Cunin - David Pedehourcq - nannous- cyrillus76
- - rami - leduke - Le vieux - Déclic - CyKloNe
- - lololefada- jane2002 - bidou - krest - Didier
Danse - Emerica- Louis-Guillaume Morand - Keihilin Thomas Lebrun - abelman - Ronald Vasseur - Xavier Talour - Laurent Dardenne - neguib - doccpu - nico-pyright(c)StormimOn - Olivier Delmotte - jackpot - Mehdi Feki Stéphane Reip - Michaël LEBRETON - sam_XIII (Samuel
Beauvois) - Ludovic Lefort - Immobilis - Lutecefalco - MattC -
1. Informations générales (4) 5
2. Avant de commencer (11) 6
3. Installation (10) ..9
4. WebForms (154) .12
4.1. Application (14) ..13
4.1.1. (7) .14
4.1.2. Gestionnaire HTTP et modules HTTP (7) 17
4.2. Pages (15) .. 21
4.2.1. Cycle de vie (1) ..29
4.3. Contrôles (106) 31
4.3.1. Général (8) .32
4.3.2. Contrôles serveur (WebControl) (66) ..36
4.3.2.1. Contrôles HTML (HtmlControls) (2) ..37
4.3.2.2. Contrôles standards (25) .38
4.3.2.2.1. Button (1) 39
4.3.2.2.2. CheckBox (1) 40
4.3.2.2.3. DropDownList (10) 41
4.3.2.2.4. Label (4) ..48
4.3.2.2.5. Repeater (1) 50
4.3.2.2.6. TextBox (4) 51
4.3.2.2.7. UploadFile (1) ..52
4.3.2.3. Contrôles riches (21) 53
4.3.2.3.1. Calendar (2) .. 54
4.3.2.3.2. DataGrid (19) 56
4.3.2.4. Contrôles AJAX (3) ..644.3.2.5. Contrôles Silverlight (2) .65
4.3.2.6. WebControls Gratuits (13) 67
4.3.3. Contrôles personnalisés (Custom Controls) (6) . 71
4.3.4. Contrôles de validation (17) .75
4.3.4.1. RequiredFieldValidator (2) 78
4.3.4.2. RangeValidator (1) .79
4.3.4.3. CompareValidator (1) ..80
4.3.4.4. RegularExpressionValidator (2) . 81
4.3.4.5. CustomValidator (3) . 82
4.3.4.6. ValidationSummary (1) .. 85
4.3.5. Contrôles utilisateur (User Controls) (9) 86
4.4. Scriptlets (5) ..92
4.5. Evénements (1) 96
4.6. Web.Config (10) .98
5. Coté serveur et C# (45) 102
5.1. Manipulations des fichiers (12) 104
5.2. Manipulations des processus (1) . 110
5.3. Manipulations des nombres (3) 111
5.4. Manipulations des chaînes de caractères (2) .113
5.5. Manipulations des dates (3) 114
5.6. Conversions (4) .116
5.7. WMI (2) 119
5.8. Transferts FTP (2) .. 121
5.9. Divers (13) ..123
6. Programmation coté client (24) 128
6.1. Javascript (23) 129
6.1.1. Communication Javascript et Code Behind (4) 130
6.1.2. Fenêtre et Popup (8) ..132
6.1.3. Impression (3) 135
6.1.4. Sessions (2) .137
6.1.5. Manipulation du clavier (2) 139
6.1.6. Divers (3) .140
6.2. Ajax (1) .142
7. Gestion de l'état (21) .143
7.1. ViewState (1) .144
7.2. Session State (8) ..145
7.3. Application State (2) ..149
7.4. Cache (3) ..150
7.5. Cookies (3) ..152
7.6. Transferer des données entre les pages (4) 153
8. Themes, MasterPage (5) ..156
8.1. MasterPage (3) ..157
8.2. Themes (2) ..158
9. Navigation (20) .159
9.1. General (10) 160
9.1.1. Urls (5) ..162
9.1.2. Informations sur le client (3) .165
9.2. Redirections (5) .166
9.3. Site Map (5) 168
10. Travailler avec des données (32) . 171
10.1. (24) .. 172
10.1.1. Connexion (4) . 173
10.1.2. Requêtes (7) .174
10.1.3. Divers (11) 179
10.1.4. SMO (2) .183
10.2. Liaison de données (Data Binding) (4) .184
10.3. Crystal Report (4) .187
11. Visual Studio (24) 189
11.1. Internationalisation (7) 194
12. Xml et WebServices (13) .197
13. Securité (2) 201
14. Déploiement et IIS (7) 202
Auteurs :, |
Je tiens à remercier tout particulièrement LFE pour son travail sur la coloration syntaxique du code, et pour toutes les petites mises à jour du système de FAQ qui ont été réalisées. Je remercie aussi : Clément Cunin pour son travail sur ce système de génération de FAQ. Nono40 pour son outil d'édition XML sans lequel la FAQ serait sortie bien plus tard ;-). Alacazam pour la correction de l'orthographe ;-). L'ensemble de l'équipe des rédacteurs depour leurs remarques constructives. |
Sommaire > Informations générales | |
| |
Auteurs :, | |
Le but :Cette faq a été conçue pour être la plus simple possible d'utilisation. Elle tente d'apporter des réponses simples et complètes aux questions auquelles ont souvent été confrontés les développeurs . L'organisation :Les questions sont organisées par thème, rendant la recherche plus facile. Les réponses :Les réponses peuvent être complétées de liens vers d'autres réponses, vers la documentation en ligne de Microsoft ou vers un autre site en rapport. Nouveautés et mises à jour :Lors de l'ajout ou de la modification d'une question/réponse, un indicateur est placé à coté du titre de la question. Cet indicateur reste visible pour une durée de 15 jours afin de vous permettre de voir rapidement les modifications apportées. J'espère que cette faq pourra répondre à vos questions. N'hésitez pas à nous faire part de tous commentaires/remarques/ critiques. | |
lien : Comment participer à cette faq ? |
Auteurs :, Plusieurs compétences sont actuellement recherchées pour améliorer cette faq : Rédacteur :Bien évidemment, toute nouvelle question/réponse est la bienvenue. Correcteur :Malgré nos efforts des fautes d'orthographe ou de grammaire peuvent subsister. Merci de contactersi vous en débusquez une Idem pour les liens erronés. |
lien : Quels sont les droits de reproduction de cette faq ? |
Auteurs :, |
Merci de contacter les auteurs pour toute copie, intégrale ou partielle de ce document, voir Comment participer à cette faq ?. |
lien : Comment participer à cette faq ? |
Auteurs :, |
TOUS !!! ;) On peut se connecter à tous les SGBD via ODBC il suffit donc que le SGBD possède des drivers ODBC. Cependant, on sait qu'une connexion à un SGBD via ODBC a tendance à faire légèrement chuter les performance par rapport à des drivers natifs. Avec le framework .NET on dispose de drivers natifs pour SQL-server dans le namespace : .SqlClient . Il existe aussi des drivers natifs pour d'autres SQGBD. Pour MySQL il existe 2 drivers natifs : |
Sommaire > Avant de commencer | |
| |
Auteurs :,, | |
Le plus simple pour faire de l' est d'avoir un Visual studio (2008, 2005). C'est un IDE qui possède de nombreux outils permettant d'améliorer l'efficacité du developpement , il faut par contre disposer d'une licence. On peut également télécharger un environnement de développement gratuit grâce àen combinaison avec une version du framework .NET. Enfin, il est possible de faire de l'et d'héberger ses pages sous apache. Mono supporte cependant à ce jour jusqu'à la version 2.0 du pour . Notez qu'on peut également faire de l' avec un simple éditeur de texte et un serveur web, par exemple IIS. • Soit "forcer" l'installation de IIS sous windows XP familial, à l'aide d'un CD d'une version de windows possédant IIS • Soit installer cassini : un IIS5 "light" qui permet le developpement mais pas la mise en production. Cassini est un composant de webmatrix. note : l'installation de cassini est la solution la plus simple. | |
lien :lien :lien : lien : |
Auteurs :, |
Il est possible de faire de l' avec le bloc note. Cependant, je vous conseille fortement d'utiliser un IDE, surtout qu'il en existe des gratuits ;) Pour plus de renseignements sur les outils gratuits ou payants avec les témoignages de développeurs : |
lien : lien : |
• dbProvider qui est payant :
• MySQLnet qui est gratuit, mais encore en béta :
Auteurs :, |
Il s'agit plutôt de nouveautés de C# 3.0 qui sont utilisables à travers des projets . - Les initialiseurs d'objets, qui permettent d'instancier des objets et leurs propriétés en un nombre de lignes de coderéduit. - Les déclarations de types implicites, avec l'utilisation du mot clé var - Les types anonymes, qui permettent de créer des types à la compilation - Les expressions lambdas, pour simplifier l'utilisation de delegates - Les méthodes d'extensions, qui permettent de rajouter des fonctionnalités à des classes |
Auteurs :, |
Il s'agit essentiellement de l'intégration de LINQ : avec notamment |
Pour Oracle il y a aussi des drivers natifs pour .NET, cet article de MSDN vous explique pourquoi et comment utiliser les drivers natifs d'Oracle en .NET
A l'heure où j'écris cette FAQ, d'autres drivers natifs pour .NET sont en préparation, et IBM a annoncé prochainement des drivers pour DB2.
Puis-je avoir une application ASP3 et une application sur le même serveur ? |
Auteurs :, |
lien : Peut-on récupérer des variables de sessions ASP3 en et inversément ? |
Auteurs :, |
.NET 2.0 améne quelques nouveautés par rapport à la version 1.1. On peut noter les classes génériques (semblables aux templates C++ mais avec beaucoup moins d'erreurs possibles). C'est principalement en que l'on peut trouver le plus de nouveautés avec principalement: - nouveaux contrôles (login, ) - sécurité améliorée et conception facilitée (il n'est plus nécessaire de gérer ses accès à la base de données, ) - master pages - accès aux données facilités - webparts - profils utilisateurs - thèmes |
Quels sont les équivalents de date() et time() utilisées en asp ? | |
Auteurs :, | |
Certes, les fonctions asp paraissent plus simples à écrire mais étant orienté objets, cette notation est tout à fait logique: | |
.ToShortDateString() | |
pour récupérer la date et | |
.ToShortTimeString() | |
pour l'heure. |
- LINQ to Object - LINQ to DataSet - LINQ to XML- LINQ to SQL Et de l'intégration d' AJAX et d'un framework unifié pour le développement Ajax. On aura aussi à dispositions des nouveaux contrôles serveur ou des contrôles améliorés, tel le ListView ou le DataPager. Le framework 3.5 permet aussi le support WCF pour RSS, JSON, |
Existe-t-il un moyen de convertir du en C# et inversément ? |
Auteurs :, |
Bien sûr. D'ailleurs,l'a mis en ligne pour vous: |
Auteurs :, |
Oui c'est possible Pour plus d'infos: |
Puis-je écrire le code de mon application en différents langages ? |
Auteurs :, |
Non, ce n'est pas possible. Cependant vous pouvez écrire les user controls dans un langage et le code de l'application dans un autre. |
Sommaire > Installation | |||
| |||
Auteurs :, 1)Installer IIS 2)Installer la dernière version de MDAC 3)Installer le dernier service pack pour votre version de windows 4)Installer la dernière version du framework .NET 5)Faire toutes les mises à jours nécessaires pour windows, IIS et le framework .NET Je n'ai jamais vu de problème si on installe les divers composants dans cet ordre là. | |||
lien : | |||
Mes webforms ne s'affichent pas et pourtant leur propriété Visible est à true ! | |||
Auteurs :, | |||
Si ce problème vient aprés l'installation du framework, c'est que vous n'avez surement pas installé les divers composants dans l'ordre conseillé Que faut-il installer et dans quel ordre pour faire de l' ?. Mais pas de panique il existe un moyen simple pour remédier à ça ;-) 1)Ouvrez la console de commande 2)Allez dans le répertoire courant du framework .NET : $SYSTEMROOT\\Framework\v1.********\ 3)Exécutez : -i | |||
lien : Que faut-il installer et dans quel ordre pour faire de l' ? | |||
J'ai des problèmes d'installation sur un serveur contrôleur de domaines. Que faire ? | |||
Auteurs :, | |||
Ce problème existe avec le framework .NET 1.0, Ce bug a été corrigé dans le framework .NET 1.1. Si vous installez IIS et le framework .NET sur un serveur controleur de domaine, vous aurez une erreur : "Server Application Unavailable The web application you are attempting to access on this web server is currently unavailable. Please hit the "Refresh" button in your web browser to retry your request. Administrator Note: An error message detailing the cause of this specific request failure can be found in the system event log of the web server. Please review this log entry to discover what caused this error to occur." Et dans le journal d'erreurs de IIS, deux erreurs : " could not be launched because the username and/or password supplied in the processModel section of the config file are invalid." " could not be started. HRESULT for the failure: 80004005 " | |||
J'ai copié l'application sur une machine mais la page est introuvable, que faire ? |
Auteurs :, |
La plupart du temps, cela est dû au fait que le répertoire virtuel n'a pas été créé. Effectivement, l'habitude de l'utilisation d'environnements de développement tels que Visual Studio font que les bonnes habitudes ont tendance à se perdre ;) Concrètement, lorsque Visual Studio crèe une application, il crée un répertoire dans le dossier InetPub\wwwroot (par défaut) ainsi qu'un répertoire virtuel dans IIS. Pour l'effectuer de manière manuelle, il suffit de se rendre dans les outils d'administration, cliquer sur "Services Internet (IIS)". |
username mais cela implique que votre process aura des droits d'admin sur votre serveur ce qui n'est pas conseillé au niveau de la sécurité. |
lien : |
Auteurs :, |
Ce problème arrive fréquemment, lorsqu'on déploie un site en utilisant Access comme SGBD. Lorsque l'on installe la version redistribuable du framework .NET sur une machine, les droits du user ASPNET sont plus restreints que lorsqu'on installe le sdk du framework et un IDE. Par défaut, le user ASPNET n'a pas les droits d'écriture sur le répertoire dans lequel se trouve votre fichier .mdb. Le compte ASPNET, qui accède à la base via OleDB, ne peut donc pas, par défaut, créer le fichier .ldb qui permet la gestion des verrous sous access. D'où le message d'erreur ! La solution consiste à donner des droits en écriture sur le répertoire où se trouve le fichier .mdb au user ASPNET. Attention : pour des raisons de sécurité, il vaut mieux "isoler" le .mdb de votre base access dans un répertoire. Vous limitez ainsi les dommages en cas de hack du compte utilisateur ASPNET. |
J'ai un message d'erreur à l'ouverture de concernant la version d', à quoi cela est-il dû ? |
Auteurs :, Cet exécutable se trouve dans le répertoire du Framework, à savoir "c:\windows\\Framework \" où XXXX peut varier. |
Est il possible de faire cohabiter plusieurs versions du framework sur une même machine ? |
Auteurs :, |
Il est tout à fait possible d'installer un framework version 1 et un version 2 sur la même machine sans aucun souci. Attention, à l'heure actuelle, la désinstallation d'une version 2 peut poser problème (suppression d'éléments nécessaires pour faire fonctionner une version 1). |
Enfin, pour finir, vous devriez voir "Site Web > Site Web par défaut" Si c'est bien le cas, un simple clic droit vous ouvrira un menu contextuel permettant d'ajouter un nouveau répertoire virtuel. Il ne reste plus qu'à choisir le répertoire et à lui donner les droits.
Je ne trouve pas d'utilisateur ASPNET sur Windows 2003. Que dois-je faire ? |
Auteurs :, |
Nous sommes parfois amenés à réaliser des applications sous Windows Xp pour ensuite les porter en production sur un Windows 2003. Souvent aussi, nous donnons les droits à l'utilisateur ASPNET d'exécuter des procédures stockées en faisant un GRANT TO ASPNET. Malheureusement, ASPNET n'existe plus sous Windows 2003. Il est remplacé par IIS_WPG. Il faut donc donner les droits à IIS_WPG au lieu de ASPNET. |
J'utilise Access et j'obtiens l'exception suivante: "L'opération doit utiliser une requête qui peut être mise à jour" lors d'un INSERT ou d'un UPDATE. Que faire ? |
Auteurs :, |
L'utilisateur ASPNET ne peut accéder aux répertoires, pour des raisons de sécurité, que si vous l'avez autorisé de manière explicite. Il est donc nécessaire de donner les droits à ASPNET pour le répertoire dans lequel se trouve votre fichier Access. |
Mon navigateur me demande si il faut afficher ou télécharger la page lors de l'appel d'un fichier .aspx. Est-ce normal? |
Auteurs :, IIS ne sait pas faire le mapping entre l'extension et l'action à effectuer. Cela peut être dû à plusieurs raisons, la plus fréquente étant le fait d'avoir réinstallé IIS après avoir installé . Pour corriger le problème, utilisez l'utilitaire . |
Sommaire > WebForms | |||
| |||
Auteurs :, | |||
Lorsque l'on utilise <!-- -->, la page envoyée au client contient les commentaires et tout ce qui se trouve entre les deux. Pour éviter d'envoyer une partie de la page, il suffit d'utiliser <%-- --%> Dans ce cas, tout ce qui se trouve entre ces balises ne sera pas pris en compte par le serveur. | |||
Faut-il privilégier le code-behind pour des raisons de performance ? | |||
Auteurs :, | |||
Que l'on utilise le code-behind ou non, les performances sont identiques. Cependant, il est plus aisé de maintenir une application dont le code est séparé de la partie visuelle. | |||
lien : | |||
Quelle est la différence entre Src et Codebehind dans les tags de compilation ? | |||
Auteurs :, | |||
Codebehind est utilisé quand le code est compilé. Si vous fournissez les fichiers sources, il est nécessaire d'utiliser Src. Les fichiers seront ainsi compilés à l'exécution (Just In Time). | |||
Sommaire > WebForms > Application |
Auteurs :, | |
Le nous est d'une grande utilité dans ce cas. | |
NamespaceDeveloppez PublicClassGlobal Inherits .HttpApplication |
Sommaire > WebForms > Application > | |
| |
Auteurs :, | |
lien : |
Auteurs :, | |
Ce fichier se trouve obligatoirement dans le répertoire racine de l'application . Il y en a un et un seul par application. | |
lien : | |
Auteurs :, | |
NamespaceDeveloppez PublicClassGlobal Inherits .HttpApplication PublicSharednbHitsAsInteger ProtectedSubApplication_Start(ByValsenderAsObject,ByValeAsEventArgs) nbHits=0EndSub ProtectedSubApplication_BeginRequest(ByValsenderAsObject,ByValeAsEventArgs) (System.Threading.Interlocked.Increment(nbHits), nbHits-1) EndSub EndClass EndNamespace | |
Comment envoyer un mail décrivant l'érreur quand mon application lève une exception ? | |
Auteurs :,, | |
Dans le : | |
Imports Imports SubApplication_Error(ByValsenderAsObject,ByValeAsEventArgs) |
Comment savoir le temps nécessaire à l'exécution d'une requête? | |
Auteurs :, | |
NamespaceDeveloppez PublicClassGlobal Inherits .HttpApplication PublicSharedtempsAsInteger PrivatedebutAsDateTime ProtectedSubApplication_BeginRequest(ByValsenderAsObject,ByValeAsEventArgs) debut=EndSub ProtectedSubApplication_EndRequest(ByValsenderAsObject,ByValeAsEventArgs) temps=debut-EndSub EndClass EndNamespace | |
Et dans la page où l'on souhaite afficher cette durée: | |
=Global.temps.ToString | |
lien : |
DimexAsException=Server.GetLastError().GetBaseException() Using messageAsNewMailMessage() message.IsBodyHtml=True message.Priority= DimfromAsNewMailAddress("") Dim[to]AsNewMailAddress("") DimBoiteBugAsNewMailAddress("") message.Sender=from message.[To].Add([to]) message.[To].Add(BoiteBug) message.Subject=ex.Message =Server.HtmlEncode(chaine.ToString()) DimsmtpAsNewSmtpClient("localhost") (message) EndUsing EndSub | |||
Remarque: Il se peut que le serveur SMTP refuse l'envoi de l'email dans le cas où l'on spécifie une adresse mail invalide pour la propriété From. | |||
repasse plusieurs fois dans le Session_Start de mon application alors que je ne change pas de Session, est-ce normal? | |||
Auteurs :, | |||
Bien sûr que non, ce n'est pas normal. Actuellement, je n'ai rencontré ce problème qu'avec une utilisation de ZoneAlarm sur la machine sur laquelle se trouve l'application. Vérifiez que vous ne possédez pas ce firewall ou, en tout cas, qu'il n'est pas actif car il empêche la création d'un cookie temporaire nécessaire pour garder en mémoire le SessionID. | |||
Dois-je plutôt utiliser un HttpModule ou bien le ? |
Auteurs :, |
Un module Http accède aux mêmes événements et aux mêmes éléments que le . Pourquoi alors utiliser un HttpModule plutôt que le ? La première chose qui vient à l'esprit est la réutilisabilité. J'ai par exemple développé un module d'url rewriting, je peux facilement l'utiliser dans une autre application, simplement en le déclarant comme il faut (voir Comment créer un HttpModule ?). Par contre, le aura accès à d'autres événements qui ne sont pas pris en charge par un HttpModule, comme par exemple Session_Start et Session_End. |
Sommaire > WebForms > Application > Gestionnaire HTTP et modules HTTP | |
| |
Auteurs :, | |
Toutes les requêtes faites à une application sont gérées par un composant spécialisé : le gestionnaire HTTP (HttpHandler). Le plus connu est le gestionnaire de page, il traite les requêtes faites aux pages ASPX, crée la page, les objets, exécute le code et renvoi le html final. Il est possible de créer son propre HttpHandler afin de traiter des requêtes particulières. Note : 1 requête est traitée par un et un seul HttpHandler | |
lien : Comment créer un HttpHandler ? |
Auteurs :, |
Un modulle HTTP permet de traiter les requêtes faites à une application . Chaque requête passe par le pipeline de requête et est traitée par chaque HttpModule. Ces modules ont l'opportunité de s'abonner aux événements du cycle de vie de la requête. Un module Http permet également d'avoir accès à la réponse sortante et de la modifier. Les plus connus sont ceux utilisés par pour la génération de scripts clients ou de mise en cache. On peut être amené à développer un module Http dans le cadrepar exemple, ou dans le cadre d'une traduction automatique, etc Un HttpModule est un bon complément Qu'est ce que le ?. |
lien : Comment créer un HttpModule ? |
Comment afficher une image stockée en binaire, par exemple depuis une base de données ? | |
Auteurs :, | |
On utilisera un handler qui s'occupera de renvoyer l'image. Le handler répond à une requête pour lire l'image et s'occupe de la charger depuis la base de données. Ensuite, il renverra un contenu de type image qui pourra être affiché par la balise <img>. Par exemple : | |
Il permet également d'instancier des objets globaux disponibles dans l'ensemble de l'application.
Auteurs :, | |
La première chose à faire est de créer une classe qui implémente. La propriété IsReusable permet d'indiquer si une autre demande peut utiliser l'instance IHttpHandler. La méthode ProcessRequest sera utilisée pour écrire le flux de sortie HTTP, dans l'exemple qui suit, on affichera simplement un hello world : | |
Namespace MonNamespace Public Class MonHandler Implements IHttpHandler Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest Dim response As HttpResponse=context.Response Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get Return True End Get End Property End Class End Namespace | |
Pour l'utiliser, il faudra le déclarer dans le web.config à la section <httpHandlers> de <> et le configurer de manière à ce qu'il réponde à une requête. Par exemple, pour les requêtes qui contiendront hello.world : | |
<configuration> <> <httpHandlers> <add verb="*"path="hello.world"type="MonNamespace.MonHandler, MonAssembly"/> </httpHandlers> <> </configuration> | |
Note, l'attribut verb permet de spécifier à quel type de requête le handler doit répondre (GET, POST, ou * (les deux)) |
Auteurs :, | |
La première chose à faire est de créer une classe qui implémente. Il est obligatoire d'implémenter les méthodes Init et Dispose. Init nous permet de nous abonner aux événements qui nous intéressent, par l'intermédiaire de l'objet HttpContext. Dans l'exemple qui suit, je trace le début et la fin d'analyse des requêtes grâce aux événementset. | |
Public Class MonHttpModule Implements IHttpModule |
Imports System.Drawing.Imaging Namespace demoImg Public Class HttpHandlerImage Implements IHttpHandler Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest Dim request As HttpRequest=context.Request Dim server As HttpServerUtility=context.Server Dim idimage As String=request.QueryString("idimage") Dim img As System.Drawing.Image Dim format As ImageFormat' par ex : Dim contentType As String' par ex : "image/jpeg" LireImageDepuisLaBD(idimage,img,format,contentType) If Not img Is Nothing Then context.Response.ContentType=contentType img.Save(context.Response.OutputStream,format) Else End Sub Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get Return True End Get End Property End Class End Namespace | |
Il faudra déclarer le handler dans le web.config : | |
<httpHandlers> <add verb="*"path="displayimg"type="demoImg.HttpHandlerImage,demoImg"/> </httpHandlers> | |
On pourra appeler le handler en utilisant par exemple : | |
<img src="displayimg?idimage=1234"/> | |
Public Sub Init(ByVal context As HttpApplication) Implements IHttpModule.Init AddHandler context.BeginRequest,New EventHandler(AddressOf context_BeginRequest) AddHandler context.EndRequest,New EventHandler(AddressOf context_EndRequest) End Sub Private Sub context_BeginRequest(ByVal sender As Object,ByVal e As EventArgs) Dim httpApplication As HttpApplication=sender Debug.WriteLine(String.Format("Début de la requête pour {0} : {1}",_ httpApplication.Context.Request.Url.ToString(),DateTime.Now.ToLongTimeString())) End Sub Private Sub context_EndRequest(ByVal sender As Object,ByVal e As EventArgs) Dim httpApplication As HttpApplication=sender Debug.WriteLine(String.Format("Fin de la requête pour {0} : {1}",_ httpApplication.Context.Request.Url.ToString(),DateTime.Now.ToLongTimeString())) End Sub Public Sub Dispose() Implements IHttpModule.Dispose End Sub End Class | |
Pour que cette classe soit prise en compte par notre application, on va la définir dans le web.config à la section <> : | |
<httpModules> <add name="MonHttpModule"type="MonNamespace.MonHttpModule, MonAssembly"/> </httpModules> | |
Comment accéder aux évenéments d'un module http depuis un autre module ? | |
Auteurs :, On pourra accéder à un HttpModule en utilisant son nom. Ainsi, on pourra le référencer depuis un autre HttpModule et s'abonner à ses événements. | |
Public Sub Init(ByVal context As HttpApplication) Implements IHttpModule.Init Dim sessionMod As SessionStateModule=context.Modules("Session") AddHandler sessionMod.Start,New EventHandler(AddressOf OnSessionStart) End Sub | |
Auteurs :, | |
Voyons comment créer dynamiquement le titre d'une page : on parle ici de ce que contient la balise < title>. dans la page aspx : | |
<title id="titrePage"runat=server /> | |
on déclare dans le code behind : |
Sommaire > WebForms > Pages | ||
| ||
Auteurs :, | ||
On peut facilement rafraichir une page à intervale régulier grâce à du javascript. Mais quand il faut faire ça en code behind car la fréquence de rafraichissement est variable ou dépend d'une condition, au lieu de se lancer dans des fonction javascript complexe avec une gestion de timer, il existe une fonction toute simple en : | ||
Response.AppendHeader("Refresh","1") | ||
Le temps est exprimé en seconde et on ne peut pas utiliser d'unité de temps plus petite. |
Auteurs :, | |
Pour vider le cache d'une page aspx il suffit d'exécuter ces quelques lignes : | |
Response.CacheControl="no-cache" Response.AddHeader("Pragma","no-cache") Response.ExpiresAbsolute= Response.Expires=-1 | |
ou | |
Response.Cache.SetExpires() | |
ou encore la solution html: | |
<meta http-equiv="Cache-Control"content="private"/> <meta http-equiv="Pragma"content="no-cache"/> | |
Peut-on avoir plusieurs formulaires avec runat=server dans une même page ? | |
Auteurs :,, | |
Non. Mais pourquoi ne peut-on pas avoir plusieurs formulaires avec runat=server sur une même page ? | |
<form id="form1"runat="server"> </form> <form id="form2"runat="server"visible="false"> </form> | |
ne posera pas de problème d'exécution, tandis que : |
Protected titrePageAsHtmlGenericControl | |
pour donner une valeur au titre de la page : | |
titrePage.InnerText="FAQ " | |
Auteurs :, | |
Pour modifier l'entête (head) et le corps (body) d'une page, il faut leur assigner un id et définir la propriété runat à "server". | |
<head id="head"runat="server"> <body id="body"runat="server"> | |
ensuite, les déclarer dans le code-behind comme étant des HtmlGenericControl, c'est à dire | |
Protected bodyAsHtmlGenericControl Protected headAsHtmlGenericControl | |
head=Page.FindControl("head")' on recupère le head de la pagehead.InnerHtml+="Ici le texte que je peux ajouter dans le <head> de ma page"' pareil pour le bodybody=Page.FindControl("body") body.Attributes("onclick")="fctjavascript()"'ici je rajoute un attribut | |
Comment ajouter dynamiquement des contrôles à une page ? | |
Auteurs :, | |
Afin de voir comment on ajoute dynamiquement un webcontrol à une page, nous allons prendre un exemple simple : ajouter un label à une page aspx. Dans la page aspx, on ajoute un PlaceHolder : | |
<asp:PlaceHolder id="PlaceHolder1"runat="server"></asp:PlaceHolder> | |
dans le code-behind | |
Protected WithEvents PlaceHolder1AsPlaceHolderPrivateSubPage_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs) Handles |
<form id="form1"runat="server"> </form> <form id="form2"runat="server"> </form> | |
levera l'HttpException suivante : | |
A page can have only one server-side Form tag. Le modèle de développement impose que les éléments de formulaire soient postés à la même page qui les a soumis, ce qui permet aux mécanismes d' (ViewState, etc ) de fonctionner correctement. Pour la curiosité, la pile d'appel au moment de l'exception nous permet de constater que l'exception est levée au moment de l'appel à la méthode .OnFormRender(). Un petit coup de reflector nous permet de voir : | |
internalvoidOnFormRender(){if(this._fOnFormRenderCalled){thrownewHttpException(SR.GetString("Multiple_forms_not_allowed"));}this._fOnFormRenderCalled=true;this._inOnFormRender=true; } | |
Cette méthode OnFormRender est appelée au moment du rendu du controle HtmlForm. Le code issu de Reflector nous permet bien de constater qu'un boolean est mis à vrai lors du rendu d'un controle HtmlForm. Si ce boolean est déjà à vrai, alors l'exception est levée. |
Comment positionner l'ascenseur d'une page web en code-behind ? | |
Auteurs :, | |
Voici une petite astuce qui vous permet de positionner l'ascenceur d'une page web au niveau d'un webcontrol. Tout d'abord on crée un webcontrol, un label sans texte par exemple qui sera invisible sur la page web. Ensuite, dans votre page aspx : | |
<script>location='#<% Response.Write(varpos) %>';</script> | |
Dans le code behind il suffit ensuite de faire : |
DimmonlabelAsNewLabel (monlabel) EndSub | |
Vous avez là le code minimal pour ajouter un contrôle dynamiquement à une page aspx. Vous pouvez ensuite jouer sur les différentes propriétés et méthodes du webcontrol pour l'initialiser comme vous souhaitez. |
Auteurs :, | |
Si l'on définit dans sa page aspx AutoEventWireup à True | |
<%@ Page Language="vb"AutoEventWireup="true"CodeFile=""Inherits="Default"%> | |
on force un mapping de certains événements de la page. Ainsi par exemple, la méthode Page_Load sera appelée après la méthode OnLoad. Préferez sans hésiter les surcharges et mettez la propriété AutoEventWireup à false; | |
<%@ Page Language="vb"AutoEventWireup="fase"CodeFile=""Inherits="Default"%> Protected OverridesSubOnLoad(ByValeAsSystem.EventArgs) ' je fais qqchose MyBase.OnLoad(e) EndSub | |
au lieu de : | |
<%@ Page Language="vb"AutoEventWireup="true"CodeFile=""Inherits="Default"%> PrivateSubPage_Load(ByValsenderAsObject,ByValeAsSystem.EventArgs) Handles ' je fais qqchose EndSub | |
Auteurs :, |
On a parfois besoin d'envoyer des informations telles que du xml, html ou tout autre chose contenant < >. Par défaut, refuse l'envoi de ces tags et l'informe par l'intermédiaire d'une exception qui signale que, par mesure de sécurité, il est interdit d'envoyer de telles choses au serveur. Effectivement, en autorisant cet envoi, il serait possible d'injecter du javascript par exemple. |
PublicvarposAsString varpos="MonWebcontrol" | |
et l'ascenceur sera possitionné au niveau du label appellé "MonWebcontrol". |
Comment définir la page utilisée en cas d'erreur pour une page précise? | |
Auteurs :, | |
Tout comme on l'aurait fait pour définir la page d'erreur pour toutes les pages de l'application, il faut modifier le web.config afin d'y trouver | |
<customErrors mode="On"/> | |
Ensuite, pour la page concernée, au début du fichier .aspx, | |
<%@ Page Language="vb"ErrorPage=""%> | |
Comment modifier la couleur de fond d'une page web par le code? | |
Auteurs :, | |
Il est nécessaire de faire "le lien" entre la page et le code-behind. | |
<body id="Body" runat="server"> | |
et dans le code-behind: | |
Body.Style("background-color")="#FF0000" | |
lien : Comment créer dynamiquement le titre de la page ? |
Auteurs :, |
Pour que le puisse appréhender correctement le postback d'une page, il va falloir utiliser la méthode javascript _doPostBack( ). On va alors utiliser la méthode GetPostBackEventReference pour générer correctement la fonction _doPostBack. Prenons l'exemple simpliste d'une dropdownlist qui devra poster la page à chaque changement de selection (notez que ceci peut etre fait automatiquement grâce à la propriété autopostback, mais ce n'est pas le but de la présentation). |
Pour permettre l'envoi de ces informations, il est nécessaire de mettre validateRequest="false" dans la directive "Page". Une fois ces informations envoyées, il faut encore préciser au serveur qu'il ne doit pas les interpréter mais bien garder cela comme du texte. Ceci se fait par l'intermédiaire de | |
Dim html As String=Server.HtmlEncode(TextBox1.Text) | |
Auteurs :, | |
Il existe une propriété qui n'est pas très connue et pourtant bien pratique pour repositionner le scroll d'une page à l'endroit où elle était avant un postback. Il s'agit de la propriété MaintainScrollPositionOnPostback. Imaginons une page avec beaucoup de contenu | |
<%@ Page MaintainScrollPositionOnPostback="true"Language="vb"AutoEventWireup="true" CodeBehind=""Inherits="testScroll._Default"%> <!DOCTYPE htmlPUBLIC"-W3CDTD XHTML 1.0 TransitionalEN"""> <html xmlns=";> <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1"runat="server"> <asp:Label runat="server"Text="<.ToShortTimeString() %>"/><br/><p>ici mettre plein de trucs histoire d'avoir une barre de défilement</p> <br/> <br/> <asp:Button runat="server"Text="Valider"/> </form> </body> </html> | |
L'utilisation de la propriété MaintainScrollPositionOnPostback (positionnée à true) sur la page permet de rajouter automatiquement du javascript qui se chargera de re-positionner correctement le scroll à l'endroit où on l'a laissé. | |
Auteurs :, | |
Prenons un exemple avec un TextBox et un bouton : | |
<asp:TextBox ID="leTextBox"runat="server"/><asp:Button ID="monBouton"runat="server"Text="go"OnClick="clic"/> | |
on a l'événement du click dans le code behind écrit ainsi : | |
ProtectedSubclic(ByValsenderAsObject,ByValeAsEventArgs) Response.Write("le bouton a été cliqué") EndSub |
soit la page suivante : | |
<asp:DropDownList runat="server"ID="maDropDown"> <asp:ListItem Text="Valeur 1"/> <asp:ListItem Text="Valeur 2"/> <asp:ListItem Text="Valeur 3"/> </asp:DropDownList> | |
dans le code behind, on associe la méthode javascript onchange à la fonction qui va poster la page. On le construira ainsi : | |
Protected OverridesSubOnLoad(ByValeAsSystem.EventArgs) maDropDown.Attributes["onchange"]=Page.ClientScript.GetPostBackEventReference(maDropDown, ) If(IsPostBack)Then Response.Write("la page a été correctement postée à "+.ToLongTimeString()) EndIf EndSub | |
Vous pouvez constater que la page est postée à chaque changement de valeur dans la dropdown. On peut également vérifier que ce postback est conforme en utilisant la propriété __EVENTTARGET Comment savoir quel contrôle à déclenché le postback ?. | |
Protected OverridesSubOnLoad(ByValeAsSystem.EventArgs) maDropDown.Attributes["onchange"]=Page.ClientScript.GetPostBackEventReference(maDropDown, ) If IsPostBackAndRequest.Form["__EVENTTARGET"]<>NothingAndRequest.Form["__EVENTTARGET"] Response.Write("la page a été correctement postée par la dropdownlist à "+ .ToLongTimeString()) EndIf MyBase.OnLoad(e) EndSub | |
.Contains(maDropDown.U
Comment simuler un clic par exemple lorsque la valeur du textbox change ? Pour ca, on va utiliser la méthode GetPostBackEventReference. EndSub | |
Si on s'arrete à ca, va nous lever une belle erreur : | |
Argument de publication ou de rappel non valide. La validation d'événement est activée via <pages enableEventValidation="true"/> dans la configuration ou via <%@ Page EnableEventValidation="true" %> dans une page. Pour des raisons de sécurité, cette fonctionnalité vérifie si les arguments des événements de publication ou de rappel proviennent du contrôle serveur qui les a rendus à l'origine. Si les données sont valides et attendues, utilisez la méthode ClientScriptManager.RegisterForEventValidation afin d'inscrire les données de publication ou de rappel pour la validation. | |
Cette erreur provient du fait qu' effectue un controle sur le POST pour détecter d'éventuelles attaques d'injections ou d'altération de la requete POST. C'est le principe d'event validation. Une solution pour le désactiver est de mettre la propriété EnableEventValidation à false dans la directive de Page. Ceci aura pour effet de désactiver complètement ce processus de validation, ce qui peut etre nécessaire dans certain cas, mais ne permet plus cette vérification automatique pour toute la page (ceci ne peut pas etre fait controle par controle). L'autre solution plus propre est d'indiquer à que ce postpack est tout à fait autorisé. C'est ce que permet l'utilisation de la méthode RegisterForEventValidation. Cet appel ne pourra etre fait qu'en surchargeant la méthode Render de la page : | |
Protected OverridesSubRender(ByValwriterAs.HtmlTextWriter) Page.ClientScript.RegisterForEventValidation(monBouton.UniqueID, ); MyBase.Render(writer) EndSub | |
Désormais, le post est bien pris en compte et la méthode clic associée au bouton est bien lancée. |
Sommaire > WebForms > Pages > Cycle de vie | ||||||||||||||||||
| ||||||||||||||||||
Auteurs :, Ainsi, dans cette approche axée sur un modèle événementiel, notre page va passer par un certain nombre d'étapes. C'est ce qu'on appelle le cycle de vie, voici les principales étapes du cycle de vie d'une page : Initialisation d'une page par le framework :
Initialisation par le code utilisateur : |
Rendu : Déchargement : | Evénement | Description et actions associées | |||||||||||||||||||||||||||||
PreLoad | |||||||||||||||||||||||||||||||
OnLoad | Appelle récursivement OnLoad sur les contrôles enfants. C'est l'endroit idéal pour les databinds. Attention, cette foisci commence par le onload de la page et ensuite ceux des usercontrols récursivement. | ||||||||||||||||||||||||||||||
Validation, événements et fin de chargement
|
Sommaire > WebForms > Contrôles |
Comment trouver un contrôle dans une page récursivement ? | |
Auteurs :, | |
Il suffit de parcourir les fils d'un contrôle source récursivement. | |
PublicFunctionRecursiveFindControl(ByValcontroleSourceAsControl,ByValidATrouverAsString)As Control DimcontrolAsControl=controleSource.FindControl(idATrouver) IfNotcontrolIsNothingThen Return control EndIf DimiAsInteger Fori=0TocontroleSource.Controls.Count-1 control=controleSource.Controls(i).FindControl(idATrouver) IfcontrolIsNothingThen control=RecursiveFindControl(controleSource.Controls(i), idATrouver) IfNotcontrolIsNothingAnd.ToLower()=idATrouver.ToLower()Then |
Sommaire > WebForms > Contrôles > Général | ||
| ||
Auteurs :, | ||
Dans la procédure de création du bouton on ajoute : | ||
AddHandler Bbouton.Click, AddressOf MesBoutons_Click | ||
ensuite : | ||
SubMesBoutons_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs) 'Récupération du bouton ayant déclenché l'événement DimBtnAsButton Btn=Ctype(sender,Button) 'Traitement EndSub | ||
ATTENTION :Lors du postback éffectué aprés l'évènement, le bouton doit impérativement être rechargé dans la page pour que l'évènement soit traité. Quitte à mettre sa propriétée visible à false si vous ne voulez pas qu'il soit visible. |
Comment modifier l'ordre de défilement des WebControls quand on appuie sur la touche TAB ? |
Auteurs :, |
Quand on appuie sur la touche TAB du clavier, on fait défiler les différents éléments du formulaire en faisant changer le focus d'élément. Mais la plupart du temps, en aspx le défilement des WebControls ne se fait pas dans l'ordre souhaité. Par défaut, le focus fait défiler les WebControls dans l'ordre dans lequel ils sont déclarés dans la page aspx. Si vous voulez vous même choisir l'ordre de défilement de vos WebControls, il faut donner une valeur à la propriété "TabIndex" de votre WebControl. Par exemple un WebControl avec un TabIndex=1 sera selectionné au deuxième appui sur la touche TAB. |
Auteurs :, | |
Nous allons ici utiliser un label, mais le code est valable pour les autres webcontrols. Le piège dans cette question est que la propriété "font" du label est en lecture seule !!! Il faut en fait passer par un style, un exemple : | |
DimmonstyleAsNewStyle monstyle.BorderColor=monstyle.BackColor=Color.Black monstyle.ForeColor=="Verdana"=20 Lable1.ApplyStyle(monstyle) |
EndIf Else Return control EndIf Next Return control EndFunction Ci-dessous, vous trouverez sa version en itératif, qui améliore les performances : | |
PublicSharedFunctionIterativeFindControl(ByValcontroleSourceAsControl,ByVal idATrouverAsString)AsControl DimcontrolAsControl=controleSource DimqueueAsNewQueue(Of Control) WhileNotcontrolIsNothing IfString.Compare(, idATrouver, StringComparison.InvariantCultureIgnoreCase)=0Then Return control EndIf ForEachctrlAsControlIncontrol.Controls IfString.Compare(, idATrouver, StringComparison.InvariantCultureIgnoreCase)=0Then Return ctrl EndIfIfctrl.HasControls()Then queue.Enqueue(ctrl)EndIfNext control=queue.Dequeue() EndWhile ReturnNothing EndFunction | |
Auteurs :, | ||||
Par défaut, le webuser control a accès à la css de la page dans laquelle il est inclus. L'intérêt est que le webuser control s'adapte parfaitement aux différentes pages dans lesquelles il est placé. Cependant, si vous souhaitez quand même lier une css "spécifique" à un webuser control, il vous suffit d'ajouter dans la css : | ||||
<LINK rel=stylesheet type="text/css"href=""> | ||||
attention : si vous liez une css au webuser control faites attention d'utiliser des classes de css différentes que celles de la css des pages dans lesquelles vous allez inclure le webuser control. | ||||
lien : | ||||
Comment permettre à deux webparts d'échanger des informations? | |
Auteurs :, | |
Prenons un exemple concret pour illustrer cette réponse. Ainsi, imaginons que l'on utilise deux User Controls dans une WebPartZone: | |
<asp:WebPartZone ID="wpzGauche"runat="server"BorderColor="#CCCCCC"Font-Names="Verdana"Padding="6" <ZoneTemplate> <uc1:searchResults ID="SearchResults1"runat="server"/> <uc1:searchCriterias ID="SearchCriterias1"runat="server"/> </ZoneTemplate> </asp:WebPartZone> | |
<asp:WebPartManager ID="WebPartManager1"runat="server"> <StaticConnections> <asp:WebPartConnection ID="connectionSearch" ConsumerID="SearchResults1"ProviderID="SearchCriterias1"/> </StaticConnections> </asp:WebPartManager> |
Width="100
Je n'utilise pas le code-behind et il ne trouve pas un objet se trouvant dans ma page, pourquoi ? | |||
Auteurs :, | |||
Bien qu'il ne faut pas déclarer l'objet dans son code (je précise: "je n'utilise pas le code-behind"), la raison la plus probable est l'oubli du runat="server" dans la définition de l'objet dans votre page. | |||
Je reçois une NullReferenceException, quelle en est la cause ? | |||
Auteurs :, | |||
Lorsque l'on utilise la technique du Code-Behind, il faut lier les différents contrôles de la page .aspx avec le code. Si une NullReferenceException est lancée, cela peut être dû à: - les noms ne correspondent pas entre la page .aspx et le code-behind - la variable dans le code est déclarée comme étant privée - le contrôle n'a pas la propriété runat=server | |||
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) |
Comment ajouter un retour à la ligne à partir du code-behind ? | |
Auteurs :, | |
Il suffit d'utiliser l'élément container (par exemple le body) et de lui ajouter un LiteralControl. | |
container.Controls.Add(New LiteralControl("<br/>")) | |
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) > Contrôles HTML (HtmlControls) | ||
| ||
Auteurs :, | ||
Nous allons voir dans cet exemple qu'il est trés facile de créer dynamiquement des métas tags en dans le head de la page aspx : | ||
<meta http-equiv="Content-Language"id="languagePage"runat="server"/> <meta name="Author"id="auteurPage"runat="server"/> <meta name="Description"id="descriptionPage"runat="server"/> <meta name="keywords"id="keywordsPage"runat="server"/> | ||
dans le code-behind on déclare : | ||
Protected languagePageAsHtmlGenericControl Protected auteurPageAsHtmlGenericControl Protected classificationPageAsHtmlGenericControl Protected descriptionPageAsHtmlGenericControl Protected keywordsPageAsHtmlGenericControl | ||
ensuite pour donner des valeurs aux métas tags : | ||
languagePage.Attributes("content")="fr"auteurPage.Attributes("content")="neo.51"classificationPage.Attributes("content")="developpement"descriptionPage.Attributes("content")="FAQ "keywordsPage.InnerText=", , FAQ" | ||
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) > Contrôles standards | ||||
| ||||
Auteurs :, | ||||
Le Panel possède différentes propriétés de mise en forme qui n'existent pas dans le PlaceHolder. Dès lors, si vous souhaitez mettre en forme votre Panel, préférez-le au PlaceHolder. A l'inverse, si vous devez uniquement placer des éléments dans une zone, utilisez le PlaceHolder qui est légèrement plus rapide (de l'ordre du millième de seconde). | ||||
Quel composant utiliser pour l'envoi d'un fichier vers un serveur? | ||||
Auteurs :, | ||||
En 1.x il n'en existe pas d'autre que le contrôle html, à savoir l'input de type file (<input type="file">). En 2.0, il existe un contrôle nommé FileUpload. Il comporte quelques propriétés et méthodes ne se trouvant pas dans le contrôle html. | ||||
Comment uploader un fichier sur le serveur via une page ? | ||||
Auteurs :, | ||||
Dans cet exemple nous alons voir comment uploader un fichier sur le serveur via une page . Tout d'abord on place un contrôle input file sur la page aspx : | ||||
<INPUT id="tboxMonFichier"type="file"size="75"name="tboxMonFichier"runat="server"> | ||||
Qui est déclaré dans le code behind : | ||||
Puis dans le code behind : | ||||
IfNottboxMonFichier.PostedFile.FileName.Length=0ThenDimmoncheminasstring="C:\repfilesupload"tboxMonFichier.PostedFile.SaveAs(monchemin&_ tboxMonFichier.PostedFile.FileName.Substring( _ tboxMonFichier.PostedFile.FileName.LastIndexOf("\")+1))EndIf | ||||
Attention : Veillez à mettre les droits nécéssaires sur le répertoire d'upload ;-) | ||||
lien : Pourquoi l'upload de fichiers de plus de 4Mo lève une exception ? | ||||
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) > Contrôles standards > Button | ||
| ||
Auteurs :, | ||
Par défaut, le contrôle Form disposé sur une page considère le premier contrôle de type bouton qu'elle trouve dans la page comme le bouton par défaut. Si on appuie sur le bouton "Entrée", alors considère que c'est ce bouton qui a déclenché le postback. On peut lui indiquer un autre bouton grâce à la propriété DefaultButton, que ce soit sur le contrôle Form ou sur un Panel. Ainsi, il devient très facile d'indiquer quel événement click de bouton doit être appelé lors de l'appui sur la touche "Entrée". Considérons cet exemple : | ||
• • • | <form id="form1"runat="server"defaultbutton="b5"> <div> <asp:TextBox runat="server"ID="t1"/> <asp:Button runat="server"ID="b1"OnClick="b1_click"Text="go"/> </div> <asp:Panel runat="server"ID="p1"DefaultButton="b2"> <asp:TextBox runat="server"ID="t2"/> <asp:Button runat="server"ID="b2"OnClick="b2_click"Text="go"/> </asp:Panel> <asp:Panel runat="server"ID="p2"DefaultButton="b4"> <asp:TextBox runat="server"ID="t3"/> <asp:Button runat="server"ID="b3"OnClick="b3_click"Text="go"/> <asp:TextBox runat="server"ID="t4"/> </asp:Panel> <asp:TextBox runat="server"ID="t5"/> <asp:Button runat="server"ID="b5"OnClick="b5_click"Text="go"/> </form> | |
Grâce aux propriétés defaultbutton, on aura : lors du focus sur le textbox t2, le bouton b2 sera clické lors du focus sur le textbox t3 ou t4, le bouton b4 sera clické Dans tous les autres cas, c'est le bouton b5 qui sera clické Techniquement, rajoute le javascript suivant au div conteneur représentant le panel : | ||
javascript:returnWebForm_FireDefaultButton(event,'b2') | ||
ou dans l'attribut onkeypress de la balise form. |
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) > Contrôles standards > CheckBox | ||
| ||
Auteurs :, | ||
Imaginons un asp:checkbox et une fonction javascript cliente qui affiche si la case est cochée ou non. On pourrait etre tenté de faire : | ||
<asp:CheckBox runat="server"Text="Cochez moi"onchange="alert(this.checked);"/> | ||
sauf que ceci ne va pas marcher, en effet génère : | ||
<span onchange="alert(this.checked);"><input id="ctl02"type="checkbox" name="ctl02"/><labelfor="ctl02">Cochez moi</label></span>> | ||
on se rend compte que le onchange est appliqué au span. Comment faire alors pour agir sur l'input de type checkbox ? il faudra passer par le code behind : | ||
("onchange","alert(this.checked);") | ||
et cette fois-ci, génèrera : | ||
<input id="MonCheckbox"type="checkbox"name="MonCheckbox" onchange="alert(this.checked);"/><labelfor="MonCheckbox">Cochez moi</label> | ||
NB : les attributs du label seront accessibles grâce à LabelAttributes |
Auteurs :, | ||
Vous pouvez ajouter un Item directement en utilisant . Le premier paramètre correspond à l'emplacement (en l'occurrence 0) : DropDownList | ||
| ||
Auteurs :, | ||
Ce problème est trés récurent. Dans 99% des cas le problème vient du postback : Si vous remplissez votre dropdownlist dans le "Page_Load" de votre page, le code correct est : | ||
PrivateSubPage_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs) Handles IfnotPage.IsPostBackThen 'code pour remplir la dropdownlist EndIf EndSub | ||
L'erreur fréquement comise est d'oublier le "If not page.IsPostBack then" quand vous sélectionnez un objet de la dropdownlist, la page se recharge en faisant un postback, donc repasse par le "Page_Load et reinitialise votre dropdownlist. On spécifie donc qu'il ne faut pas reinitialiser la dropdownlist en cas de PostBack et on récupèrera ainsi la valeur sélectionnée. |
La propriété SelectedValue d'une DropDownList me renvoi Nothing, pourquoi? | |
Auteurs :, | |
Il arrive fréquemment que l'on remplisse une DropDownList avec les valeurs qui sont à afficher. Par contre, les valeurs sont souvent oubliées lors de cette initialisation. Si l'initialisation se fait à l'aide d'un DataSet, rien de plus simple, il suffit de spécifier quel est le champ qui permettra de récupérer la valeur: | |
NomDropDownList.DataSource=DbTemplate.GetCategories NomDropDownList.DataTextField="champ_a_afficher"NomDropDownList.DataValueField="champ_valeur"NomDropDownList.DataBind | |
Si l'initialisation se fait par l'ajout manuel d'Items, il suffit de créer des Items en spécifiant les deux valeurs. | |
DimliAsListItem=NewListItem="texte"li.Value="valeur"(li) | |
Parfois ma dropdownlist ne lève pas l'événement OnSelectedIndexChanged ou OnTextChanged, même si AutoPostBack="true", que faire ? |
Auteurs :, |
Cela peut arriver si vous avez |
ddl.Items.insert(0,"mon texte") | |
Cependant, cette solution ne fait qu'afficher un texte. Si vous souhaitez passer un texte ainsi que la valeur correspondante, il est nécessaire d'utiliser un objet ListItem : | |
DimliasListItem=NewListItem("mon texte","ma valeur") ddl.Items.Insert(0, li) | |
Comment insérer un élément dans une DropDownList à un emplacement donné ? | |
Auteurs :, | |
Pour ajouter un élément à la collection Items d'une DropDownList il existe la fonction Add, mais celle-ci l'ajoute à la fin. Si on ne veut pas l'ajouter à la fin, il faut utiliser la fonction Insert : | |
MyDropDownList.Items.Insert(0,newListItem("2 CV","Voiture")) | |
Le code ci-dessus insérera l'élément "2 CV" et sa valeur "Voiture" à la position 0 de collection Items de la DropDownList | |
lien : | |
J'ai déclaré l'attribut OnChange sur ma DropDownList mais rien ne se passe lors d'un changement de valeur. Pourquoi ? | |
Auteurs :, | |
L'erreur la plus fréquente est d'oublier de mettre à true la propriété AutoPostBack. Ce qui donne: | |
<asp:DropDownList runat=server id=IdDdl AutoPostBack=true> </asp:DropDownList> | |
Si la propriété est à true, lorsque l'on sélectionne une autre valeur, la page est renvoyée au serveur. Attention de ne pas réinitialiser la valeur sélectionnée dans le Page_Load. | |
lien : Ma dropdownlist est bien remplie, mais quand je sélectionne un item, c'est toujours la première valeur de la liste qui est retournée |
Mais cela pose un problème lorsqu'on veut utiliser les événements accessibles lorsqu'autopostback vaut true. Imaginons une page toute simple (du code a été omis pour plus de clarté) où EnableViewState vaut false :
( | <%@ Page Language="vb"EnableViewState="false"AutoEventWireup="false"CodeBehind="" Inherits="testDropdown.Default"%> <asp:DropDownList ID="myDropDown"runat="server"AutoPostBack="true" <asp:ListItem Value="valeur1"Text="valeur1"/> <asp:ListItem Value="valeur2"Text="valeur2"/> <asp:ListItem Value="valeur3"Text="valeur3"/> </asp:DropDownList> <asp:Label ID="myLabel"runat="server"/> |
et dans le code behind | |
ProtectedSubItemChange(ByValsenderAsObject,ByValeAsEventArgs) =String.Format("Valeur selectionnée : {0}", sender.SelectedValue)EndSub | |
Si l'on sélectionne les valeurs 2 ou 3, le texte est correctement affiché car on est passé correctement dans l'événement. Par contre, si on rebascule sur la valeur 1, rien n'est affiché, on ne passe pas dans l'événement. En effet, comme le viewstate n'est pas utilisé, croit que c'est la valeur 1 qui est sélectionnée, et quand on la resélectionne après un premier changement, il en déduit que la valeur n'a pas changée, donc, il ne lève pas l'événement le brigand). La solution est donc de lever l'événement nous même, en surchargeant le OnLoad. | |
Protected OverridesSubOnLoad(ByValeAsSystem.EventArgs) IfIsPostBackThen ' on lève l'évenement si le postback a été déclenché par notre dropdown DimctlNameAsString=Request("__EVENTTARGET") IfNotString.IsNullOrEmpty(ctlName)Then IfctlName.Contains()Then ItemChange(myDropDown,NewEventArgs()) EndIf EndIf EndIf MyBase.OnLoad(e) EndSub ProtectedSubItemChange(ByValsenderAsObject,ByValeAsEventArgs) =String.Format("Valeur selectionnée : {0}", sender.SelectedValue)EndSub | |
Et au final, nous n'avons plus besoin de définir OnSelectedIndexChanged="ItemChange" comme attribut de <asp:DropDownList> NB : Si on veut, il est bien sur possible de changer le prototype de la méthode ItemChange, vu qu'elle n'est plus levée par | |
PrivateSubItemChange(ByVallistAsDropDownList,ByValeAsEventArgs) EndSub |
Comment lever l'événement SelectedIndexChanged pour des DropDownList dans un Repeater lorsque le Viewstate est à false ? | ||||
Auteurs :, Pour ce faire, nous allons déjà construire notre repeater. Dans la page, on aura par exemple notre repeater, une dropdownlist par item et un label en dehors de ce repeater pour afficher la sélection : | ||||
<asp:Repeater runat="server"OnItemCreated="ItemCreated"ID="MonRepeater"> <ItemTemplate> <asp:DropDownList runat="server"ID="LaList"AutoPostBack="true"/> </ItemTemplate> </asp:Repeater><asp:Label runat="server"ID="LeLabel"/> | ||||
Pour initialiser notre repeater, rien de tel qu'une bonne liste de liste | ||||
Protected OverridesSubOnInit(ByValeAsSystem.EventArgs) EnableViewState=False DimlistAsNewList(Of List(OfString)) Dimlist1AsNewList(OfString) ("abc") ("def") ("ghi") Dimlist2AsNewList(OfString) ("123") ("456") ("789") (list1) (list2) MonRepeater.DataSource=list MonRepeater.DataBind() MyBase.OnInit(e) EndSub | ||||
Pour bien montrer qu'on ne se servira pas du viewstate, on le met explicitement à false dans le OnInit Et dans l'événement du ItemCreated, on construit la dropdown à partir de la liste : | ||||
ProtectedSubItemCreated(ByValsenderAsObject,ByValeAsRepeaterItemEventArgs) DimlistAsDropDownList=e.Item.FindControl("LaList") ("choisir ") ForEachelementAsStringIne.Item.DataItem (element) Next EndSub | ||||
Si on execute la page, on a donc 2 dropdownlist remplies respectivement des valeurs "choisir ", "abc", "def", "ghi" et "choisir ", "123", "456", "789". | ||||
Comment désactiver une DropDownList après qu'un item ait été sélectionné dans cette liste? | |
Auteurs :, | |
Soit une DropDownList: | |
<asp:DropDownList id="ddl"runat="server"> <asp:ListItem Value="1">Choix 1</asp:ListItem> <asp:ListItem Value="2">Choix 2</asp:ListItem> <asp:ListItem Value="3">Choix 3</asp:ListItem></asp:DropDownList> | |
Ensuite, dans le code: | |
Protected OverridesSubOnLoad(ByValeAsSystem.EventArgs) MyBase.OnLoad(e) IfIsPostBackThen DimctlNameAsString=Request("__EVENTTARGET") IfNotString.IsNullOrEmpty(ctlName)Then ' on va chercher la dropdown qui a déclenché le postback dans __EVENTTARGET ForEachitemAsRepeaterItemInMonRepeater.Items DimclientIdAsString= item.ClientID' utilisé pour avoir la propriété ID, sinon elle vaudra nullDimcurrentDropDownAsDropDownList=item.FindControl("LaList") DimdropDownNameAsString=String.Format("{0}${1}", , ) IfctlName.Contains(dropDownName)Then ItemChange(currentDropDown,NewEventArgs()) EndIf Next EndIf EndIf EndSub | |
Le principe est de parcourir les items du repeater et de concatener l'id de l'item à celle de la dropdownlist en mettant un $ entre les deux ; c'est grâce à ces deux valeurs qu'on pourra identifier de manière unique la dropdown qui a déclenché le postback. ctlName vaudra "MonRepeater$ctl00$LaList" et dropDownName vaudra "ctl00$LaList" Une fois la dropdown identifiée, il n'y a plus qu'à simuler l'événement ItemChange, qui ici, nous affichera le résultat choisi dans le label | |
SubItemChange(ByVallistAsDropDownList,ByValargsAsEventArgs) =list.SelectedValue EndSub | |
Voilà pour la dropdownlist dans un repeater NB : ici, j'ai utilisé une astuce pour récupérer l'id de l'item du repeater. En effet, dans le OnLoad il vaut null, je force la génération du ClientId pour pouvoir récupérer l'ID. |
ddl.Attributes.Add("onchange","this.disabled=true;") | ||||
ou directement dans le .aspx: | ||||
<asp:DropDownList id="ddl"runat="server"onchange="this.disabled=true;"> <asp:ListItem Value="1">Choix 1</asp:ListItem> <asp:ListItem Value="2">Choix 2</asp:ListItem> <asp:ListItem Value="3">Choix 3</asp:ListItem> </asp:DropDownList> | ||||
Auteurs :, | ||||
Soit une liste déroulante déclarée en html de telle manière (ou une DropDownList qui est l'équivalent en ): | ||||
<SELECT id="Couleur"runat="server"name="Couleur"></SELECT> | ||||
Cette liste a pour but d'afficher la liste des couleurs possibles avec la couleur en fond de chaque item. Dans le code de traitement, il suffit alors d'inclure | ||||
ImportsSystem.Reflection | ||||
et enfin d'ajouter les différents Items à la liste. | ||||
ForEachcolAsFieldInfoInGetType(KnownColor).GetFields Ifcol.FieldType=GetType(KnownColor)Then (NewListItem(, )) EndIf Next DimiAsInteger=0 Whilei<Couleur.Items.Count Couleur.Items(i)("style","background-color:"+Couleur.Items(i).Text) (System.Threading.Interlocked.Increment(i),i-1) EndWhile | ||||
On peut imaginer d'autres utilisations telles mettre en rouge la liste des factures non payées et en vert celles qui sont payées dans une application de gestion de factures.
Comment faire pour que ma dropdownlist ne cause un postback que sous certaines conditions ? | |
Auteurs :, | |
On met la propriété AutoPostBack à true. Le principe est d'empecher la publication du postback en modifiant le javascript de l'attribut onchange pour qu'il renvoit false lorsque les conditions ne sont pas respectées. | |
myDropDownList.AutoPostBack=truemyDropDownList.Attributes["onchange"]="if("+myDropDownList.ClientID+".selectedIndex != "+ myDropDownList.ClientID+".length-1) return false; else" | |
le code est completé lors de la génération de la page. Dans le code html généré, __doPostBack( ) sera automatiquement rajouté après le else (parce qu'on à mis le AutoPostBack = true). Dans cet exemple, on envoit le formulaire uniquement lorsque c'est le dernier élément qui est sélectionné. |
Auteurs :, | ||
<asp:label id="Labelcentre"Width="100%"> <p align="center">Label centre</p></asp:label> | ||
Ou en code behind : | ||
| ||
Auteurs :, | ||
En utilisant le tag <br /> Si vous récupérer les informations à partir d'un TextBox multiligne ou d'une base de données et que vous utilisez des \n, il faut alors les remplacer. | ||
label1.Text=texte.Replace("\n","<br />") | ||
Auteurs :,, | |
En modifiant l'attribut Style: | |
<asp:Label id="label"style="writing-mode:tb-rl"runat="server">Texte à afficher</asp:Label> | |
On peut également passer par une propriété CSS : | |
.RightToLeft{direction:rtl;} | |
Et ensuite l'attacher à la textbox : | |
<asp:TextBox runat="server"ID="TestTxtBox"CssClass="righttoleft"/> | |
="<p align=""center"">Label centre</p>" | ||||
Auteurs :, | ||||
Si l'on souhaite changer la police (la taille par exemple), il est nécessaire d'utiliser un style. Ce style est défini de la manière suivante: | ||||
DimmonstyleAsNewStyle monstyle.BorderColor=monstyle.BackColor=Color.Black monstyle.ForeColor=="Verdana"=20 | ||||
Il ne reste plus qu'à l'appliquer au Label par | ||||
label1.ApplyStyle(monstyle) | ||||
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) > Contrôles standards > Repeater | ||
| ||
Auteurs :, | ||
Il peut arriver qu'on ait besoin de faire un filtre sur une datasource de repeater mais qu'on ne puisse pas toujours filtrer cette source en amont. Dans ce cas, on peut très bien faire notre filtre au moment où le repeater se construit. Soit un repeater tout bete : | ||
<asp:Repeater runat="server"ID="MonRepeater"OnItemDataBound="ItemDataBound"> <ItemTemplate> <asp:Label runat="server"Text="<%#Container.DataItem %>"/> </ItemTemplate> </asp:Repeater> | ||
MonRepeater.DataSource=NewInteger() {1, 2, 3, 4, 5, 6, 7} | ||
Il suffit d'agir sur le ItemDataBound et de masquer l'élément. Ici par exemple, je n'affiche que les nombres impairs : | ||
ProtectedSubItemDataBound(ByValsenderAsObject,ByValeAsRepeaterItemEventArgs) Ife.Item.DataItemMod2=0Then e.Item.Visible=FalseEndIf EndSub | ||
Une autre solution est d'intervenir au moment du databinding | ||
<asp:Repeater runat="server"ID="MonRepeater"OnDataBinding="DataBindingRepeater"> ProtectedSubDataBindingRepeater(ByValsenderAsObject,ByValeAsEventArgs) DimrAsRepeater=sender r.DataSource=Array.FindAll(Of Integer)(r.DataSource, AddressOf filtre)EndSub PublicFunctionfiltre(ByValiAsInteger)AsBoolean Return iMod2<>0 EndFunction | ||
Comment afficher un retour à la ligne à partir d'un texte encodé dans un TextBox multiligne ? | |
Auteurs :, | |
Dans un TextBox, le retour à la ligne se fait par \r\n. En HTML, il s'agit de <br/>. Il suffit dès lors de remplacer le \r\n par <br/>. | |
Dim strAAfficher As String=strEncode.Replace(vbCr&vbLf,"<br/>") | |
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) > Contrôles standards > TextBox | ||
| ||
Auteurs :, | ||
Dans le Page_Load de la page aspx on rajoute : | ||
("OnKeyUp","this.value=this.value.toUpperCase()") | ||
Auteurs :, | |
Pour effectuer une action sur chaque ligne d'un "texte" encodé dans un TextBox: | |
ForEachlineAsStringInTextBox1.Lines ' Traitement Response.Write(line) Next | |
Auteurs :, | |
il vous faut parcourir les contrôles présents sur le formulaire et tester s'ils sont de type TextBox. | |
For Each c As Control In Controls If TypeOf c Is TextBox Then CType(c,TextBox).Enabled=False End If Next | |
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) > Contrôles standards > UploadFile |
Auteurs :,,
Si vous utilisez le contrôle UploadFile avec des fichiers de taille supérieures à 4 Mo, vous risquez d'optenir un message d'interruption de la connexion.
Il s'agit d'une limitation d'.
Pour la modifier, ça se fait dans le web.config. Exemple:
<!-- Mettre la limite du upload HTMLInputFile a 8Mo (default = 4096ko) -->
<httpRuntime maxRequestLength="8192"/>
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) > Contrôles riches |
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) > Contrôles riches > Calendar | ||
| ||
Auteurs :, | ||
Lorsque l'on passe par le designer de Visual (et je suppose que c'est sensiblement pareil pour les autres IDE) lorsqu'on paramètre l'aspect de son Calendar, on paramètre en fait plusieurs styles. Par exemple, voici un Calendar ou j'ai personnalisé les styles : | ||
<asp:calendar id="Calendar1"runat="server" Width="47px"Height="40px"> <TodayDayStyle Font-Names="Arial"Font-Bold="True"ForeColor="Red"></TodayDayStyle> <SelectorStyle Font-Names="Arial"></SelectorStyle> <DayStyle Font-Names="Arial"ForeColor="#006600"></DayStyle> <NextPrevStyle Font-Names="Arial"ForeColor="White"BorderColor="#000600" BackColor="#006600"></NextPrevStyle> <DayHeaderStyle Font-Names="Arial"ForeColor="White"BorderColor="#006600" BackColor="#006600"></DayHeaderStyle> <SelectedDayStyle Font-Names="Arial"></SelectedDayStyle> <TitleStyle Font-Names="Arial"ForeColor="White"BorderColor="#006600" BackColor="#006600"></TitleStyle> <WeekendDayStyle Font-Names="Arial"></WeekendDayStyle> <OtherMonthDayStyle Font-Names="Arial"ForeColor="#006600"BorderColor="White" BackColor="White"></OtherMonthDayStyle> </asp:calendar> On déclare le calendar : | ||
<asp:calendar id="Calendar1"runat="server"Width="47px"Height="40px"> <DayHeaderStyle CssClass="MyDayHeaderStyle "></DayHeaderStyle> </asp:calendar> | ||
Dans votre Css : | ||
.MyDayHeaderStyle{background-color:#006600; // BackColor border-color:#006600; // BorderColor color:White; // ForeColor font-family:Arial;//Font} | ||
On fait de même avec tous les autres styles du Calendar. ATTENTION : L'objet calendar a un comportement étrange lorsqu'on applique une Css sur des liens (les jours, mois suivant, mois précédent). Afin de s'assurer que les liens du calendar respectent la Css, il faut spécifier une règle sur la Css, par exemple : | ||
TD.OtherMonthDayStyle A |
• • • | {font-family:Arial!important; color:#006600!important;} | |||
Les styles affectés par ce comportement étrange du calendar et nécessitants ce type de classe Css sont : OtherMonthDayStyle TodayStyle NextPrevStyle | ||||
Comment empêcher de sélectionner les dates passées dans un Calendar ? | ||||
Auteurs :, | ||||
Dans l'évènement DayRender du calendar, vous pouvez savoir quelle est la date qui va être affichée. Dès lors, il ne reste plus qu'à tester si cette date est passée et lui indiquer qu'il n'est pas possible de le sélectionner. | ||||
If<DateTime.TodayThen .IsSelectable=False .BackColor=Color.LightGray .ForeColor= EndIf | ||||
Bien entendu, vous pouvez effectuer tous les tests que vous souhaitez (par exemple la sélection de date qui sont dans l'année en cours). | ||||
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) > Contrôles riches > DataGrid | |||||
| |||||
Auteurs :, | |||||
Tout d'abord, il est nécessaire de mettre la colonne dans laquelle on souhaite mettre l'image en TemplateColumn. | |||||
<ItemTemplate> Height="12px"ImageAlign="Middle"CommandName="Item"> </asp:ImageButton> <asp:Image id=imgValidated runat="server"Width="12px"ImageUrl=""Height="12px" ImageAlign="Middle"> </asp:Image> </ItemTemplate> | |||||
Le code du traitement dans le code-behind: | |||||
Auteurs :, | |||||
Pour placer une image dans un DataGrid il suffit d'utiliser une TemplateColumn et d'y placer l'image (par des composants html classiques ou par des composants aspnet): | |||||
<asp:DataGrid id="DataGrid1"AutoGenerateColumns=false> <Columns> <asp:TemplateColumn> <ItemTemplate><img scr='<%# Databinder.Eval(Container.DataItem,"Path")%>'> </ItemTemplate></asp:TemplateColumn> </Columns> </asp:DataGrid> | |||||
Il est bien entendu possible d'ouvrir une page lors d'un clic sur l'image par: | |||||
<asp:DataGrid id="DataGrid1"AutoGenerateColumns=false> <Columns> <asp:TemplateColumn> <ItemTemplate> <a href='mon_url'><img scr='<%# Databinder.Eval(Container.DataItem,"Path")%>'> </a> </ItemTemplate> </asp:TemplateColumn> | |||||
Comment n'afficher que l'heure d'un champ type DateTime dans un DataGrid ? |
Auteurs :, |
Chaque colonne d'un DataGrid à une propriété DataFormatstring. Pour n'afficher que l'heure d'un champ DateTime la chaîne de caractères à mettre pour la propriété DataFormatstring est : • {0:HH:mm} : pour afficher les heures (de 0 à 24) et les minutes • {0:hh:mm} : pour afficher les heures (de 1 à 12) et le minutes • {0:HH:mm:s} : pour afficher les heures (de 0 à 24), les minutes et les secondes Pour plus d'informations sur les formats personnalisés d'affichage de DateTime voir le site MSDN |
lien : |
</Columns> </asp:DataGrid> | |
Auteurs :, En plaçant le DataGrid dans un div, il est possible de spécifier la hauteur affichable du DataGrid (plus exactement du div). Si celui-ci dépasse la taille du div, une scrollbar apparaît. | |
<div style="height:400; overflow:auto"> <asp:DataGrid runat="server"ID="Dg"> </asp:DataGrid> </div> | |
lien : Comment adapter la hauteur du DataGrid en fonction du nombre de lignes à afficher ? | |
Auteurs :, | |
Le principe est le même pour lier un DataGrid à une Css que pour lier un Calendar à une Css : il faut lier chaque style définissant l'aspect du WebControl à une classe Css. Pour éviter la redondance d'informations sur cette FAQ je vous renvoie à la question : "Comment lier une Css à un Calendar ?" | |
lien : Comment lier un Calendar à une Css ? |
Comment éviter d'indiquer le nombre de pages d'un DataGrid/GridView lorsque celui-ci est 1 ? | |
Auteurs :, | |
La solution est assez simple. Il suffit de vérifier combien de données nous souhaitons afficher. Si le nombre de lignes est inférieur au nombre d'éléments à afficher par page, il ne reste qu'à interdire le paging, ce qui aura pour effet de cacher la ligne contenu le nombre de pages. | |
IfDataSet1.Tables(0).Rows.Count<=dg.PageSizeThendg.AllowPaging=FalseElse dg.AllowPaging=True EndIf |
lien : Comment formater une date pour l'affichage ? |
Comment adapter la hauteur du DataGrid en fonction du nombre de lignes à afficher ? | |
Auteurs :, | |
Cette question va paraître simpliste pour certain, mais en parcourrant notre forum je me suis aperçu qu'on avait été pas mal à se prendre là tête la dessus. Quand on utilise un DataGrid avec l'option AutoGenerateColumns="true" on a la hauteur du DataGrid qui s'ajuste automatiquement en fonction du nombre de ligne qu'affiche la page. La solution à ce problème est ultra simple (encore fallait-il trouver) il suffit juste de ne pas préciser la hauteur (height) du DataGrid !!! | |
lien : Comment ajouter une scrollbar à un DataGrid ? | |
Comment ajouter une colonne de WebControls dans un DataGrid ? | |
Auteurs :, | |
Dans cet exemple nous allons ajouter une colonne de boutons : Dans le code de la page aspx : | |
<Columns> <asp:TemplateColumn> <HeaderStyle Width="600px"></HeaderStyle> <ItemTemplate> <asp:Button id="Button1"runat="server"Text="NotreBouton"></asp:Button> </ItemTemplate> </asp:TemplateColumn> <Columns> | |
Dans le <itemTemplate> on peut mettre n'importe quel WebControl. Il y a aussi la balise <EditItemTemplate> dans laquelle on met le WebControl affiché quand la cellule où se trouve le <iItemTemplate> est en mode édition. Si vous possédez Visual Studio, il y a encore plus simple : Allez dans le property builder du DataGrid => Columns, et changez une boundsColumns en template columns à l'aide d'un lien en bas de la fenêtre Ensuite du sortez du property builder, faites un click droit sur le DataGrid => edit template. Et la vous pouvez éditer la template column avec l'IDE en faisant du Drag & Drop. |
Pourquoi dois-je cliquer deux fois pour afficher une autre page de mon DataGrid? | |
Auteurs :, | |
Cela est certainement dû au fait que vous chargez les informations du DataGrid AVANT d'effectuer le changement de page. Comment cela peut-il arriver? Tout simplement en effectuant un DataBind dans le Page_Load de la page. Il suffit donc de faire: | |
PrivateSubPage_Load(ByValsenderAsObject,ByValeAsSystem.EventArgs) IfNotMe.IsPostBackThen' Définition de la source à faire dataGrid1.DataBind EndIf EndSub PrivateSubdtgFiltreIndicateurs_PageIndexChanged(ByValsourceAsObject,ByValeAs .WebControls.DataGridPageChangedEventArgs) | |
Dans le code behind dans la méthode liée à l'évènement DataBinding: | |
e.Item.Cells(Colonne).Width=NewUnit(tailleEnPx) | |
où Colonne et tailleEnPx sont des entiers. | |
Comment passer un argument à la fonction liée à l'événement OnClick d'un bouton? | |
Auteurs :, | |
Il est possible de passer un argument à une fonction liée à l'événement OnClick d'un bouton. Pour cela, il suffit d'utiliser la propriété CommandArgument. Cette propriété est très utile principalement lorsque l'on souhaite mettre un bouton dans un Repeater, un DataList ou un DataGrid. | |
<asp:Button runat=server CommandArgument='<%# DataBinder.Eval(Container.DataItem,"champ")%>'/> | |
Dans la fonction liée à l'événement: | |
PublicSubDelete(ByValsenderAsObject,ByValeAsSystem.EventArgs) DimbuAsButton=CType(sender, Button) DimargumentAsString=bu.CommandArgument EndSub | |
' Définition de la source à faire dataGrid1.CurrentPageIndex=e.NewPageIndex dataGrid1.DataBindEndSub | |
Comment changer la taille de la textbox d'édition de mon datagrid ? | |
Auteurs :, | |
Voici un petit exemple de code : Dans la page .aspx : | |
<asp:DataGrid id="MonDatagrid"runat="server"AutoGenerateColumns="False"> <Columns> <asp:TemplateColumn HeaderText="Colonne1"> <ItemTemplate> <%#Container.DataItem("nomdemacolonne")%> </ItemTemplate> <EditItemTemplate> <asp:Textbox runat="server"width="600"maxlength="600"/> </EditItemTemplate> </asp:TemplateColumn> | |
dans le code-behind | |
PrivateSubMonDatagrid_PreRender(sAsObject, eAsEventArgs) IfMonDatagrid.EditItemIndex>-1ThenDimmatextboxAsTextBox matextbox=CType(MonDatagrid.Items(MonDatagrid.EditItemIndex).Cells(0).Controls(0), TextBox) matextbox.Width=Unit.Parse("4cm") 'on peut biensur changer d'autre propriétées de la textbox d'édition des données ;-) EndSub | |
Auteurs :, | |
Dans cette exemple on va mettre un fond rouge à toutes les cellules de la 4ème ligne de "Mondatagrid", sachant qu'il comporte 4 colonnes : | |
PrivateSubMondatagrid_ItemDataBound(ByValsenderAsObject,ByValeAs_ .WebControls.DataGridItemEventArgs) Handles Mondatagrid.ItemDataBound IfNote.Item.ItemIndex=-1ThenIfe.Item.ItemIndex=4Then e.Item.Cells(0).BackColor= e.Item.Cells(1).BackColor= e.Item.Cells(2).BackColor= e.Item.Cells(3).BackColor=EndIf EndIf EndSub |
Comment rendre une colonne invisible si AutoGenerateColumns="true" ? | |
Auteurs :, | |
En effet, beaucoup d'entre nous l'on remarqué, lorsque le datagrid a sa propriété AutoGenerateColumns à "true" le code : | |
Mondatagrid.columns(1).visible=False | |
NE MARCHE PAS En effet ce code ne marche que si votre datagrid est fait à base de templates columns. Il existe cependant une astuce : dans la page aspx : | |
<asp:DataGrid id="Mondatagrid"runat="server"AutoGenerateColumns="True" OnItemDataBound="Mondatagrid_OnItemDataBound"/> | |
dans le code-behind | |
PrivateSubMondatagrid_ItemDataBound(sAsObject, eAsDatagridItemEventArgs) e.Item.Cells(1).Visible=False EndSub | |
Est-ce bon de sauvegarder le contenu d'un DataGrid dans le ViewState ? | |
Auteurs :, | |
La réponse est non. Effectivement le ViewState est transféré lors de chaque aller/retour vers le serveur. Si le DataGrid contient beaucoup d'informations, le ViewState sera également très grand. On perdra ainsi deux fois du temps Une fois pour envoyer les données du DataGrid, l'autre pour le viewState. Pour éviter de recharger constamment le DataSet, il est possible de le sauvegarder dans une variable de session ou d'application (selon si il existe un DataGrid par utilisateur ou un pour toute l'application) | |
J'ai une erreur javascript lorsque j'utilise le paging d'un DataGrid. Pourquoi? | |
Auteurs :, |
Le fait de le placer dans ce <form runat="server" id="form1"> </form> permet de générer le javascript nécessaire pour changer de page.
Comment passer deux paramètres à une url d'hyperlink dans un DataGrid? | |
Auteurs :, | |
L'hyperlink ne le permet pas. Par contre, il est possible d'utiliser un ItemTemplate au lieu d'une HyperLinkColumn. | |
<ItemTemplate> <a href="?param1=<%# (Container.DataItem, "Colonne1") %>¶m2=< %# (Container.DataItem, "Colonne2") %>"/> </ItemTemplate> | |
Le premier paramètre comprendra ainsi le contenu de la colonne1, le second contenant celui de la colonne2 et ce pour chaque ligne de la source de données. | |
J'ai l'erreur "DataGrid with id 'datagridId' could not automatically generate any columns from the selected data source", que faire? | |
Auteurs :, | |
Bien que le DataGrid.DataSource accepte toute liste qui propose un énumérateur, il ne sait cependant pas toujours comment récupérer les informations de cette liste. Dans le cadre d'une HashTable, il est ainsi nécessaire de passer par un ItemTemplate et de spécifier la valeur "false" à l'attribut AutoGenerateColumns: | |
<asp:DataGrid AutoGenerateColumns=False id="datagrid"runat="server"> <Columns> <asp:TemplateColumn> <ItemTemplate> Clé:<%# %>, Valeur:<%# Container.DataItem.Value %> </ItemTemplate></asp:TemplateColumn> </Columns> </asp:DataGrid> | |
Comment retrouver un contrôle d'un DataGrid et lui assigner une fonction javascript ? | |
Auteurs :, | |
Public Sub AttacherJavaScript(ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) If e.Item.ItemType=ListItemType.Header Then ' Conteneur temporaire Dim Img0 As HtmlImage ' Recuperation du contrôle et ajout d'un attribut contenant du javascript monCtrl=DirectCast(e. Img0.Attributes.Add("onclick","maFonction(alert('Le Javascript est passé'););") |
( | End If End Sub |
Merci à Johan Coffigniez pour sa participation) |
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) > Contrôles AJAX | ||||
| ||||
Auteurs :, | ||||
Vous pouvez placer votre ScriptManager à n'importe quel niveau, cependant afin de vous faciliter le tout, placez le dans la Master Page. Dès lors, si vous désirez modifier le comportement de votre ScriptManager pour une page (ContentPage) particulière, vous pouvez utiliser le ScriptManagerProxy. Notez également que vous avez la possibilité de mettre le ScriptManager dans chacune des Content Pages. | ||||
Je fais un drag and drop des composants AJAX et je reçois une erreur " Sys is undefined " au chargement de la page, pourquoi ? | ||||
Auteurs :, | ||||
Peut être avez-vous essayé d'ajouter de tels contrôles dans un site qui n'est pas configuré pour. Vérifiez le fichier web.config. Si vous ne trouvez pas de trace de l'ajout d'une assembly .Extensions, il faudra configurer le web.config en conséquences. Par ailleurs, vérifier les versions des composants. Effectivement, si vous utilisez 2.0, vous devez avoir les composants pour 2.0 et non ceux pour 3.5. | ||||
Comment éviter que le panel lié à un modal popup extender ne soit visible pendant le chargement de la page? | ||||
Auteurs :, | ||||
Il s'uffit d'ajouter le style display:none au panel. | ||||
(HtmlTextWriterStyle.Display,"none") | ||||
Il faut associer le panel lié au popup modal | ||||
modal.PopupControlID= | ||||
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) > Contrôles Silverlight | |||||
| |||||
Auteurs :, | |||||
En utilisant le web control. | |||||
- - - - - - - | <asp:Silverlight> | ||||
Par exemple : Width="400"Height="300"/> | |||||
Il faudra bien sur avoir défini le tag au préalable : | |||||
<%@ Register Assembly=".Silverlight"Namespace=".SilverlightControls" TagPrefix="asp"%> | |||||
ou alors dans le web.config | |||||
<add tagPrefix="asp"namespace=".SilverlightControls" assembly=".Silverlight"/> | |||||
Ne pas oublier également de référencer l'assembly .Silverlight dans votre projet. Quelques propriétés disponibles pour ce contrôle : Source : l'url de fichier xap à utiliser Version : la version minimale de silverlight qui doit être vérifiée (pour utiliser silverlight 2, mettre cette propriété à 2.0) ScaleMode : ou ScaleMode.Stretch ou Width : la largeur du contrôle Height : la hauteur du contrôle OnPluginLoaded : associe une fonction javascript et l'execute lorsque l'application silverlight est chargée OnPluginError : associe une fonction javascript et l'execute lorsque l'application silverlight a une erreur N'oubliez pas non plus d'ajouter la balise : | |||||
<asp:ScriptManager runat="server"/> | |||||
Comment faire communiquer mon application Silverlight avec ma page ? | |||||
Auteurs :, | |||||
En utilisant le DOM. Soit par exemple l'extrait de page ASPX suivant : | |||||
<asp:ScriptManager ID="ScriptManager1"runat="server"></asp:ScriptManager> <div style="height:100px"> <asp:Silverlight ID="Xaml1"runat="server"Source="" MinimumVersion="2.0.30523"Width="100%"Height="100%"/> </div> <div id="result"></div> | |
qui contient un controle <asp:Silverlight> et un <div> identifié par son id : "result". On utilisera la classe System.Windows.Browser.HtmlPage, par exemple, lors du click sur un bouton Silverlight, on pourra faire : | |
Ainsi, on pourra modifier le contenu du div depuis notre application Silverlight. |
Sommaire > WebForms > Contrôles > Contrôles serveur (WebControl) > WebControls Gratuits | |
| |
Auteurs :, | |
Microsoft propose gratuitement quelques WebControls supplémentaires ici. Microsoft n'offre pas de support pour ces WebControls. Voici une petite procédure d'installation : 1- télécharger sur le site de microsoft WebControls a l'adresse suivante : 2 - Faire très attention au prerequis avant le download. 3 - Aprés le download, il va s'installer dans program files un répertoire C:\Program Files\IE Web COntrols. Dans cerépertoire, vous trouverez un batch nommé . 4 - Ouvrez une fenêtre de commande prompt et mettez vous dans ce répertoire (cf. C:\Program Files\IE WebCOntrols) éxécutez le (C:\Program Files\IE Web COntrols>) Et voila! |
Dans le répertoire build, vous trouverez la dll , fichier que vous pouvez importer dans n'importe quel bin de votre appli!
Auteurs :, |
Un WebControl gratuit disponible sur MSDN. |
lien : |
Auteurs :, |
Un WebControl gratuit disponible sur MSDN. |
lien : |
Auteurs :, |
Un WebControl gratuit de MSDN. |
lien : |
Auteurs :, |
Voici un exemple de progress bar avec un tutoriel, une démo et les sources (en anglais) : |
Auteurs :, |
Le vrai nom du contrôle est calendar popup, mais c'est en fait un contrôle qui ressemble au DateTimePicker. Ce contrôle est très bien fait et paramètrable à souhait, on peut même linker des classes Css aux styles. Depuis que je l'ai découvert je n'utilise plus le calendar ;p Une démo ici : |
Auteurs :, |
Ici une démo :
Auteurs :, |
Ce contrôle vous permet de faire facilement un masque de saisie dans une textbox. Trés facile à configurer si vous avez votre expression régulière ;) Ici une démo : |
Auteurs :, |
On s'est tous déjà trouvé devant le problème suivant : remplir une dropdownlist avec plusieurs champs d'une datatable. Des solutions plus ou moins complexes existent, mais là vous avez à votre disposition un contrôle qui gère ce problème de manière très simple. Ici une démo : |
Auteurs :, |
On s'est tous déjà trouvé devant le problème suivant : remplir une listbox avec plusieurs champs d'une datatable. Des solutions plus ou moins complexes existent, mais là vous avez à votre disposition un contrôle qui gère ce problème de manière trés simple. Ici une démo : |
Auteurs :, |
Contrairement au textbox, la numeric box n'accepte que des chiffres ;p Paramètrable à souhait si vous ne voulez authoriser que la saisie d'entier, de positif, etc Ici une démo : |
Auteurs :, |
Ce contrôle est un TimePicker, très flexible et facilement configurable. |
Ici une démo :
Auteurs :, |
Ce composant est gratuit pour une utilisation personnelle. Il s'agit d'un éditeur HTML très complet à intégrer dans vos applications . |
lien : |
Sommaire > WebForms > Contrôles > Contrôles personnalisés (Custom Controls) | |||||
| |||||
Auteurs :, | |||||
On crée un composant personnalisé lorsqu'on a besoin de créer un contrôle propre qui doit se comporter comme un WebControl. Il s'agit de créer une classe qui hérite de WebControl. add -> new item -> class | |||||
PublicClassMonWebControl Inherits WebControl EndClass | |||||
Toute la logique interne doit ensuite etre implémentée, événement, rendu, etc | |||||
Quelle est la différence entre un composant personnalisé et un contrôle utilisateur ? | |||||
Auteurs :, | |||||
Un contrôle utilisateur (userControl) et un contrôle personnalisé (customControl) sont tous les deux des contrôles. Ils ont en général tous les deux pour but d'être des composants réutilisables. Les contrôles utilisateurs sont en général des contrôles composés d'autres contrôles de base à utiliser dans des situations précises. Ca peut etre le cas par exemple pour un contrôle utilisateur de login, qui possède deux labels, deux textbox et un bouton valider, ainsi que le traitement associé au bouton valider. Les contrôles personnalisés sont en général des contrôles unitaires qui font une tache unique et qui sont créés de A à Z ou en dérivant d'un contrôle existant. Il peut s'agir par exemple d'un textbox numérique qui sera exactement comme un textbox sauf qu'on pourra saisir uniquement des nombres. En général, on crée un contrôle personnalisé lorsqu'il a pour vocation d'etre utilisé dans plusieurs applications. Si le contrôle ne doit etre utilisé que dans un seul site web, on créera en général un contrôle utilisateur. Un contrôle utilisateur est une page dont l'extension est .ascx alors qu'un contrôle personnalisé sera une assembly | |||||
Auteurs :, | |||||
Il s'agit d'abord d'utiliser la directive Register en précisant un préfixe, le namespace et l'assembly qui contient le contrôle. | |||||
<%@ Register TagPrefix="Exemple"Namespace="testWeb"Assembly="testWeb"%> | |||||
Pour utiliser le contrôle, on fera ensuite : | |||||
<Exemple:MonControle ID="monId"runat="server"/> | |||||
Comment créer un composant personnalisé à partir d'un contrôle existant ? | |
Auteurs :, | |
Il faudra faire dériver notre custom control du contrôle père et surcharger les méthodes qui nous intéressent. | |
PublicClassMonImageRollOver Inherits Image Private_imageOverUrlAsString PublicPropertyImageOverUrl()AsString Get Return _imageOverUrl EndGet Set(ByValvalueAsString) _imageOverUrl=value EndSet EndProperty Protected OverridesSubOnPreRender(ByValeAsSystem.EventArgs) ("onmouseover",String.Format(" = '{0}'", _imageOverUrl)) ("onmouseout",String.Format(" = '{0}'", ImageUrl)) MyBase.OnPreRender(e) EndSub EndClass | |
On a rajouté ici la propriété ImageOverUrl et surchargé le rendu en ajoutant les attributs javascript onmouseover et onmouseout. On pourra utiliser le contrôle de cette facon : | |
<Exemple:MonImageRollOver ID="IdImageRollover"runat="server"ImageUrl="" ImageOverUrl=""/> | |
Auteurs :, | |
il faudra surcharger la méthode | |
Protected OverridesSubRender(ByValwriterAs.HtmlTextWriter) | |
et utiliser l'objet HtmlTextWriter pour faire le rendu. Exemple : voici l'implémentation d'un contrôle hyperlink de A à Z qui gère le rollover | |
PublicClassMonHyperLinkRollOver Inherits WebControl |
<Exemple:MonHyperLinkRollOver ID="MonImageRollOver1"NavigateUrl=""runat="server" ImageUrl=""ImageOverUrl=""alt="mon alt"/> | |
produira en sortie : | |
<a href=""><img id="MonImageRollOver1"src=""style="border:none;" alt="mon alt"onmouseover=" = ''"onmouseout=" = ''"/></a> | |
Comment faire pour référencer automatiquement un contrôle dans toutes les pages ? | |
Auteurs :, | |
il faut placer sa définition dans le web.config : | |
<pages> <controls> <add tagPrefix="Exemple"namespace="testWeb"assembly="testWeb"/> </controls> </pages> | |
Sommaire > WebForms > Contrôles > Contrôles de validation | ||||
| ||||
Auteurs :, | ||||
Un validator est un contrôle serveur particulier qui permet de faire de la validation de saisie par l'utilisateur. La validation des données constiste à vérifier qu'on récupère bien une date là où l'utilisateur doit saisir une date, qu'on récupère bien un nombre où l'on doit récupérer un nombre et pas une chaine. Le framework simplifie ces vérifications à l'aide des validators. Ce sont des contrôles qui intègrent la logique permettant de vérifier la saisie des utilisateurs. Ils vont grandement nous simplifier la tache pour vérifier qu'un champ obligatoire est correctement saisi ou qu'une valeur correspond bien à ce qu'on attend, etc Ils permettent de contrôler la saisie coté client si le navigateur le supporte, ce qui améliore l'interaction avec l'utilisateur. Ils permettent également de valider les saisies du coté du server, ce qui est une étape OBLIGATOIRE. Les validators nous facilitent grandement la tache en disposant d'un moyen puissant de contrôler la saisie et d'afficher des messages d'erreurs pour avertir de la saisie incorrecte. | ||||
Peut-on se passer de la validation coté serveur et n'utiliser que la validation coté client ? | ||||
Auteurs :, | ||||
Non ! Ou alors, à vos risques et périls. En effet, la validation coté client peut avoir été désactivée ou altérée par du code malveillant. La seule façon fiable de vérifier la validité d'une saisie est de la faire coté serveur. | ||||
A quel moment intervient la validation dans le cycle de vie d'une page ? | ||||
Auteurs :, | ||||
La validation des contrôles apparait à un moment précis du cycle de vie d'une page, entre la fin des événements d'initialisation par le code utilisateur et les événements des contrôles. Cela se passe bien entendu après le chargement des valeurs du postback par la page et avant les événements des contrôles. Cela permet de savoir au moment du click sur un bouton si la page est correcte et dans ce cas, rediriger vers la bonne page par exemple. | ||||
Auteurs :, | ||||
Il y a trois possibilités pour afficher un message d'erreur. La première consiste à utiliser la propriété Text. Le message s'affiche en rouge par défaut | ||||
<div><asp:TextBox runat="server"ID="LeTextBox"/> </div> <asp:RequiredFieldValidator runat="server"ControlToValidate="LeTextBox" Text="Le champ doit être saisi"/> <asp:Button runat="server"Text="Valider"/> | ||||
La deuxième est d'utiliser la propriété ErrorMessage. L'utilisation de la propriété ErrorMessage semble produire le même effet que la propriété Text. Il y a cependant une différence, le fait de définir la propriété ErrorMessage permettra au contrôle ValidationSummary de réutiliser le message d'erreur. | |
<asp:RequiredFieldValidator runat="server"ControlToValidate="LeTextBox" ErrorMessage="Le champ doit être saisi"/> | |
Enfin, on peut utiliser un message personnalisé entre les balises du contrôles. Ceci permet d'obtenir une présentation plus poussée en fonction des besoins. | |
<asp:RequiredFieldValidator runat="server"ControlToValidate="LeTextBox"> Le message doit être saisi<img src=""alt="erreur de saisie"/> </asp:RequiredFieldValidator> | |
Il y a également trois modes d'affichage que l'on peut choisir en utilisant la propriété Display : * Display="None" : Permet de ne pas afficher de message d'erreur. Le fait de ne pas afficher de message d'erreur peutêtre utile lorsqu'on utilise un ValidationSummary. | |
Auteurs :, | |
Les contrôles serveur que l'on peut valider sont : • TextBox • ListBox • DropDownList • RadioButtonList • HtmlInputText • HtmlTextArea • HtmlSelect | |
Auteurs :, | |
Pour vérifier que les validators de la page sont tous valides, on va tester la propriété IsValid de la page. Si elle vaut vrai, c'est que la validation est bonne, on peut poursuivre alors. | |
ProtectedSubButtonClick(ByValsenderAsObject,ByValeAsRoutedEventArgs) |
IfPage.IsValidThen ' la page est valide Response.Redirect("") EndIf EndSub | |
Auteurs :, | |
Un groupe de validation permet de regrouper des validators et de les associer à un contrôle qui déclenchera la validation. Il est assez courant d'avoir plusieurs boutons sur une page et seuls certains champs doivent être validés en fonction du bouton cliqué. Imaginons une page qui contient une zone d'identification, avec un TextBox pour un login et un TextBox pour un mot de passe. Un bouton permet de valider ce login. Sur cette même page, on a une zone qui permet de saisir un email pour s'inscrire à une newsletter, avec un TextBox et un bouton. Il ne faut bien sur pas valider les informations du login si on choisit de s'inscrire à la newsletter. Pour ceci, on va indiquer les contrôles qui sont reliés à un bouton en les plaçant dans un même groupe, grâce à la propriété ValidationGroup. Ainsi, je pourrais placer sur la même page mes différents champs, mes différents boutons de validation et mes différents validators. Par exemple, les contrôles associés au login seront dans le groupe login (ValidationGroup="login"): | |
Login:<asp:TextBox runat="server"ID="Login"/> Mot de passe:<asp:TextBox runat="server"ID="Pwd"TextMode="Password"/> <asp:RequiredFieldValidator ID="RequiredFieldValidator1"runat="server"ControlToValidate="Login" <asp:RequiredFieldValidator ID="RequiredFieldValidator2"runat="server"ControlToValidate="Pwd" ErrorMessage="N'oubliez pas de saisir votre mot de passe"Display="dynamic" ValidationGroup="login"/> <asp:Button ID="Button1"runat="server"Text="Valider"OnClick="ButtonClick" ValidationGroup="login"/> | |
Et les contrôles associés à la newsletter seront dans le groupe newsletter (ValidationGroup="newsletter"). | |
<asp:TextBox runat="server"ID="email"/> <asp:RequiredFieldValidator ID="RequiredFieldValidator3"runat="server"ControlToValidate="Login" ErrorMessage="N'oubliez pas de saisir votre login"Display="dynamic" ValidationGroup="newsletter"/> <asp:RegularExpressionValidator ID="RegularExpressionValidator1"runat="server" ControlToValidate="email" ErrorMessage="L'email saisi n'est pas correct"Display="dynamic"ValidationGroup="newsletter" ValidationExpression="^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9] {1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$"/> <asp:Button ID="Button2"runat="server"Text="Valider"OnClick="ButtonClickNewsLetter" ValidationGroup="newsletter"/> | |
Sommaire > WebForms > Contrôles > Contrôles de validation > RequiredFieldValidator | |||||
| |||||
Auteurs :, | |||||
Le, comme son nom le suggère, permet de tester si un champ est rempli ou non. | |||||
<asp:TextBox runat="server"ID="LeTextBox"/> <asp:RequiredFieldValidator runat="server"ControlToValidate="LeTextBox"Display="dynamic" ErrorMessage="Vous devez saisir la valeur"/> <asp:Button runat="server"Text="Valider"/> | |||||
Ici le RequiredFieldValidator va vérifier que le contrôle LeTextBox (précisé dans ControlToValidate) soit bien saisi. Si ce n'est pas le cas, il affichera la valeur de ErrorMessage. | |||||
Auteurs :, | |||||
Les RequiredFieldValidator effectue ses vérifications lors de chaque envoi au serveur. Dans le cas d'un bouton "Annuler" ou "Précédent", cela est un peu embêtant puisque les données ne seront certainement pas correctes et la page ne sera donc pas envoyée au serveur. Pour résoudre cela, il suffit de mettre la propriété CausesValidation du bouton à false. | |||||
<asp:Button id="button1"runat="server"CausesValidation="false"/> | |||||
Sommaire > WebForms > Contrôles > Contrôles de validation > RangeValidator | ||
| ||
Auteurs :, | ||
Levérifie si la valeur d'un contrôle d'entrée se trouve dans une plage de valeurs spécifiée. On peut comparer des Integer, Double, Date, String et Currency. Pour préciser quel type on attend, on va utiliser la propriété Type. Les bornes à valider seront saisies grâce aux propriétés MinimumValue et MaximumValue. | ||
<asp:TextBox runat="server"ID="LeTextBox"/> <asp:RangeValidator runat="server"ControlToValidate="LeTextBox"Type="currency"MinimumValue="100" MaximumValue="200"Display="dynamic"ErrorMessage="Saisissez un montant entre 100 et 200 #"/> | ||
NB : si le contrôle est vide, la validation sera toujours bonne. Si cette valeur doit obligatoirement être saisie, on combinera le RangeValidator avec un A quoi sert le RequiredFieldValidator ?. |
Sommaire > WebForms > Contrôles > Contrôles de validation > CompareValidator | ||
| ||
Auteurs :, | ||
Lepermet de comparer la valeur entrée par l'utilisateur avec une valeur ou avec la valeur d'un autre contrôle. On peut également se servir de ce contrôle pour vérifier qu'une donnée saisie est d'un type particulier. (on utilisera l'opérateur DataTypeCheck). Pour effectuer la comparaison, on utilisera un opérateur qui permettra de spécifier le type de l'opération. On pourra effectuer une comparaison d'égalité (Equal), d'inégalité (NotEqual), de supériorité (GreaterThan), de supériorité ou d'égalité (GreaterThanEqual), d'infériorité (LessThan) et enfin d'infériorité ou d'égalité (LessThanEqual). Exemple pour comparer à une valeur : | ||
<asp:TextBox runat="server"ID="LeTextBox"/> <asp:CompareValidator runat="server"ControlToValidate="LeTextBox"Type="Integer" Operator="NotEqual"ValueToCompare="0" ErrorMessage="L'entier saisi doit être différent de 0"/> <asp:TextBox runat="server"ID="LeTextBoxDate"/> <asp:CompareValidator ID="CompareValidator1"runat="server"ControlToValidate="LeTextBoxDate" Type="Date" Operator="GreaterThan"ValueToCompare="01/01/2000" ErrorMessage="Vous devez être né après l'an 2000 pour bénéficier de cette promotion"/> | ||
Exemple pour comparer à une valeur : | ||
<asp:TextBox runat="server"ID="Email1"/> <asp:TextBox runat="server"ID="Email2"/> <asp:CompareValidator runat="server"ControlToValidate="Email1"Type="String"Operator="Equal" ControlToCompare="Email2"ErrorMessage="Les emails saisis doivent être identiques !"/> | ||
Exemple pour vérifier la validité d'un type : | ||
<asp:TextBox runat="server"ID="LeTextBox"/> <asp:CompareValidator runat="server"ControlToValidate="LeTextBox"Type="Integer" Operator="DataTypeCheck" ErrorMessage="Veuillez saisir un entier"Display="Dynamic"/> | ||
Sommaire > WebForms > Contrôles > Contrôles de validation > RegularExpressionValidator | |||||
| |||||
Auteurs :, | |||||
Lepermet de vérifier une entrée à partir d'une expression régulière. Par exemple, pour vérifier un email : | |||||
<asp:TextBox runat="server"ID="LeTextBox"/> ErrorMessage="L'email saisi n'est pas correct"Display="dynamic" ValidationExpression="^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9] {1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$"/> | |||||
Comment vérifier la validité d'une adresse ip dans un TextBox ? | |||||
Auteurs :, | |||||
Il convient d'utiliser un RegularExpressionValidator pour vérifier la strucuture de la chaîne: | |||||
<asp:RegularExpressionValidator id="RegularExpressionValidator"runat="server"Display="Static" ControlToValidate="NsAd1"ValidationExpression="([0-2]?[0-9]?[0-9]\.){3}[0-2]?[0-9]?[0-9]"> </asp:RegularExpressionValidator> | |||||
Sommaire > WebForms > Contrôles > Contrôles de validation > CustomValidator | ||
| ||
Auteurs :, | ||
Lepermet de créer sa propre fonction de validation, coté client et coté serveur. On utilisera l'attribut ServerValidate pour fournir sa propre méthode de validation coté serveur. A noter que la propriété ControlToValidate n'est pas obligatoire, on pourra effectivement utiliser directement les contrôles de la page pour faire notre validation. Pour faire une validation coté client, il faudra créer une fonction javascript dont le nom sera passé à la propriété ClientValidationFunction. On utilisera également les paramètres pour donner le résultat de la validation et connaitre la valeur de l'objet associé à ControlToValidate. On pourra utiliser ValidateEmptyText pour indiquer si un texte vide devra être soumis à validation. Cela ne nous dispense pas de devoir tester si la valeur est vide ou non, cela signifie que lorsqu'un contrôle est vide, on passera dans la fonction de validation. Exemple de validation coté serveur : | ||
<asp:TextBox runat="server"ID="NombrePair"/> <asp:CustomValidator runat="server"ControlToValidate="NombrePair" ClientValidationFunction="ValideNombrePair"OnServerValidate="ValiderNombrePair" Display="dynamic"/> <asp:Button runat="server"Text="Valider"OnClick="ButtonClick"/> | ||
ProtectedSubButtonClick(ByValsenderAsObject,ByValeAsRoutedEventArgs) IfPage.IsValidThen //la page est valide, continuer EndIf EndSub ProtectedSubValiderNombrePair(ByValsourceAsObject,ByValargsAsServerValidateEventArgs) DimnombreAsInteger IfInt32.TryParse(args.Value, nombre)Then args.IsValid=nombre%2==0 return EndIf args.IsValid=false EndIf | ||
Cette même validation coté client : | ||
<script type="text/javascript"> functionValideNombrePair(sender,args){ if(args.Value=='') args.IsValid=false;else args.IsValid=(args.Value%2==0); } </script> |
Pensez impérativement à tester le contenu de la propriété IsValid de la page. C'est cette propriété qui est garant de l'état de validité des données. Voir Comment vérifier qu'une page est valide coté serveur ?. | |
Comment passer des paramètres à la fonction de validation coté client ? | |
Auteurs :, | |
Lorsqu'on utilise des CustomValidator, il est possible de faire passer des valeurs entre le code behind et la fonction javascript du CustomValidator. Pour ce faire, on va utiliser la méthode RegisterExpandoAttribute de l'objet Page.ClientScript. | |
Page.ClientScript.RegisterExpandoAttribute(CustomValidator1.ClientID,"valeur","5") | |
On utilise le ClientID du validator, on lui passe un nom (ici "valeur") et la valeur à passer (ici "5"). Et on pourra récupérer cette info coté client : | |
<asp:CustomValidator ID="CustomValidator1"ValidateEmptyText="true" ClientValidationFunction="Valider" ControlToValidate="LeTextBox"runat="server"ErrorMessage="Le champ n'est pas valide"/> | |
Avec le script suivant : | |
<script type="text/javascript">function Valider(sender,args){ args.IsValid=(args.Value==sender.valeur)} </script> | |
On va vu dans la question Quels sont les contrôles serveur que l'on peut valider ? qu'il n'était pas possible de valider un RadioButton. Une solution est de passer par un CustomValidator. | |
<h4>Civilité :</h4> <asp:RadioButton id="Radio1"Text="M."GroupName="RadioGroup1"runat="server"/> <asp:RadioButton id="Radio2"Text="Mme"GroupName="RadioGroup1"runat="server"/> <asp:RadioButton id="Radio3"Text="Mlle"GroupName="RadioGroup1"runat="server"/> <asp:button ID="Button1"text="Valider"runat="server"/> <asp:CustomValidator ID="CustomValidator1"runat="server"ClientValidationFunction="ValiderRadio"OnServerValidate="ValiderRadio"ErrorMessage="Veuillez saisir la civilité"Display="dynamic"/> |
On va se servir de Comment passer des paramètres à la fonction de validation coté client ? et passer à la fonction javascript cliente les ClientId des RadioButton. | ||
Page.ClientScript.RegisterExpandoAttribute(CustomValidator1.ClientID,"rb1Id", Radio1.ClientID) Page.ClientScript.RegisterExpandoAttribute(CustomValidator1.ClientID,"rb2Id", Radio2.ClientID) Page.ClientScript.RegisterExpandoAttribute(CustomValidator1.ClientID,"rb3Id", Radio3.ClientID) | ||
Ce qui fait que la fonction javascript cliente pourra ressembler à : | ||
<script type="text/javascript">functionValiderRadio(sender, args) { var radio1=document.getElementById(sender.rb1Id); var radio2=document.getElementById(sender.rb2Id); var radio3=document.getElementById(sender.rb3Id); if(radio1&&radio2&&radio3) args.IsValid=radio1.checked || radio2.checked || radio3.checked; else args.IsValid=false; } </script> | ||
Sans oublier la méthode coté serveur : | ||
ProtectedSubValiderRadio(ByValsourceAsObject,ByValargsAsServerValidateEventArgs) args.IsValid=Radio1.CheckedOrRadio2.CheckedOrRadio3.CheckedEndSub | ||
| ||
Auteurs :, | ||
Le contrôlen'est pas un validator comme les autres, il n'effectue pas de validation mais propose de récapituler les différentes erreurs survenues lors de la validation de la page. Il se base uniquement sur le contenu des propriétés ErrorMessage de chaque validator qui n'a pas passé la validation. On a plusieurs possibilités pour avoir un récapitulatif des erreurs. On peut dans un premier temps les voir dans un alert Javascript coté client, il faut utiliser la propriété ShowMessageBox et la mettre à true. | ||
<asp:ValidationSummary runat="server"ShowMessageBox="true"ShowSummary="false"/> | ||
On peut utiliser la propriété DisplayMode : | ||
<asp:ValidationSummary ID="ValidationSummary1"runat="server"DisplayMode="BulletList"/> <asp:ValidationSummary ID="ValidationSummary2"runat="server"DisplayMode="List"/> <asp:ValidationSummary ID="ValidationSummary3"runat="server"DisplayMode="SingleParagraph"/> | ||
NB : penser à mettre AutoEventWireup à false (voir A quoi sert AutoEventWireup ?) | |
Auteurs :, | |
Pour utiliser un contrôle utilisateur dans sa page, il faut utiliser la directive @register pour faire connaitre le contrôle utilisateur à la page : | |
( | <%@ Register Src=""TagName="MonUserControl"TagPrefix="UC"%> |
NB : on peut préciser l'assembly qui contient l'userControl si celle-ci est différente en rajoutant l'attribut Assembly=" .") Pour l'insérer enfin dans sa page, on utilisera la combinaison TagPrefix:TagName : | |
<UC:MonUserControl runat="server"/> | |
Cette dernière ligne de code devra bien sur être ajoutée entre les balises <form> et </form> de sa page. | |
J'ajoute un contrôle dans mon user control et le compilateur ne le reconnait pas dans le code behind ? | |
Auteurs :, | |
Lorsque j'ajoute un contrôle (label) par exemple : | |
L'IDE ajoute automatiquement dans la classe partielle (fichier ) | |
Protected WithEvents monLabelAs.WebControls.Label | |
Il peut arriver que l'ide n'arrive pas à ajouter ce membre en protected (source control qui bloque le fichier, lecture seule, etc ) Dans ce cas, il faudra le rajouter à la main dans ce même fichier Vérifiez également qu'il ne soit pas déclaré en private. | |
Je crée mon user control dynamiquement mais je n'arrive pas à accèder aux champs qu'il contient (null) ? | |
Auteurs :, | |
Lorsque vous essayez d'accèder aux contrôles présents dans votre user control, vous obtenez l'exception : System.NullReferenceException C'est que vous avez probablement cherché à instancier votre usercontrol avec new, de cette facon par exemple : |
DimucAsNewmonUserControl (uc) | |
Ce n'est pas la bonne méthode. Pour charger un UserControl, il faut utiliser LoadControl. La méthode LoadControl lit le fichier et l'instancie comme un contrôle pouvant être ajouté à la page. | |
DimucAsmonUserControl=CType(LoadControl(""), monUserControl) (uc) | |
Remarque : En général, il vaut mieux éviter de charger un contrôle utilisateur dynamiquement ; il vaudra mieux le placer dans la page aspx (ou un usercontrol ascx) quitte à le masquer dans le OnInit si on en a pas besoin suivant certaines conditions | |
Comment accéder aux propriétés d'un WebUserControl en code behind? | |
Auteurs :, | |
Le mieux est de l'expliquer par un exemple: Imaginons que nous développons un petit contrôle permet de rechercher dans la base de données des utilisateurs. Ce qui nous interresse dans cette base sont le nom et le prénom de la personne sélectionnée et d'utiliser ces valeurs dans un traitement quelconque. Pour cela, il suffit de définir des propriétés au contrôle, par exemple: | |
PublicReadOnlyPropertySelectedName()AsString Get Return DdlUsers.SelectedValue.Split(","C)(0) EndGet EndProperty ![]() Get Return DdlUsers.SelectedValue.Split(","C)(1) EndGet EndProperty | |
Dans la page qui héberge le WebControl, il suffit alors de lui donner la référence du WebControl: | |
Protected SpAsSearchPeople | |
Il suffit alors de l'utiliser comme tous les autres composants inclus dans : | |
="Nom : "+Sp.SelectedName+", Prenom: "+Sp.SelectedFirstName |
Auteurs :, | |
La solution la plus classique est de créer des propriétés publiques sur ce contrôle utilisateur et de les renseigner lors de l'ajout du contrôle utilisateur dans la page. Source du contrôle utilisateur : | |
PublicPartialClassmonUserControl Inherits .UserControl Private_maValeurAsString PublicPropertyMaValeur()AsString Get Return _maValeur EndGet Set(ByValvalueAsString) _maValeur=value EndSet EndProperty Protected OverridesSubOnLoad(ByValeAsSystem.EventArgs) =_maValeur MyBase.OnLoad(e) EndSub EndClass | |
dans la | |
<UC:MonUserControl runat="server"MaValeur="une valeur"/> | |
NB : cet exemple initialise la propriété MaValeur à un label dans le onInit. Il aurait pu être judicieux évidement d'utiliser un databinding avec # (voir Qu'est-ce que le scriptlet d'expressions liées<%# expression %>?) voir aussi : Comment passer des paramètres à un userControl ? | |
Comment passer des paramètres au constructeur d'un contrôle utilisateur ? | |
Auteurs :, | |
On peut être tenté lors du chargement dynamique d'un contrôle utilisateur d'utiliser un constructeur qui a des paramètres au lieu de créer des propriétés et de les renseigner. Prenons ce contrôle utilisateur par exemple : | |
PublicPartialClassmonUserControl Inherits .UserControl Private_maValeurAsString PublicSubNew() EndSub |
PublicSubNew(ByValmaValeurAsString) _maValeur=maValeur EndSub =_maValeur EndIf MyBase.OnLoad(e) EndSub EndClass | |
Si on charge ce contrôle utilisateur sans passer de paramètres au constructeur, on aura une valeur par défaut ; sinon on utilisera la valeur passée. On a bien noté qu'il fallait utiliser LoadControl lors d'un chargement dynamique de contrôle utilisateur (voir Je crée mon user control dynamiquement mais je n'arrive pas à accèder aux champs qu'il contient (null) ?) Voici une fonction statique qui s'occupe d'instancier le contrôle utilisateur avec des paramètres dans le constructeur, en utilisant la reflexion | |
PublicSharedFunctionLoadControl(ByValpageAsPage,ByValpathControleUtilisateurAsString, _ ByValParamArray parametresConstructeurAsString())AsUserControl DimconstParamTypesAsNewList(Of Type) ForEachconstParamAsObjectInparametresConstructeur (constParam.GetType()) Next DimucAsUserControl=CType(page.LoadControl(pathControleUtilisateur), UserControl) ' trouve le constructeurDimconstructeurAsConstructorInfo= uc.GetType().BaseType.GetConstructor(constParamTypes.ToArray())' et l'invoke If(constructeurIsNothing)Then ThrowNewMemberAccessException("Contrôle utilisateur non trouvé : "+ uc.GetType().BaseType.ToString())Else constructeur.Invoke(uc, parametresConstructeur) EndIf Return uc EndFunction | |
A utiliser ainsi : | |
DimucAsmonUserControl=CType(LoadControl(Page,"","Ma valeur passée"), monUserControl) (uc) | |
NB : ne pas oublier de créer également un constructeur par défaut, sinon vous aurez l'erreur suivante | |
CS1501: Aucune surcharge pour la méthode 'monUserControl' ne prend d'arguments '0' |
Comment déclarer mon contrôle utilisateur pour qu'il soit déclaré dans toutes mes pages ? | |
Auteurs :, | |
Cela se passe dans le web.config, à la section pages/controls. | |
<> <pages> <controls> <add tagPrefix="cc1"src=""tagName="monUc"/> </controls> </pages> </> | |
<cc1:monUc ID="MonUserControl"runat="server"/> | |
Puis-je afficher un UserControl directement dans mon navigateur ? | |
Auteurs :, | |
Non ce n'est pas possible. Un user control est prévu pour être ajouté dans une Webform (.aspx). Pour le visualiser, vous devez donc l'ajouter à une page web et afficher cette page dans le browser. |
Sommaire > WebForms > Scriptlets | |||||
| |||||
Auteurs :, | |||||
les scriptlets sont des extraits de code figurant dans une page aspx. Ils sont délimités par des marqueurs spécifiques. Le scriptlet | |||||
<% instruction %> | |||||
permet d'éxecuter des instructions dans leur ordre d'appartion dans la page. Elles sont exécutées lors du rendu de la page. Elles permettent d'imbriquer facilement des instructions dans le code html. Exemple : | |||||
<% If(.DayOfWeek=DayOfWeek.SaturdayOr.DayOfWeek= DayOfWeek.Sunday)Then %> <span>Bon week-end</span> <% Else %> <span>Bonne semaine</span> <% EndIf %> | |||||
Qu'est-ce que le scriptlet d'expressions systèmatiques <%= expression %>? | |||||
Auteurs :, | |||||
les scriptlets sont des extraits de code figurant dans une page aspx. Ils sont délimités par des marqueurs spécifiques. Le scriptlet | |||||
<%=expression %> | |||||
permet d'évaluer une expression lorsqu'elle apparait dans la page, dans le contexte d'exécution. Il peut s'agir de valeurs littérales, de variables, ou d'appels de méthodes. Exemple : | |||||
<span>Nous sommes le :<%=.ToShortDateString() %></span> | |||||
Attention, les expressions systématiques ne fonctionnent pas comme valeur d'attribut. Ainsi la syntaxe suivante : | |||||
<asp:Label runat="server"Text='<.ToShortDateString()'/> | |||||
Qu'est-ce que le scriptlet d'expressions liées<%# expression %>? | |||||
Auteurs :, | |||||
les scriptlets sont des extraits de code figurant dans une page aspx. Ils sont délimités par des marqueurs spécifiques. Le scriptlet | |||||
<%# expression %> | |||||
permet d'évaluer une expression lorsque la méthode de page ou de contrôle databinding() est appelée. Le principe est quasimement le même que pour Qu'est-ce que le scriptlet d'expressions systèmatiques <%= expression %>?. Exemple : | |||||
<asp:Label runat="server"Text="<%#DateDuJour %>"ID="MonLabel"/> | |||||
Sachant que dans le code behind, nous aurons (par exemple) : | |||||
Protected ReadOnlyPropertyDateDuJour()AsString Get ReturnString.Format("Nous sommes le {0}", .ToShortDateString()) EndGet EndProperty Protected OverridesSubOnLoad(ByValeAsSystem.EventArgs) IfNotIsPostBackThen MonLabel.DataBind() EndIf EndSub | |||||
Il faut bien faire attention à appeler correctement la méthode DataBind, lorsque l'on en a besoin. | |||||
Qu'est-ce que le scriptlet d'expressions analysées <%$ expression %>? | |||||
Auteurs :, | |||||
les scriptlets sont des extraits de code figurant dans une page aspx. Ils sont délimités par des marqueurs spécifiques. Le scriptlet | |||||
<%$ expression %> | |||||
permet d'analyser une expression à la compilation de la page, évaluée à chaque requete. Ces expressions conviennent bien aux accès aux bases de données par exemple et son evaluées au moment du databind(). connait 3 types d'expressions : |
• ConnectionString, qui va lire dans la section ConnectionStrings du web.config • AppSettings, qui va lire dans la section AppSettings du web.config • Resources, qui lit une entrée dans un fichier de ressources Exemple : | |
<asp:Label runat="server"Text="<%$AppSettings:version%>"ID="MonAppSettingsExpression"/> | |
<appSettings> <add key="version"value="1.0 alpha"/> </appSettings> | |
Comment créer une expression personnalisées <% $expression %> ? | |
Auteurs :, | |
Pour créer une expression personnalisée, il faut hériter de la classe ExpressionBuilder. On aura aussi un attribut de classe de type ExpressionPrefix qui permettra de faire le lien avec le web.config. On devra également surchager la méthode GetCodeExpression qui permet de construire un CodeExpression à partir de l'objet CodeMethodInvokeExpression. Le minimum à implémenter dans cette fonction est de construire cet objet en lui passant le nom de la méthode qui fait l'évaluation : | |
<asp:Label runat="server"Text="<%$monexpression:nico-pyright(c)%>"ID="MonLabelExpression"/> | |
<ExpressionPrefix("monexpression")>_ PublicClassMonExpression Inherits ExpressionBuilder PublicSharedFunctionGetEvaluationString(ByValexpressionAsString)AsObject ReturnString.Format("Hello : {0}", expression) EndFunction PublicOverridesFunctionGetCodeExpression(ByValentryAs.BoundPropertyEntry,ByVal parsedDataAsObject, _ ByValcontextAs.Compilation.ExpressionBuilderContext)As System.CodeDom.CodeExpression ReturnNewCodeMethodInvokeExpression(New CodeTypeReferenceExpression(MyBase.GetType()),"GetEvaluationString", _ NewCodePrimitiveExpression(())) EndFunction EndClass | |
Ici on construit l'objet avec le type de l'expression (le type de la classe) et le nom de la méthode à appeler. Dans le troisième paramètre, on lui passe la valeur de l'expression qui ici vaut "nico-pyright(c)". Il faudra ensuite définir l'expression personnalisée dans le web.config : | |
<compilation debug="true"> <expressionBuilders> <add expressionPrefix="monexpression"type="testWeb.MonExpression, testWeb"/> </expressionBuilders> </compilation> On peut aussi surcharger la méthode GetCodeExpression pour lui passer plus de paramètres, comme le type de l'objet cible (ici un Label) ou le nom de la propriété (ici Text) comme le montre. Il suffira d'utiliser correctement. On aura par exemple : | |
<ExpressionPrefix("monexpression")>_ PublicClassMonExpression Inherits ExpressionBuilder PublicSharedFunctionGetEvalData(ByValexpressionAsString,ByValtargetAsType,ByVal entryAsString)AsObject ReturnString.Format("Hello : {0}", expression) EndFunction PublicOverridesFunctionGetCodeExpression(ByValentryAsBoundPropertyEntry,ByValparsedDataAs Object, _ ByValcontextAsExpressionBuilderContext)AsCodeExpression Dimtype1AsType=entry.DeclaringType Dimdescriptor1AsPropertyDescriptor=TypeDescriptor.GetProperties(type1) () DimexpressionArray1(2)AsCodeExpression expressionArray1(0)=NewCodePrimitiveExpression(()) expressionArray1(1)=NewCodeTypeOfExpression(type1) expressionArray1(2)=NewCodePrimitiveExpression() ReturnNewCodeCastExpression(descriptor1.PropertyType,NewCodeMethodInvokeExpression(NewCodeTypeReferenceExpression (MyBase.GetType()),"GetEvalData", expressionArray1)) EndFunction EndClass | |
Notez que la méthode GetEvalData prends trois paramètres, comme construit pour l'objet CodeMethodInvokeExpression |
Sommaire > WebForms > Evénements | ||
| ||
Auteurs :,, | ||
Générer un évènement: D'abord il faut créer les argument de l'événement : | ||
ImportsSystem PublicClassMyEventArgs Inherits EventArgs PrivatemyArg1AsBoolean PrivatemyArg2AsInteger PublicReadOnlyPropertyArg1AsBoolean Get Return Me.myArg1 EndGet EndPropertyPublicReadOnlyPropertyArg2AsInteger Get Return Me.myArg2 EndGet EndProperty PublicSunNew(ByValarg1AsBoolean,ByValarg2AsInteger) () Me.myArg2=arg2 EndSub EndClass | ||
Il faut aussi un délégué pour typer l'évènement | ||
PublicDelegateSubMyEventHandler(ByValsenderAsObject,ByValeAsMyEventArgs ) | ||
Ensuite il faut créer l'évenement et déclencher les delegates inscrits dans l'événement de la classe émétrice : | ||
PublicClassMyClass ' PublicEvent MyEventAsMyEventHandler ' la méthode protégée dérivable OnMyEvent invoque les délégués. ' L'émetteur (sender) est ici "Me", l'instance courante de la classe. Protected OverridableSubOnMyEvent(ByValeAsMyEventArgs) IfNot(MyEventIsNothing)ThenRaiseEvent MyEvent(Me, e) EndSub EndClass | ||
Pour déclencher l'évenement à partir d'une methode de la classe émétrice : | ||
boolValueAsBoolean=TrueintValueAsInteger=0 Me.OnMyEvent(NewMyEventArgs(boolValue, intValue)) ' ou alors directement |
- - | RaiseEvent MyEvent(Me,NewMyEventArgs(boolValue, intValue)) |
Consommer un évènement Enfin il faut créer et inscrire un délégué dans l'évènement pour que celui-ci soit appelé par la classe émétrice | |
PublicClassMain PrivatemcAsNewMyClass() PublicSubNew() ' on assigne notre Delegate à l'évènement de l'objet AddHandler .MyEvent, AddressOf Me.MyDelegate EndSub PrivateSubMyDelegate(ByValsenderAsObject,ByvaleAsMyEventArgs) ' traitement à effectuer EndSub | |
Remarques Un évènement est TOUJOURS multicast, on peut lui faire contenir plusieurs délégués. On ne peut pas changer les délégués contenus dans un évènement depuis du code extérieur à la classe émétrice si on ne connait pas le nom du délégué. La cause en est la méthode OnEvent qui masque le délégué EventHandler associé ce qui nous empeche d'obtenir la méthode GetInvocationList() du délégué associé à l'évènement. |
Sommaire > WebForms > Web.Config | ||||
| ||||
Auteurs :, | ||||
Auteurs :, | ||||
Il est possible de placer un fichier Web.Config par répertoire. La portée du Web.Config est ainsi ce répertoire et tous ses sous-répertoires sauf si un autre fichier Web.Config se trouve dans un de ses sous-répertoires. Dans ce cas, le Web.Config correspondant sera pris en compte. | ||||
Auteurs :, | ||||
Pour changer le timeout d'une application web, dans le fichier web.config : | ||||
<configuration> <> <customErrors mode="Off"/> <compilation debug="true"/> <httpRuntime maxRequestLength="8096"executionTimeout="600"/> <> </configuration> | ||||
Si vous voulez modifier le timeout d'une seule page, au début de la page aspx : | ||||
<%Server.ScriptTimeout=200 %> | ||||
Pourquoi l'upload de fichiers de plus de 4Mo lève une exception ? | ||||
Auteurs :, | ||||
Dans votre fichier web.config, par défaut vous avez : | ||||
<configuration> <> <httpRuntime maxRequestLength="4096"/> <> </configuration> | ||||
Si ceci ne s'y trouve pas, la valeur 4096 est prise par défaut. Il faut changer la valeur de httpRuntime maxRequestLength suivant vos besoins. | |
lien : Comment uploader un fichier sur le serveur via une page ? | |
Comment autoriser l'affichage des exceptions dans une application web ? | |
Auteurs :, | |
La réponse se trouve dans le Web.Config au sein du tag customErrors. Ce tag a diverses propriétés dont, entre autres, le Mode. Celui-ci peut valoir - On: les erreurs personnalisées sont activées. Si la valeur de la propriété defaultRedirect n'est pas redéfinie, lesutilisateurs reçoivent une erreur générique - Off: les erreurs détaillées sont affichées - RemoteOnly: spécifie que les erreurs personnalisées ne sont affichées qu'aux utilisateurs distants. Les erreurs sont affichées sur le localhost. Il s'agit de la valeur par défaut. | |
Auteurs :, | |
Ces deux fichiers sont les seuls qui ne sont pas compilés dans une application web. On serait ainsi tentés de télécharger les fichiers pour essayer un quelconque piratage. Alors est-ce possible? La réponse est non. Ils sont automatiquement configurés pour éviter ce genre de choses. | |
lien : | |
Est-il obligatoire d'avoir un fichier Web.config pour l'application ? | |
Auteurs :, | |
Non. D'ailleurs dans 2005 il n'y est pas d'office. Dans ce cas, le fichier de config pris en compte est le machine.config. | |
Comment obliger le serveur à envoyer des pages identiques quelque soit le navigateur client? | |
Auteurs :, | |
Par défaut, lorsque le navigateur est Internet Explorer, IIS envoie des tags formattés différemment que lorsqu'il s'agit de Firefox ou tout autre navigateur. (les largeurs de composants ne sont pas toujours envoyées à un client Firefox) Pour éviter cela, il est possible de préciser dans le web.config d'envoyer des tags identiques quelque soit le navigateur. Il faut donc ajouter un fils au noeud "". | |
<browserCaps>.HtmlTextWriter</browserCaps> |
Comment rediriger les erreurs de mon application vers une page personnalisée ? | |
Auteurs :, | |
Dans le fichier web.config de votre application : | |
<configuration> <> <customErrors defaultRedirect=""mode="RemoteOnly"> <error statusCode="500"redirect=""/> <error statusCode="404"redirect=""/> </customErrors> <> </configuration> | |
Auteurs :, | |
Il existe plusieurs réponses possibles à cette question: 1° dans le code, à chaque fois que l'on crèe un objet XXXConnection 2° dans le code, dans une variable statique dans chaque page 3° dans le code, dans une variable statique et publique dans une des pages 4° dans le 5° dans le Web.Config 6° un mix des deux dernières solutions Pour le point 4, la solution est très interressante car il est possible de définir une variable statique comme ci dessous: | |
PublicSharedConnectionStringAsString="la chaine de connexion" | |
L'appel dans le code se fait alors par: | |
DimcsAsString=Global.ConnectionString | |
Cependant toute modification du fichier nécessite un redémarrage de l'application (effectué implicitement). Le point 5, avec l'utilisation des attributs <appSetting> est très interressant puisqu'il est possible de modifier la valeur à chaud, sans redémarrage de l'application. Pour lire la valeur: | |
System.Configuration.ConfigurationManager.AppSettings("clé") | |
A chaque appel, il y a un accès au fichier Web.Config. + !! probleme de string !! En utilisant les avantages de l'un et de l'autre, on arrive à la situation suivante: |
On ne lit qu'une fois le Web.Config et on garde la valeur en mémoire, à l'aide d'une variable au sein de la classe Global. |
Sommaire > Coté serveur et C# | |||||
| |||||
Auteurs :, | |||||
System.Environment.GetEnvironmentVariable("VariableName") | |||||
Auteurs :, | |||||
En supposant que l'ArrayList se nomme arrList, | |||||
If arrList==0Then Response.Write("Elle est vide") Else Response.Write("Elle n'est pas vide") End If | |||||
Auteurs :, | |||||
Rien de tel qu'un exemple concret pour voir comment formater une date pour l'affichage : | |||||
• • • • • • • • • • • • • • • | DateTime dt=newDateTime(1978,5,18);dt.Tostring(param); | ||||
Voici les différents résultats que l'on obtient suivant la valeur de param : "d" : 18/5/1978" "D" : "jeudi 15 mai 1978" "f" : "jeudi 15 mai 1978 08:05" "F" : "jeudi 15 mai 1978 08:05:01" "g" : "18/5/1978 08:05" "G" : "18/5/1978 08:05:01" "M" : "18 mai" "R" : Date GMT en anglais --> Thu, 14 may 1978 09:05:01 GMT "t" : "08:05" "T" : "08:05:01" "u" : même chose que s mais en temp GMT Et pour les formats personnalisés: d : jour 1 à 31 dd : jour 01 à 31. ddd : abr d'un jour ex: sam. pour samedi | |||||
• dddd : nom complet du jour • M : mois 1 à 12 • MM : mois 01 à 12 • MMM : abr d'un moi ax:jan. pour janvier • MMMM : nom complet du mois • y : année 1 à 99 • yy : année 01 à 99 • yyyy : année 1 à 9999 • h : heure 0 à 11 • hh : heure 00 à 11 • H : heure 0 à 23 • HH : heure 00 à 23 • m : minutte 0 à 59 • mm : minutte 00 à 59 • s : seconde 0 à 59 • ss : seconde 00 à 59 | |
dt.Tostring("dddd, le dd MM yyyy") | |
Donnera : Jeudi, le 18 05 1978 | |
lien : Comment n'afficher que l'heure d'un champ type DateTime dans un DataGrid ? |
Sommaire > Coté serveur et C# > Manipulations des fichiers | |||||
| |||||
Auteurs :, | |||||
Pour lister les fichiers d'un répertoire ou pour accéder à une base de données Access, il nous est parfois nécessaire de savoir l'adresse exacte du répertoire physique dans lequel se trouve l'application. Cela est possible à l'aide de: | |||||
DimPhysicalPathAsString=Server.MapPath("") | |||||
Cet exemple initialisera PhysicalPath avec l'adresse physique du fichier . | |||||
Comment afficher tous les fichier d'un répertoire du serveur ? | |||||
Auteurs :, | |||||
Nous allons afficher tous les fichiers d'un répertoire dans une ListBox : | |||||
DimdirAsNewDirectoryInfo("C:\MonChemin") MalLsttBox.DataSource=dir.GetFiles("*.*") MalLsttBox.DataBind() | |||||
Note : attention à bien paramètrer vos droits de manière à ce que le user ASPNET puisse parcourir le répertoire ;) | |||||
Auteurs :, | |||||
ImportsSystem Imports PublicSharedSubFileTests() Try 'Création d un fichier videDimfsAsFileStream=File.Create("") fs.Close Console.WriteLine("fichier créé") 'Copie de fichier ("","") Console.WriteLine("fichier copié vers ") 'Déplacement de fichier ("","c:\") Console.WriteLine("fichier déplacé vers c:\") 'Suppression de fichier File.Delete("c:\") Console.WriteLine("Fichier c:\ supprimé") | |||||
Auteurs :, | |
Nous allons ouvrir un fichier texte et le remplir s'il n'existe pas encore. Nous afficherons ensuite son contenu à l'écran. On utilisera pour cela les classes .StreamReader pour la lecture et .StreamWriter pour l'écriture | |
ImportsSystem Imports SubFichierTexte(ByValnomFichierAsString) DimsrAsStreamReader=Nothing DimswAsStreamWriter=Nothing DimlineAsString Try IfNotFile.Exists(nomFichier)Then' Le fichier n'existe pas. On le crée. sw=NewStreamWriter(nomFichier) sw.WriteLine("Bonjour. Nous sommes le {0} et il est {1} ", .ToLongDateString, .ToLongTimeString) sw.Close sw=Nothing' Remarque : On peut utiliser sw = File.AppendText(NomFichier) pour ajouter ' du texte à un fichier existant EndIf' Ouverture du fichier et écriture du contenu du fichier sur la console sr=NewStreamReader(nomFichier) Console.WriteLine("Début du fichier") line=sr.ReadLine WhileNot(lineIsNothing) Console.WriteLine(line) line=sr.ReadLine EndWhile Console.WriteLine("Fin du fichier") Finally ' Fermeture streamreaderIfNot(srIsNothing)Then sr.CloseEndIf ' Fermeture streamwriterIfNot(swIsNothing)Then sw.CloseEndIf EndTry EndSub | |
lien : |
lien : | |
Comment obtenir la liste des fichiers et des sous-répertoires d'un répertoire ? | |
Auteurs :, | |
On utilise la fonction GetFileSystemEntries de la classe .Directory | |
Imports ImportsSystem SharedSubDir(ByValdirectoryAsString) DimfilesAsString() DimiAsInteger=0 Whilei<filecount Response.Write(files[i]) (System.Threading.Interlocked.Increment(i),i-1) EndWhile EndSub | |
Pour avoir juste les noms des fichiers et pas les sous-répertoires d'un répertoire, on utilise | |
.Directory.GetFiles() | |
lien : | |
| |
Il nous est souvent nécessaire de lister les répertoires présents dans le répertoire d'une application . Pour cela, il suffit de boucler sur la liste des DirectoryInfo renvoyés par l'intermédiaire de la méthode GetDirectories de cette même classe DirectoryInfo. Attention que la base de l'application doit être récupérée par l'intermédiaire de | |
Server.MapPath(".") | |
ce qui donne | |
DimdiAs.DirectoryInfo=New.DirectoryInfo(Server.MapPath(".")) ForEachdi2As.DirectoryInfoIndi.GetDirectories Response.Write(di2.FullName) ' Traitement quelconque Next |
Bien entendu vous pouvez (voire devez) gérer les exceptions du type "Répertoire inexistant" ou encore "Accès interdit". | |
lien : Comment lister les fichiers d'un répertoire? | |
Auteurs :, | |
Comme pour le listage des répertoires, une simple boucle suffit. DirectoryInfo fournit une méthode GetFiles qui se chargent de renvoyer la liste des fichiers du répertoires. Il ne reste plus dès lors qu'à effectuer un traitement sur chacun des fichiers de cette liste. | |
DimdiAs.DirectoryInfo=New.DirectoryInfo(Server.MapPath(".")) ForEachfiAs.FileInfoIndi.GetFiles Response.Write(fi.FullName) Next | |
Bien entendu vous pouvez (voire devez) gérer les exceptions du type "Répertoire inexistant" ou encore "Accès interdit". | |
lien : Comment lister les répertoires d'une application? | |
Comment connaître la taille totale du contenu d'un répertoire? | |
Auteurs :, | |
PublicFunctionDirectoryLength(ByValrelativePathAsString)AsInteger DimbytesAsInteger=0 DimdiAs.DirectoryInfo=New.DirectoryInfo(Server.MapPath(relativePath))ForEachfiAs.FileInfoIndi.GetFiles bytes+=fi.Length Next Return bytes EndFunction | |
Bien entendu vous pouvez (voire devez) gérer les exceptions du type "Répertoire inexistant" ou encore "Accès interdit". | |
Auteurs :, | |
Certes XML et les bases de données prennent de plus en plus de place dans le monde de l'informatique mais les fichiers dits "classiques" sont toujours bel et bien présents. Voici comme lire un fichier et, ce, ligne par ligne. Tout d'abord il faut utiliser le namespace . | |
Imports |
Pour lire tout le fichier, il suffit de boucler sur toutes les lignes du fichier. | |
PublicSubReadByLine(ByValpathAsString) DimsrAsStreamReader Try sr=NewStreamReader(path) DimcontenuAsString WhileNot((contenu=sr.ReadLine)IsNothing) ' Utiliser ce contenu' Par exemple ajout d'une ListBox, EndWhile Catch generatedExceptionVariable0AsException ' Gestion de l'exception (FileNotFound, ' (redirection, ) Finally sr.Close EndTry EndSub | |
Auteurs :, | |
Les content-types se trouvent dans la base de registres. Il "suffit" de parcourir les associations extension / content-type pour retrouver celle qui correspond à l'extension de notre fichier. Voici une fonction permettant d'effectuer cette recherche. | |
PublicSharedFunctionGetMIMEType(ByValfilepathAsString)AsString DimregPermAsRegistryPermission=New RegistryPermission(,"\HKEY_CLASSES_ROOT") DimclassesRootAsRegistryKey=Registry.ClassesRoot DimfiAsFileInfo=NewFileInfo(filepath) DimdotExtAsString=fi.Extension.ToLower DimtypeKeyAsRegistryKey=classesRoot.OpenSubKey("MIME\Database\Content Type") DimKeynameAsString="" ForEachkeynameAsStringIntypeKey.GetSubKeyNames DimcurKeyAsRegistryKey=classesRoot.OpenSubKey("MIME\Database\Content Type\"+keyname) Keyname=keyname EndIf Next Return Keyname EndFunction | |
Sans oublier d'importer les namespaces suivants: | |
ImportsImportsSystem.Security.Permissions ImportsMicrosoft.Win32 |
Auteurs :, | |
Il suffit d'utiliser | |
DimBytesSizeAsInteger=FileInfo("").Length | |
Comment permettre d'utiliser des fichiers de manière relative ? | |
Auteurs :, | |
Lorsque vous ouvrez un fichier texte, par exemple, il vous faut savoir l'adresse physique de ce fichier. Malheureusement, nous ne connaissons que le chemin relatif bien souvent. Server.MapPath est là pour nous aider. En lui passant le chemin relatif, Server.MapPath renverra le chemin physique complet. Cela donne, dans l'exemple de l'ouverture d'un flux sur le fichier texte : | |
(Server.MapPath("")) | |
Sommaire > Coté serveur et C# > Manipulations des processus | ||
| ||
Auteurs :, | ||
Il faut utiliser la classe : | ||
System.Diagnostics.Process | ||
Voici un petit exemple simple pour demarrer un .exe sur le serveur : | ||
DimProcessusAsNewSystem.Diagnostics.Process Processus.StartInfo.FileName="" Process.StartInfo.Arguments="Monargument" Processus.Start()'retourne un booléen confirmant le démarage du process | ||
On arretera le process avec : | ||
Processus.Close() | ||
Pour plus d'informations sur la classe System.Diagnostics.Process référez vous à msdn. | ||
lien : |
Sommaire > Coté serveur et C# > Manipulations des nombres | |||||
| |||||
Auteurs :, | |||||
C'est très simple et pourtant le nombre de questions sur le sujet est énorme. .NET a, comme la plupart des langages, une fonction permattant de générer un nombre aléatoire. Celle-ci génère un nombre entre "min" et "max". | |||||
DimminAsInteger=0 DimmaxAsInteger=20 Rnd.Next(min, max) | |||||
Auteurs :, | |||||
Nous connaissons certainement pour la plupart la fonction Math.Round manipulant des types Double et Decimal. Mais il existe egalement deux autres fonctions de la classe Math permettant d'arrondir un nombre en un entier Vous pouvez ainsi déterminer dynamiquement la limite supérieure et inférieure entière d'un nombre. Exemple Supposons que vous possedez une Liste de nombres: MaListe | |||||
DimmonNombreAsDouble DimmaxAsDouble DimminAsDouble DimtexteAsString=String.EmptyForeachmonNombreinMaListe min=Math.Floor(monNombre) max=Math.Ceiling(monNombre) texte&=monNombre.ToString&" est compris entre "&min.ToString&" et "&max.ToString texte&=System.Environment.NewLineNext=texte | |||||
lien : lien : lien : | |||||
Auteurs :, | |||||
Lorsque l'on a un double, il est possible de formater la valeur retournée en spécifiant une chaîne de formatage comme paramètre du .ToString. Voici quelques exemples. Cette liste n'est pas exhaustive. | |||||
Dim dbl As Double=1.1Dim str As[String]=dbl.ToString("000.00")' str = 001.10str=dbl.ToString("#,##0.00")' str = 1.10dbl=4567str=dbl.ToString("#,##0.00")' str = 4 563,00 | |||||
Sommaire > Coté serveur et C# > Manipulations des chaînes de caractères | |||||
| |||||
Auteurs :, | |||||
Rien de plus simple, .NET a amené ce qu'il manquait à ses prédécesseurs: | |||||
DimmotsAsString()=chaineCaracteres.Split | |||||
Il y aura autant de cellules au "vecteur" que de mots présents dans la phrase. | |||||
Comment convertir une chaîne de caractères au format XML et inversément? | |||||
Auteurs :, | |||||
Pour encoder: | |||||
DimXMLVersionasString=HttpUtility.HtmlEncode(">< &") | |||||
Pour décoder la chaîne: | |||||
DimStringVersionasString=HttpUtility.HtmlEncode(XMLVersion) | |||||
| |||||
Auteurs :, | |||||
Il est fréquent d'encoder une date sous forme d'une chaîne de caractères. La plupart du temps, le développeur d'applications souhaitera manipuler un objet DateTime, c'est pourquoi la conversion (casting) est importante. | |||||
DimmaDateChaineAsString="03/06/2005 17:06:00"DimmaDateAsDateTime=DateTime.Parse(maDateChaine) | |||||
Auteurs :, | |||||
Bien que ceci soit très simple, la question revient fréquemment | |||||
DimdiffAsTimeSpan=date1-date2 | |||||
Le TimeSpan permet de récupérer des durées au format heures, minutes, secondes. On utilisera ceci, entre autres, pour connaître la durée d'un travail, la durée d'exécution d'une requête et bien d'autres choses. | |||||
lien : Comment savoir le temps nécessaire à l'exécution d'une requête? | |||||
Comment retrouver la date correspondante au jour d'une semaine donnée? | |||||
Auteurs :, | |||||
Une solution pour récupérer une date à partir d'indications telles que - le jour de la semaine - le numéro de la semaine - l'année par exemple: "Quelle est la date du mercredi de la semaine 45 de l'année 2005?" Imaginons pour cela un formulaire simple avec : 1. 1 NumericUpDown "jourValue" pour les jours de la semaine (1-7) 2. 1 NumericUpDown "semaineValue" pour les semaines de l'année (1-52) 3. 1 TextBox "AnneeValue" pour l'année 4. 1 Label "resultat" 5. 1 bouton "Valider" | |||||
ImportsSystem'PrivateConstlibelleAsString="Vous avez recherché : Le ";'PrivateSubValider_Click(ByValsenderAsObject,ByValeAsEventArgs) Handles Valider.Click DimlanneeAsInteger WithMe 'Verifier si la saisie est bien numérique 'Recuperer l'année saisie With.anneeValue | |||||
IfIsNumeric(.Text)Thenlannee=CType(.Text, Integer) Else:ExitSub EndIf EndWith 'Imposer une date référencée au 01/01/ de l'année DimdateRefAsNewDateTime(lannee, 1, 1) 'Recuperer le choix de la semaine DimweekAsDouble=CType(.Value, Double) 'Ajuster le nombre de jours/semaine à la date référencéeIfweek>1ThendateRef=dateRef.AddDays((week-1)*7) EndWith With.jourValue 'Recuperer le choix du jour DimdayAsDouble=CType(.Value, Double) 'Recuperer le jour de la semaine de la date référencée DimjAsInteger=CType((dateRef.DayOfWeek), Integer) 'Ajuster en fonction de la difference des deux SelectCasej CaseIs>day: dateRef=dateRef.AddDays(-(j-day)) CaseIs<day: dateRef=dateRef.AddDays(day-j) EndSelect EndWith 'Afficher le resultat With.resultat .Text=String.Empty .Text&=libelle .Text&=dateRef.ToLongDateString EndWith EndWith EndSub | |
Sommaire > Coté serveur et C# > Conversions | |||||
| |||||
Auteurs :, | |||||
Voici une fonction permettant de convertir une valeur en base 10 vers une base n. | |||||
PrivateSharedincrementAsInteger=64 PublicSharedFunctionToBaseN(ByValnombreAsInteger,ByVal_baseAsInteger)AsString DimresteAsInteger DimchaineAsString=String.Empty Whilenombre>=_base reste=nombreMod_base nombre=(nombre-reste)/_base Ifreste>9Then chaine=CType((reste-9+increment), Char).ToString+chaine Else chaine=reste.ToString+chaine EndIf EndWhileIfnombre>9Then chaine=CType((nombre-9+increment), Char).ToString+chaine Else chaine=nombre.ToString+chaine EndIf Return chaine.ToUpper EndFunction | |||||
Conseil: limitez la conversion à la base 36 afin de ne devoir utiliser que les caractères alphanumériques. | |||||
Comment convertir une chaîne hexadécimale en un tableau de bytes ? | |||||
Auteurs :, Voici deux petites fonctions static verifiant pour nous si la longueur d'une chaine de caractères hexadecimaux est paire ou impaire, puis transformant la chaine hexadecimale en paires de caractères hexadecimaux: | |||||
PublicSharedFunctionIsEven(ByValhexStringAsString)AsBoolean If(hexString.LengthMod2=0)ThenReturnTrueElseReturnFalse EndFunction PublicSharedFunctionToEvenByteStrings(ByValhexStringAsString)AsString() IfNotIsEven(hexString)ThenhexString="0"&hexString DimcurrentCharAsInteger=0 DimindexAsInteger=0 DimmaxAsInteger=hexString.Length DimbyteStrings()AsString=NewString(Convert.ToInt32(max/2)-1) {} While(currentChar<max) byteStrings(index)=hexString.Substring(currentChar, 2) index+=1 currentChar+=2 EndWhile | |||||
Return byteStrings EndFunction | |
2. la fonction Uri.FromHex retourne la valeur décimale d'un caractère hexadécimal. Utilisons-la donc pour nous retourner un byte pour une chaine de 2 caractères hexadecimaux: | |
PublicSharedFunctionToByteFromHex(ByValbyteStringAsString)AsByte Dimbyte1AsByte=Convert.ToByte(Uri.FromHex(byteString.Chars(0))) Dimbyte2AsByte=Convert.ToByte(Uri.FromHex(byteString.Chars(1))) Return Convert.ToByte((byte1*16)+byte2) EndFunction | |
3. Il nous reste à present à implementer la fonction qui nous retournera un tableau de byte quelquesoit la longueur de la chaine hexadecimale | |
PublicSharedFunctionBytesFromHex(ByValhexStringAsString)AsByte() Dimbytes()AsByte=Nothing DimmaxAsInteger=hexString.Length If(max>0)Then If(max=1)Then: bytes=NewByte() {ToByteFromHex("0"&hexString)} Else DimindexAsInteger=0 DimbyteStrings()AsString=ToEvenByteStrings(hexString) DimbyteStringAsString bytes=NewByte(byteStrings.Length-1) {} ForEachbyteStringInbyteStrings bytes(index)=ToByteFromHex(byteString) index+=1 Next EndIf EndIf Return bytes EndFunction | |
lien : | |
Comment convertir un object en un objet de type approprié et dérivant de Control? | |
Auteurs :, | |
La solution est de créer une instance du type désiré. Pour savoir le type réel de l'objet, la méthode GetType() est de grande utilité. Ensuite, on charge l'Assembly "Forms" pour enfin modifier le Type de l'instance. | |
PublicSharedFunctionObjectToControl(ByValobjAsObject)AsControl DimtypeNameAsString=obj.GetType.ToString DimaAsAssembly=Assembly.GetAssembly(GetType(Form)) DimtAsType=a.GetType(typeName) DimcAsControl=CType(Activator.CreateInstance(t), Control) c=CType(Convert.ChangeType(obj, t), Control) |
Return c EndFunction | |
Auteurs :, | |
Voici quelques fonctions static qui vous permettront de convertir tout numerique entier en son equivalent chaine de caractères hexadécimaux, simplement en utilisant une surcharge de ToString() et le format X. Transformation effective pour les types byte, UInt16, UInt32, UInt64 | |
PublicSharedFunctionToHexString(ByVal[byte]AsByte)AsString Return [byte].ToString("X2",Nothing) EndFunction PublicSharedFunctionToHexString(ByVal[uint16]AsUInt16)AsString Return [uint16].ToString("X4",Nothing) EndFunction PublicSharedFunctionToHexString(ByVal[uint32]AsUInt32)AsString Return [uint32].ToString("X8",Nothing) EndFunction PublicSharedFunctionToHexString(ByVal[uint64]AsUInt64)AsString Return [uint64].ToString("X16",Nothing) EndFunction | |
Il ne vous reste qu'à prevoir la conversion pour les types restant SByte, short, int, long : | |
PublicSharedFunctionToHexString(ByVal[sbyte]AsSByte)AsString Return ToHexString(Convert.ToByte([sbyte])) EndFunction PublicSharedFunctionToHexString(ByVal[int16]AsShort)AsString Return ToHexString(Convert.ToUInt16([int16])) EndFunction PublicSharedFunctionToHexString(ByVal[int32]AsInteger)AsString Return ToHexString(Convert.ToUInt32([int32])) Return ToHexString(Convert.ToUInt64([int64])) EndFunction | |
lien : |
Sommaire > Coté serveur et C# > WMI | ||||
| ||||
Auteurs :, | ||||
Le code ci-joint permet d'effectuer une requête WMI en spécifiant la plupart des propriétés possibles, c'est à dire l'ordinateur sur lequel la requête doit s'effectuer ainsi que l'utilisateur à utiliser. | ||||
DimconnexionOptionAsConnectionOptions=NewConnectionOptions DimmonManagementObjectAsManagementObject DimmonManagementScopeAsSystem.Management.ManagementScope DimobjetRequeteAsSystem.Management.ObjectQuery DimcollectionResultatAsManagementObjectCollectionDimmaRequeteAsManagementObjectSearcher connexionOption.Username="mon_login"connexionOption.Password="mon_password"DimmarqueBiosAsStringTry monManagementScope=NewSystem.Management.ManagementScope("\\"+machineCible+"\root\cimv2", connexionOption) objetRequete=NewSystem.Management.ObjectQuery("SELECT * FROM Win32_BIOS") maRequete=NewManagementObjectSearcher(monManagementScope, objetRequete) collectionResultat=ForEachmonManagementObjectAsIntegerIncollectionResultat marqueBios=monManagementObject("Manufacturer") Next Response.Write(marqueBios) Catch exAsException Response.Write(ex.Message) EndTry | ||||
Ou plus simplement, si vous ne devez pas effectuer la requête sur un ordinateur distant et si vous avez les droits administrateur sur la machine locale | ||||
DimInfo_biosAsSelectQuery=NewSelectQuery("Win32_bios") DimBios_InformationAsManagementObjectSearcher=NewManagementObjectSearcher(Info_bios) DimInfoAsManagementObject ForEachInfoAsIntegerInResponse.Write("Bios version: "+info("version").ToString) Next | ||||
Auteurs :, | ||||
WMI est utilisé pour accomplir différentes tâches d'administration système au travers de scripts ou requêtes WQL. L'outil WMICodeCreator permet de générer le code source pour • l'exécution de méthode d'une classe WMI • la réception d'événements synchrone ou asynchrone issue d'un provider WMI. Cet outil permet également de récupérer les détails d'une classe WMI: la liste des propriétés, méthodes et qualificateurs et pour certaines une description succinte de la classe. | ||||
Le code source généré peut l'être pour les langages C#, VB .NET ou encore VBScript. Sous .NET reportez-vous aux espaces de noms System.Management et System.Management.Instrumentation. |
Sommaire > Coté serveur et C# > Transferts FTP | |||||
| |||||
Auteurs :,, | |||||
On pourra utiliser la méthode suivante : | |||||
Public Shared Function FtpDownload(ByVal uri As Uri,ByVal credentials As NetworkCredential,ByVal dirInfo As DirectoryInfo) As FileInfo Dim fi As FileInfo Dim request As FtpWebRequest=DirectCast(WebRequest.Create(uri),FtpWebRequest) request.Credentials=credentials request.UseBinary=True request.Method=WebRequestMethods.Ftp.DownloadFile'Utilisé pour envoyer la commande "QUIT" au serveur afin de fermer correctement la connexion request.KeepAlive=False ' Taille du tableau servant à stocker les morceaux du fichier. ' On épargne ainsi les ressources du serveur en ne chargeant pas la totalité du fichier. ' Cela permet de transférer rapidement des fichiers volumineux. Dim buffer As Byte()=New Byte(2047){}' Variable de mesure de la taille du morceau de fichier lu. Permet d'indiquer que le fichier a été lu et écrit en totalité.' Recupération de la réponse Using res As FtpWebResponse=DirectCast(request.GetResponse(),FtpWebResponse) fi=New FileInfo(String.Concat(dirInfo.FullName,uri.Segments(uri.Segments.Length-1))) Using stream As New BinaryReader(res.GetResponseStream()) Using fs As FileStream=File.Create(fi.FullName,buffer.Length,FileOptions.WriteThrough) Dim block As Integer While ((block=stream.Read(buffer,0,buffer.Length))>0) fs.Write(buffer,0,block) End While End Using End Using End Using Return fi End Function Public Shared Sub TestFtpDownload() ' exemple d'utilisation FtpDownload(New Uri(" "),_ New NetworkCredential("freebox","000000"),_ New DirectoryInfo("C:\temp\")) End Sub | |||||
Auteurs :,, | |||||
On pourra utiliser la méthode suivante : | |||||
Public Shared Function FtpUpload(ByVal uri As Uri,ByVal credentials As NetworkCredential,ByVal fileInfo As FileInfo) As Boolean Dim request As FtpWebRequest=DirectCast(FtpWebRequest.Create(Path.Combine(uri.AbsoluteUri, fileInfo.Name)),FtpWebRequest) request.Method=WebRequestMethods.Ftp.UploadFile request.Credentials=credentials request.UseBinary=True request.KeepAlive=False request.UsePassive=True | |||||
Dim buffer As Byte()=New Byte(2047){} Using stream As Stream=request.GetRequestStream() Using fs As FileStream=File.OpenRead(fileInfo.FullName) Dim block As Integer While ((block=fs.Read(buffer,0,buffer.Length))>0) stream.Write(buffer,0,block) End While End Using End Using Return (True) End Function Public Shared Sub TestFtpUpload() ' exemple d'utilisation FtpUpload(New Uri(" dur/Enregistrements/"),_ New NetworkCredential("freebox","000000"),_ New FileInfo("C:\temp\")) End Sub | |
Sommaire > Coté serveur et C# > Divers | |||||
| |||||
Auteurs :, | |||||
Simple à faire mais peu de personnes le trouvent du premier coup | |||||
DimverAsVersion=Environment.Version Console.WriteLine("Version Framework = {0}", ver) | |||||
Comment connaître le compte utilisateur utilisé par votre application web ? | |||||
Auteurs :, | |||||
Response.Write("Compte : "&Environment.Username) | |||||
Auteurs :, | |||||
Très simple d'utilisation, parfois plus compliqué à trouver :) | |||||
Response.Write("Utilisé: "&System.Environment.WorkingSet.ToString()&" bytes") | |||||
Auteurs :, | |||||
Response.Write("Plateforme "&System.Environment.OSVersion.ToString() ) | |||||
Comment connaître le nom de l'utilisateur Windows utilisé pour se connecter ? | |||||
Auteurs :, | |||||
Même si cela est simple à écrire, il faut cependant savoir vers quoi s'orienter | |||||
Response.Write("Utilisateur: "+User.Identity.Name) | |||||
Est-il toujours nécessaire de verrouiller les variables d'application avant d'y accéder? | |
Auteurs :, | |
Lorsque nous effectuons un traitement, il est conseillé d'utiliser les locks. Ceux-ci permettent de verrouiller des parties de code. Il n'est ainsi pas possible d'exécuter simultanément deux parties de code se trouvant dans un bloc verrouillé. | |
SubNomMethode() SyncLock Me ' Code à verrouiller EndSyncLock EndSub | |
lien : | |
Comment mesurer précisément le temps d'exécution d'une partie de votre code ? | |
Auteurs :, | |
Tout d'abord, ajoutez en entête de votre classe: | |
Imports System.Diagnostics | |
Ensuite, ajoutez ceci dans la partie de code qui vous intéresse: | |
' Instanciation d'un objet StopWatch Dim monStopWatch As StopWatch=New Stopwatch() ' Déclenchement du "chronomètre"monStopWatch.Start() ' /////////////////////////////// ' Placez ici le code que vous voulez évaluer, cela peut être par exemple du code 'brut' ou ' alors l'appel d'un méthode ' /////////////////////////////// ' Arrêt du "chronomètre"monStopWatch.[Stop]() ' Le temps écoulé peut être récupéré très facilement avec un membre de StopWatch, ' de la façon suivante. Le résultat est exprimé en millisecondes Dim tempsExecution As Long=monStopWatch.ElapsedMilliseconds | |
Auteurs :, | |
Tout d'abord, ajoutez en entête de votre classe: | |
Imports System.Text.RegularExpressions | |
Un exemple vaut mieux qu'un long discours: | |
Dim monTexte As String="Une astuce de ! Une astuce de !" ' Paramétrage de notre expression régulière : ' Ici on spécifie que l'on ne veut pas tenir compte dela casse du' texte dans nos remplacements. Dim maRegEx As New Regex(vbBack&""&vbBack,RegexOptions.IgnoreCase) ' Remplacement des occurences de "" par ""monTexte=maRegEx.Replace(monTexte,"") | |
Comment diviser une classe dans plusieurs fichiers avec .NET 2.0? | |
Auteurs :, | |
Jusqu'à aujourd'hui une classe devait se trouvait dans un fichier unique, cela posait problème par exemple en cas de codes longs et complexes, ou encore en cas de travail en équipe sur une même classe. Avec l'arrivé du Framework .Net 2.0, il est désormais possible de répartir une classe dans plusieurs fichiers, c'est ce que l'on appelle les classes partielles. Répartir une classe dans plusieurs fichiers ne présente pas de difficulté, il suffit simplement d'ajouter le mot clé « partial » au début de chaque fichier, le compilateur fera le travail pour réassembler tous ces fichiers, voici un exemple : | |
PublicPartialClassmaClasse EndClass | |
Auteurs :, | |
Ce qui suit est extrait d'un échange sur le forum dotnet. C'est très shématique mais cela résume bien comment le .NET Framework s'y prend pour gérer la mémoire Le .NET Framework : Salut OS, j'ai des trucs à lancer, j'peux te prendre de la ram ? L'OS : Hé Salut ! Je t'en pris, sers-toi ! Le .NET Framework : Sympa mec. J't'en prend 50Mo maintenant, j'ai besoin que de 15 Mo, mais comme ça je te dérange pas si j'ai besoin de plus. Le .NET Framework : Hé l'OS, t'es short niveau mémoire ? |
L'OS : Non non, tout va bien. Le .NET Framework : Bon, alors je garde mes 50 Mo encore un peu. L'OS : Oki. L'OS : Ben sers-toi donc. SQL Server : Ouais mais y a plus que 180Mo ! L'OS : Ah OK, attend 2 millisecondes stp L'OS : Hé Framework, tu peux me rendre un peu de RAM ? Le .NET Framework : No problemo, j'te fais ça tout de suite Le .NET Framework : Garbage Collector, soit un amour et va rendre de la mémoire à l'OS. Garbage Collector : J'y cours patron. C'est clair non ? | |
Comment forcer la libération de la mémoire par le Garbage Collector ? | |
Auteurs :, | |
Pour forcer le Garbage Collector à libérer la mémoire inutilisée par le .NET Framework, on peut appeller la méthode Collect de la classe GC. | |
.Collect() | |
Par contre, pour des raisons qui justifieraient à elles seules un article, il n'est pas conseillé d'appeller GC.Collect() directement. Par conséquent, ne le faites pas à moins d'être un expert du garbage collector. | |
Comment visualiser le GAC avec la structure de fichier classique ? | |
Auteurs :, | |
Il est possible de visualiser le cache global des assemblages (GAC) comme un répertoire classique. Le GAC est enregistré en tant que répertoire spécial et c'est la Dll ShFusion qui prend en charge sa présentation sous l'exploration de fichiers. En modifiant la clé de registre HKEY_LOCAL_MACHINE\Software\Microsoft\Fusion vous pouvez intervenir sur son mode de visualisation au sein de l'explorateur. Pour ce faire, modifier la clé nommée DisableCacheViewer en lui attribuant une valeur différente de zéro. | |
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion] "DisableCacheViewer"=dword:00000001 |
Cette clé est gérée dynamiquement, il n'est pas nécessaire de relancer les explorateurs de fichiers actifs.
Malgré que je les ai enregistré, certains de mes composants COM+ VB6 ne fonctionnent pas. Que faire? | |
Auteurs :, | |
Ajoutez | |
<%@ page aspcompat=true %> | |
|
Sommaire > Programmation coté client |
Sommaire > Programmation coté client > Javascript | ||
| ||
Auteurs :,, | ||
La propriété Browser de l'objet Request est de type HttpBrowserCapabilities Cette classe fournit diverses informations concernant le navigateur du client. | ||
IfRequest.Browser.EcmaScriptVersion.Major>=1Then Response.Write("Java Script Supporté") Else Response.Write("Java Script Non Supporté") EndIf | ||
Sommaire > Programmation coté client > Javascript > Communication Javascript et Code Behind | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Auteurs :,, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Il peut être utile d'ajouter du javascript à la page, depuis le code behind. On utilise pour ca des méthodes de. Par exemple, l'utilisation depermet d'ajouter un bloc de script en haut de la page rendue. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
IfuserNotLogguedThen Page.ClientScript.RegisterClientScriptBlock(GetType(),"alert not loggued", "alert('Veuillez vous identifier pour accéder à cette page');",true) EndIf | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Le code généré par le navigateur sera : | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<script type="text/javascript">alert('Veuillez vous identifier pour accéder à cette page'); </script> | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment accéder à un contrôle se trouvant dans un UserControl en javascript ? | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Auteurs :, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Pour pouvoir accéder à un contrôle depuis le javascript, il suffira de combiner l'utilisation de document.getElementById et la valeur de l'identifiant client du contrôle. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function checkInput(){ alert(document.getElementById('<%=txtBox.ClientID %>').Value); } | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment ajouter des attributs javascript à un composant ? | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Auteurs :, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tout est dans le titre# Ajoutez un attribut à ce composant. On retrouve donc la syntaxe suivante : | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
("onclick","alert('on a cliqué sur le composant')")
"alert('{0}')"
"(?)",
En effet, seules les propriétés marquées comme étant des urls bénéficient du mécanisme lié à l'utilisation de l'opérateur (~). Et là, pour resoudre le problème, il faut passer par une abstraction supplémentaire, mais c'est une autre histoire
A noter que si vous souhaitez utiliser Server.Transfer pour supprimer l'exception due au Response.Redirect, ce n'est à nouveau pas la bonne solution. Préférez la méthode Execute(path, null, preserveForm) en ayant au préalable effectué un Response.Clear().
)
)
)
)
SelectMethod= /> N'oubliez pas d'appeler les méthodes DataBind correspondantes ou celle de la Page.
Devient vite indispensable quand on veut faire une page web avec un code "propre".
Ceci aura pour effet de remplacer le contenu de la page par défaut pour tous les nouveaux projets.
|