IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ ASP.NET/VB.NET

logo
Sommaire > Coté serveur > Divers
        Comment lancer un exe sur le serveur via une page aspx ?
        Comment afficher un retour à la ligne à partir d'un texte encodé dans un TextBox multiligne?
        Comment obtenir la version du .NET Framework en cours?
        Est-il toujours nécessaire de verrouiller les variables d'application avant d'y accéder?
        Comment générer un nombre aléatoire?
        Comment créer un objet DateTime à partir d'une chaîne de caractères?
        Comment ajouter un retour à la ligne à partir du code-behind?
        Comment connaître la durée séparant deux dates?
        Comment convertir un nombre de base 10 vers une base n?
        Comment diminuer le risque d'erreur de nommage des variables de session?
        Mon serveur redémarre tout seul, pourquoi?
        Comment convertir une chaîne hexadécimale en un tableau de bytes?
        Comment convertir un object en un objet de type approprié et dérivant de Control?
        Comment convertir un nombre en chaine Hexadecimale?
        Comment créer et consommer des évènements?
        Comment lire un fichier *.wav avec Visual Basic 2005 et le namespace my?
        Comment retrouver la date correspondante au jour d'une semaine donnée?
        Comment arrondir un nombre à l'entier inferieur ou superieur?



Comment lancer un exe sur le serveur via une page aspx ?
auteur : David Pedehourcq
Il faut utiliser la classe :
System.Diagnostics.Process
Voici un petit exemple simple pour demarrer un .exe sur le serveur :

					Dim Processus As New System.Diagnostics.Process
					Processus.StartInfo.FileName = "MonApplis.exe"
					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 : en Process Class (liens MDSN)

Comment afficher un retour à la ligne à partir d'un texte encodé dans un TextBox multiligne?
auteur : Didier Danse
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("" & Microsoft.VisualBasic.Chr(13) & "", "<br/>")
				

Comment obtenir la version du .NET Framework en cours?
auteur : abelman
Simple à faire mais peu de personnes le trouvent du premier coup...

					Dim ver As Version = Environment.Version
					Console.WriteLine("Version Framework = {0}", ver)
				

Est-il toujours nécessaire de verrouiller les variables d'application avant d'y accéder?
auteur : Didier Danse
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é.

					Sub NomMethode()
					SyncLock Me
					' Code à verrouiller
					End SyncLock
					End Sub

				
lien : fr Utilisation du Global.asax

Comment générer un nombre aléatoire?
auteur : Didier Danse
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".

					Dim min As Integer = 0
					Dim max As Integer = 20
					Rnd.Next(min, max)
				

Comment créer un objet DateTime à partir d'une chaîne de caractères?
auteur : Didier Danse
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.

					Dim maDateChaine As String = "03/06/2005 17:06:00"
					Dim maDate As DateTime = DateTime.Parse(maDateChaine)
				

Comment ajouter un retour à la ligne à partir du code-behind?
auteur : Didier Danse
Il suffit d'utiliser l'élément container (par exemple le body) et de lui ajouter un LiteralControl.

					container.Controls.Add(New LiteralControl("<br/>"))
				

Comment connaître la durée séparant deux dates?
auteur : Didier Danse
Bien que ceci soit très simple, la question revient fréquemment...

					Dim diff As TimeSpan = 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 : faq Comment savoir le temps nécessaire à l'exécution d'une requête?

Comment convertir un nombre de base 10 vers une base n?
auteur : neguib
Voici une fonction permettant de convertir une valeur en base 10 vers une base n.

					Private Shared increment As Integer = 64

					Public Shared Function ToBaseN(ByVal nombre As Integer, ByVal _base As Integer) As String
					Dim reste As Integer
					Dim chaine As String = String.Empty
					While nombre >= _base
					reste = nombre Mod _base
					nombre = (nombre - reste) / _base
					If reste > 9 Then
					chaine = CType((reste - 9 + increment), Char).ToString + chaine
					Else
					chaine = reste.ToString + chaine
					End If
					End While
					If nombre > 9 Then
					chaine = CType((nombre - 9 + increment), Char).ToString + chaine
					Else
					chaine = nombre.ToString + chaine
					End If
					Return chaine.ToUpper
					End Function
				
Conseil: limitez la conversion à la base 36 afin de ne devoir utiliser que les caractères alphanumériques.


Comment diminuer le risque d'erreur de nommage des variables de session?
auteur : Didier Danse
Attention, ceci est une astuce. Il se peut qu'il y ait d'autres solutions.

Souvent, dans les applications asp.NET, on stocke les informations relatives à un client dans des variables de Session. Ainsi pour vérifier qu'un utilisateur est bien connecté, on a recours à un test du type "if (Session["UserName"] != Nothing) { ... }".
Cependant, suite à une faute de frappe, on pourrait avoir "if (Session["UserNamme"] != Nothing) { ... }" par exemple.

Pour limiter le nombre d'erreurs possibles, il suffit de faire une classe qui "gère" les accès aux différentes variables de session.


					Public Class SessionTransfert

					Public Class Exemple1

					Public Shared Property Teacher_Name() As String
					Get
					If Not (HttpContext.Current.Session("Teacher_Name") Is Nothing) Then
					Return HttpContext.Current.Session("Teacher_Name").ToString
					Else
					Throw New SessionUndefinedException("Teacher_Name")
					End If
					End Get
					Set
					HttpContext.Current.Session("Teacher_Name") = value
					End Set
					End Property

					Public Shared Property Teacher_FirstName() As String
					Get
					If Not (HttpContext.Current.Session("Teacher_FirstName") Is Nothing) Then
					Return HttpContext.Current.Session("Teacher_FirstName").ToString
					Else
					Throw New SessionUndefinedException("Teacher_FirstName")
					End If
					End Get
					Set
					HttpContext.Current.Session("Teacher_FirstName") = value
					End Set
					End Property
					End Class

					Public Class NewSchool

					Public Shared Property School_Id() As Integer
					Get
					If Not (HttpContext.Current.Session("School_Id") Is Nothing) Then
					Return Convert.ToInt32(HttpContext.Current.Session("School_Id"))
					Else
					Throw New SessionUndException("School_Id")
					End If
					End Get
					Set
					HttpContext.Current.Session("School_Id") = value
					End Set
					End Property
					End Class
					End Class
				

Mon serveur redémarre tout seul, pourquoi?
auteur : Didier Danse
Les applications .NET ont la possibilité de faire du "Process recycling". Le Process recycling permet d'arrêter et de redémarrer une application si:
- elle est inactive (c'est à dire quand tous les clients ont atteint le timeout)
- elle consomme trop de ressources.

Si vous avez accès au fichier Machine.Config, il vous est possible de modifier le processModel à votre guise (timeout, memoryLimit, maxIoThreads, ...)


Comment convertir une chaîne hexadécimale en un tableau de bytes?
auteur : neguib
Pour mieux comprendre, je vous propose 3 petites étapes qui, au final, vous permettront de traduire sans difficultés une chaine de caractères hexadecimaux; Ceci par l'utilisation notamment de la fonction FromHex de la classe System.Uri

1. Partons du principe qu'un byte est representé par une chaine de 2 caractères hexadecimaux.
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:

					
Public Shared Function IsEven(ByVal hexString As String) As Boolean
  If (hexString.Length Mod 2 = 0) Then Return True Else Return False
End Function

Public Shared Function ToEvenByteStrings(ByVal hexString As String) As String()
  If Not IsEven(hexString) Then hexString = "0" & hexString

  Dim currentChar As Integer = 0
  Dim index As Integer = 0
  Dim max As Integer = hexString.Length
  Dim byteStrings() As String = New String(Convert.ToInt32(max / 2) - 1) {}

  While (currentChar < max)
     byteStrings(index) = hexString.Substring(currentChar, 2)
     index += 1
     currentChar += 2
  End While

  Return byteStrings
End Function 

				
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:

					
Public Shared Function ToByteFromHex(ByVal byteString As String) As Byte
   Dim byte1 As Byte = Convert.ToByte(Uri.FromHex(byteString.Chars(0)))
   Dim byte2 As Byte = Convert.ToByte(Uri.FromHex(byteString.Chars(1)))
   Return Convert.ToByte((byte1 * 16) + byte2)
End Function 

				
3. Il nous reste à present à implementer la fonction qui nous retournera un tableau de byte quelquesoit la longueur de la chaine hexadecimale

					
Public Shared Function BytesFromHex(ByVal hexString As String) As Byte()
   Dim bytes() As Byte = Nothing
   Dim max As Integer = hexString.Length

   If (max > 0) Then
     If (max = 1) Then : bytes = New Byte() {ToByteFromHex("0" & hexString)}
     Else
        Dim index As Integer = 0
        Dim byteStrings() As String = ToEvenByteStrings(hexString)
        Dim byteString As String

        bytes = New Byte(byteStrings.Length - 1) {}
        For Each byteString In byteStrings
           bytes(index) = ToByteFromHex(byteString)
           index += 1
        Next
     End If
   End If
   Return bytes
End Function 

				
Lors de l'utilisation de BytesFromHex, il faudra juste veiller à la possibilité d'un retour de valeur null en cas de chaine vide passée en paramètre.

lien : fr Méthode Uri.FromHex

Comment convertir un object en un objet de type approprié et dérivant de Control?
auteur : Didier Danse
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.

					
Public Shared Function ObjectToControl(ByVal obj As Object) As Control
    Dim typeName As String = obj.GetType.ToString
    Dim a As Assembly = Assembly.GetAssembly(GetType(Form))
    Dim t As Type = a.GetType(typeName)
    Dim c As Control = CType(Activator.CreateInstance(t), Control)
    c = CType(Convert.ChangeType(obj, t), Control)
    Return c
End Function

				

Comment convertir un nombre en chaine Hexadecimale?
auteur : neguib
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

					
Public Shared Function ToHexString(ByVal [byte] As Byte) As String
   Return [byte].ToString("X2", Nothing)
End Function
Public Shared Function ToHexString(ByVal [uint16] As UInt16) As String
   Return [uint16].ToString("X4", Nothing)
End Function
Public Shared Function ToHexString(ByVal [uint32] As UInt32) As String
   Return [uint32].ToString("X8", Nothing)
End Function
Public Shared Function ToHexString(ByVal [uint64] As UInt64) As String
   Return [uint64].ToString("X16", Nothing)
End Function 

				
Il ne vous reste qu'à prevoir la conversion pour les types restant SByte, short, int, long :

					
Public Shared Function ToHexString(ByVal [sbyte] As SByte) As String
   Return ToHexString(Convert.ToByte([sbyte]))
End Function
Public Shared Function ToHexString(ByVal [int16] As Short) As String
   Return ToHexString(Convert.ToUInt16([int16]))
End Function
Public Shared Function ToHexString(ByVal [int32] As Integer) As String
   Return ToHexString(Convert.ToUInt32([int32]))
End Function
Public Shared Function ToHexString(ByVal [int64] As Long) As String
   Return ToHexString(Convert.ToUInt64([int64]))
End Function 

				
lien : fr Tableau des formats des résultats numériques

Comment créer et consommer des évènements?
auteurs : doccpu, neguib
Générer un évènement:

D'abord il faut créer les argument de l'événement :

					
Imports System

Public Class MyEventArgs
  Inherits EventArgs
  Private myArg1 As Boolean
  Private myArg2 As Integer
  Public ReadOnly Property Arg1 As Boolean
    Get
       Return Me.myArg1
    End Get
  End Property
  Public ReadOnly Property Arg2 As Integer
    Get
       Return Me.myArg2
    End Get
  End Property
  Public Sun New(ByVal arg1 As Boolean, ByVal arg2 As Integer)
    MyBase.New()
    Me.myArg1 = arg1
    Me.myArg2 = arg2
  End Sub
End Class 

				
Il faut aussi un délégué pour typer l'évènement

					
Public Delegate Sub MyEventHandler(ByVal sender As Object, ByVal e As MyEventArgs ); 

				
Ensuite il faut créer l'évenement et déclencher les delegates inscrits dans l'événement de la classe émétrice :

					
Public Class MyClass
 ' ...
  Public Event MyEvent As MyEventHandler
 
  ' 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 Overridable Sub OnMyEvent(ByVal e As MyEventArgs)
    If Not(MyEvent Is Nothing) Then RaiseEvent MyEvent(Me, e)
  End Sub

End Class 

				
Pour déclencher l'évenement à partir d'une methode de la classe émétrice :

					
boolValue As Boolean = True
intValue As Integer = 0
Me.OnMyEvent(New MyEventArgs(boolValue, intValue))
' ou alors directement
RaiseEvent MyEvent(Me, New MyEventArgs(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

					
Public Class Main
  Private mc As New MyClass()
  Public Sub New()
     ' on assigne notre Delegate à l'évènement de l'objet
     AddHandler Me.mc.MyEvent, AddressOf Me.MyDelegate
  End Sub

  Private Sub MyDelegate(ByVal sender As Object, Byval e As MyEventArgs)
    ' traitement à effectuer
  End Sub 

				
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.


Comment lire un fichier *.wav avec Visual Basic 2005 et le namespace my?
auteur : Ronald Vasseur
Le namespace My est différent des autres namespaces dans le sens où il ne fait que rajouter une surcouche à des classes, des méthodes et des propriétés différentes. En effet, il offre des raccourcis vers de nombreuses fonctionnalités fréquemment utilisées par les développeurs. Par exemple, une action, nécessitant cinq ou six lignes de code n'en prendra plus qu'une ou deux grâce à l'emploi du namespace My, de plus, le niveau de complexité du code sera considérablement diminué. My n'est pas utilisable depuis C#. Voici un exemple d'utilisation de My pour lancer la lecture d'un fichier Wav directement depuis votre code.

					
My.Computer.Audio.Play("c:\unFichier.wav")

				
Il est difficile de faire plus court et plus simple !


Comment retrouver la date correspondante au jour d'une semaine donnée?
auteur : neguib
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"

					
Imports System 
'... 
Private Const libelle As String = "Vous avez recherché : Le "; 
'... 
Private Sub Valider_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Valider.Click 
  Dim lannee As Integer 
  With Me 
    'Verifier si la saisie est bien numérique 
    'Recuperer l'année saisie 
    With .anneeValue 
      If IsNumeric(.Text) Then 
        lannee = CType(.Text, Integer) 
      Else : Exit Sub 
      End If 
    End With 

    'Imposer une date référencée au 01/01/ de l'année 
    Dim dateRef As New DateTime(lannee, 1, 1) 

    With .semaineValue 
      'Recuperer le choix de la semaine 
      Dim week As Double = CType(.Value, Double) 
      'Ajuster le nombre de jours/semaine à la date référencée 
      If week > 1 Then dateRef = dateRef.AddDays((week - 1) * 7) 
    End With 

    With .jourValue 
      'Recuperer le choix du jour 
      Dim day As Double = CType(.Value, Double) 
      'Recuperer le jour de la semaine de la date référencée 
      Dim j As Integer = CType((dateRef.DayOfWeek), Integer) 
      'Ajuster en fonction de la difference des deux 
      Select Case j 
        Case Is > day : dateRef = dateRef.AddDays(-(j - day)) 
        Case Is < day : dateRef = dateRef.AddDays(day - j) 
      End Select 
    End With 
    
    'Afficher le resultat 
    With .resultat 
      .Text = String.Empty 
      .Text &= libelle 
      .Text &= dateRef.ToLongDateString 
    End With 

  End With 
End Sub 

				

Comment arrondir un nombre à l'entier inferieur ou superieur?
auteur : neguib
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

					
Dim monNombre As Double
Dim max As Double
Dim min As Double
Dim texte As String = String.Empty
For each monNombre in MaListe
   min = Math.Floor(monNombre)
   max = Math.Ceiling(monNombre)
   texte &= monNombre.ToString & " est compris entre " & min.ToString & " et " & max.ToString
   texte &= System.Environment.NewLine
Next
Me.Label1.Text = texte 

				
lien : fr Méthode Math.Ceiling
lien : fr Méthode Math.Floor
lien : fr Méthode Math.Round


Consultez les autres F.A.Q's


Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2007 Dotnet Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.