VB.NET. Tester l’existence d’un répertoire FTP

Problématique

Nous avons vu tout à l’heure comment créer un répertoire sur votre serveur via FTP.

La procédure proposée renverra une anomalie si le répertoire existe déjà. Il y a peut-être intérêt à tester d’abord si ce répertoire n’existerait pas déjà.

Solution

Je ne vais pas vous saouler de baratin. Voici le code, très semblable au code nécessaire pour créer un répertoire.

Public Function FTPCheckDir(ByVal ftpWebsite As String, ByVal ftpDir As String) As Boolean
Dim destURI As String
Dim message As String = «  »

destURI = « ftp://votreserveur/ » & ftpWebsite & « / » & ftpDir

Dim ftpRequest As FtpWebRequest = Nothing
Dim ftpStream As Stream = Nothing

Try

ftpRequest = DirectCast(FtpWebRequest.Create(New Uri(destURI)), FtpWebRequest)
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory
ftpRequest.UseBinary = True
ftpRequest.Credentials = New NetworkCredential(ftpUser, ftpPassword)

Dim response As FtpWebResponse = DirectCast(ftpRequest.GetResponse(), FtpWebResponse)
ftpStream = response.GetResponseStream()
ftpStream.Close()
response.Close()

FTPCheckDir = True

Catch ex As Exception

If ftpStream IsNot Nothing Then
ftpStream.Close()
ftpStream.Dispose()
End If

FTPCheckDir = False

End Try

Exit Function

End Function

Cette fonction renvoie true si le répertoire existe déjà, false sinon.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

 POUR EN SAVOIR PLUS : les derniers livres parus sur Visual Basic sont sur

DerniersParus.com » Visual Basic

VB.NET. Créer un répertoire FTP

Problématique

Vous voulez créer par programme un répertoire sur votre serveur via FTP. Comme d’habitude la documentation MSDN n’est pas franchement limpide, ce qui est un doux euphémisme. Et si vous recherchez dans les forums, ça atteint des sommets : aucun des exemples ne fonctionne.

Alors qui vient à votre secours ? Votre humble serviteur.

Solution

en posant

  • destURI : l’URI de destination de type « ftp://votreserveur/votresite/the_directory »
  • ftpUser : votre login FTP
  • ftpPassword : votre mot de passe FTP

le code est le suivant :

Dim ftpRequest As FtpWebRequest = Nothing
Dim ftpStream As Stream = Nothing

Try

ftpRequest = DirectCast(FtpWebRequest.Create(destURI), FtpWebRequest)
ftpRequest.Method = WebRequestMethods.Ftp.MakeDirectory
ftpRequest.UseBinary = True
ftpRequest.Credentials = New NetworkCredential(ftpUser, ftpPassword)

Dim response As FtpWebResponse = DirectCast(ftpRequest.GetResponse(), FtpWebResponse)
ftpStream = response.GetResponseStream()
ftpStream.Close()
response.Close()

Catch ex As Exception

If ftpStream IsNot Nothing Then
ftpStream.Close()
ftpStream.Dispose()
End If

Throw New Exception(ex.Message.ToString())

End Try

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

 POUR EN SAVOIR PLUS : les derniers livres parus sur Visual Basic sont sur

DerniersParus.com » Visual Basic

VB.NET. Comment faire un upload FTP ? en particulier sur un serveur dédié OVH

Problématique

Vous souhaitez uploader un fichier sur votre serveur dédié. Je précise bien qu’il s’agit du sens ordinateur local vers serveur, car du point de vue du serveur, il s’agit d’un download, et dans certaines administrations de serveurs, on n’est jamais sûr du point de vue dont il est question.

Et pour uploader un fichier, vous vous dites que vous aller écrire une fonction réutilisable parce qu’on est tout de même pas des bricolos. Non mais !

Vous regardez sur les sites techniques, vous tombez sur plusieurs options possibles : laquelle choisir ? Plus de souci, la mienne exposée ci-dessous, elle fonctionne bien et vous pouvez toujours l’adapter si mes noms de variables ne vous plaise pas, ce qui est votre droit le plus strict.

Et puis, il y a une deuxième question : comment nommé-je l’hôte, sachant que dans mon cas, il s’agit d’un serveur dédié OVH (dont je suis très satisfait d’ailleurs, du serveur et d’OVH). Vous aurez la solution en bonus.

NE SUIS-JE PAS D’UNE GRANDE CLÉMENCE ?

Solution

La fonction ne permet que de traiter les fichiers un par un. Vous pourriez l’adapter pour en traiter plusieurs. Mais l’objectif n’est pas de réécrire FileZilla tout de même ! Si ?

en posant les noms suivants pour les arguments :

  • srcFile : nom complet du fichier à envoyer (ex. « c:\images\janine.jpg »)
  • destWebSite : nom du site hébergé (ex. « www.ma-vie-mon-oeuvre.com »)
  • destDir : nom du répertoire dans le site (ex. « photos-de-vacances/2013/ »)
  • destFile : nom du fichier de réception (ex. « janine-a-la-plage.jpg » parce que vous aviez déjà un « janine.jpg » sur le serveur mais c’était au ski)

Public Function FTPUpload(ByVal srcFile As String, ByVal destWebSite As String, ByVal destDir As String, ByVal destFile As String) As Boolean

Dim ftp As System.Net.FtpWebRequest
Dim destURI As String

FTPUpload = False

On Error GoTo erreur

destURI = « ftp://ns123456.ovh.net/ » & destWebSite & « / » & destDir & « / » & destFile
ftp = DirectCast(System.Net.WebRequest.Create(destURI), System.Net.FtpWebRequest)
ftp.Credentials = New System.Net.NetworkCredential(ftpUser, ftpPassword)
ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile
ftp.KeepAlive = False

‘ lecture du fichier à envoyer
Dim bFile() As Byte = System.IO.File.ReadAllBytes(srcFile)

‘ upload proprement dit
Dim ftpStream As System.IO.Stream = ftp.GetRequestStream()
ftpStream.Write(bFile, 0, bFile.Length)
ftpStream.Close()
ftpStream.Dispose()
ftpStream.Flush()

FTPUpload = True

End Function

vous aurez noté soigneusement la syntaxe de l’URI de destination.

Bien entendu, vous pouvez aussi retirer les préfixes System.Net et System.IO si vous avez placé en tête de votre module respectivement : Imports System.Net et Imports.System.IO.

Enfin, Henri, dans un commentaire du 30/12/2014 précise que le solution, testée en VB.NET 2008 fonctionne telle quelle en version 2013. Ce dont je le remercie. Henri pas VB 2013.

 POUR EN SAVOIR PLUS : les derniers livres parus sur Visual Basic sont sur

DerniersParus.com » Visual Basic

VB.NET. Mettre un programme en pause (sleep)

Problématique

Vous souhaitez suspendre l’exécution d’un programme pendant une durée quelconque pour une raison qui ne regarde que vous (je suis d’un naturel discret).

Solution

Comme d’habitude avec Microsoft, c’est simple mais il faut le trouver. Si vous voulez « pauser » pendant disons n millisecondes, j’ai bien dit millisecondes, laissez l’instruction :

System.Threading.Thread.Sleep(n)

sauf si en tête du module vous avez déjà inséré la ligne

Imports System.Threading

et dans ce cas, il vous suffira d’écrire

Thread.Sleep(n)

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

POUR EN SAVOIR PLUS : les derniers livres parus sur Visual Basic sont sur

DerniersParus.com » Visual Basic

VB.NET Changer les dimensions d’une image

Problématique

Il ne s’agit pas de modifier la taille apparente d’une image dans un formulaire par exemple : trop facile ! Vous ne seriez pas arrivés sur mon site aussi utile et agréable que méconnu : il y a beaucoup de réponses sur le Net et certaines sont exactes !

Non, l’objectif ici est de « prendre » un fichier image quelconque (.JPG, .GIF, .PNG, …) et de la transformer en autre de taille différente … et même de type différent si ça vous chante !

Je vous sens heureux d’être là.

Solution

C’est tout bête mais il faut le trouver. Je vous indique les variables, vous y mettez ce que vous voulez. Désolé si les commentaires sont répétitifs mais au moins les choses seront claires.

On commence par :

Dim srcImage As String ‘ path du fichier d’origine
Dim dstImage as string ‘ path du fichier destination
Dim srcBitmap As New Bitmap(srcImage) ‘ bitmap dans lequel on placera l’image d’origine
Dim srcWidth As Integer = srcBitmap.Size.Width ‘ largeur de l’image d’origine
Dim srcHeight As Integer = srcBitmap.Size.Height ‘ hauteur de l’image d’origine
Dim dstWidth as integer ‘ largeur de l’image destination

Puis, si vous ne tenez pas spécialement à garder la proportionnalité :

Dim dstHeight as integer ‘ hauteur de l’image destination
Dim destBitmap As New Bitmap(srcBitmap, dstWidth, dstHeight) ‘ bitmap dans lequel on placera l’image destination

Ou, dans le cas plus fréquent où vous souhaitez conserver les proportions de l’image :

Dim scaleFactor As Double = cdbl(dstWidth) / CDbl(srcWidth) ‘ le scale factor (coefficient de proportionnalité en français)
Dim destBitmap As New Bitmap(srcBitmap, dstWidth, CInt(srcHeight * scaleFactor)) ‘ bitmap dans lequel on placera l’image destination

Et enfin, pour sauvegarder l’image dans un nouveau format

destBitmap.Save(dstImage, System.Drawing.Imaging.ImageFormat.[type image]) ‘ [type image] peut prendre les valeurs : Gif, Icon, Jpeg, Png, …
srcBitmap.Dispose() ‘ toujours laisser un endroit aussi propre en entrant qu’on l’a trouvé en arrivant
destBitmap.Dispose() ‘ là aussi : propre, on vous dit

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

POUR EN SAVOIR PLUS : les derniers livres parus sur VB.NET sont sur

DerniersParus.com » VB.NET

VB.NET DataGridView. Comment détruire la dernière rangée ? (suite et fin ?)

Problématique

Vous alimentez par programme une DataGridView. J’entends par là que vous ne l’avez pas reliée à une source de données. Vous avez tout bien ajusté pour que la DataGridView ne fasse pas apparaître la ligne vide qui permet les ajouts manuels mais qui dans votre cas fait vraiment moche.

Pour détruire une ligne quelconque, tout va bien. Mais si vous voulez détruire la dernière ligne, VB.NET vous renvoie le message d’exception

Impossible de supprimer la nouvelle ligne non validée

Dans un précédent post du 28 mai, je proposais une solution mais elle ne me plaisait pas (j’ai laissé le post : il faut reconnaître ses faiblesses). Mais je me suis remis à chercher la solution à ce problème.

Je n’aime pas dire ça mais devant l’abondante littérature des forums à ce sujet, erronée au point que c’en est drôle, j’ai vraiment essayé de lire le MSDN Microsoft sur les énigmes du RemoveAt. Et il me semble bien qu’aussi clairement que Microsoft peut l’écrire (vous voyez ce que je veux dire …) que ce n’est pas possible. Mais j’ai assez perdu de temps sur ce truc.

Alors j’ai trouvé un solution simple et qui fonctionne bien. Et, somme toute, assez élégante.

Solution

Vous voulez supprimer la dernière ligne et vous ne réussissez pas ? Deux cas se présentent :

  1. c’est la dernière et la seule. Vous videz le tableau et vous faites ce qu’il y a faire dans ce cas-là : le remplir à nouveau ou sortir du formulaire. Et hop ! on n’en parle plus
  2. VB.NET ne veut pas supprimer la dernière ligne ? Qu’à cela ne tienne, ce n’est pas un petit VB.NET qui va nous arrêter : vous recopiez l’avant-dernière ligne dans la dernière et vous détruisez l’avant-dernière ligne. Ce qui donne quelque chose du genre :

With grdBooks

row = .CurrentRow.Index

If row = .Rows.Count – 1 Then

.Rows(row).Cells(« col1 »).Value = .Rows(row-1).Cells(« col1 »).Value

.Rows(row).Cells(« col2 »).Value = .Rows(row-1).Cells(« col2 »).Value

.Rows(row).Cells(« coln »).Value = .Rows(row-1).Cells(« coln »).Value

.Rows.RemoveAt(row-1)

Else

.Rows.RemoveAt(row)

End If

End With

Et en fin de compte, je suis assez content de moi.

Et si vous voulez savoir comment on sélectionne (et désélectionne), je vous renvoie à mon post du 10 mai.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

VB.NET DataGridView. Comment détruire la dernière rangée (row) ?

Problématique

Vous alimentez par programme une DataGridView. J’entends par là que vous ne l’avez pas reliée à une source de données. Vous avez tout bien ajusté pour que la DataGridView ne fasse pas apparaître la ligne vide qui permet les ajouts manuels mais qui dans votre cas fait vraiment moche.

Pour détruire une ligne quelconque, tout va bien. Mais si vous voulez détruire la dernière ligne, VB.NET vous renvoie le message d’exception

Impossible de supprimer la nouvelle ligne non validée

Alors vous cherchez : dans le MSDN Microsoft, dans les forums. Surprenant, j’ai jamais vu une question si souvent posée et qui avait aussi peu de réponses.

Solution (approximative)

D’abord, le truc a ne pas faire que vous recommandent certains de manière péremptoire, modifier de la manière suivante la propriété de la DataGridView

AllowUsersToAddRows=False

parce que dans ce cas, vous ne pouvez plus ajouter de ligne par programme. Donc la question de détruire une ligne ne se pose plus : la grille reste vide.

Ce n’est donc pas la solution.

Tout ce que j’ai trouvé dans ce cas, c’est de remplacer la dernière ligne par une ligne vide, le code a donc l’allure suivante

With grdBooks

    row = .CurrentRow.Index

    If row = .Rows.Count – 1 Then

        .Rows(row).Cells(« col1 »).Value = «  »

        .Rows(row).Cells(« col2 »).Value = «  »

        .Rows(row).Cells(« col3 »).Value = «  »

        .Rows(row).Cells(« col4 »).Value = «  »

        .Rows(row).Cells(« col5 »).Value = «  »

     Else

         .Rows.RemoveAt(row)

     End If

 End With

Ce n’est pas extraordinaire puisque je me retrouve avec la ligne vide dont je ne voulais pas. Et si vous avez mieux, je suis preneur. Merci d’avance.

VB.NET – Surligner (highlight) le noeud sélectionné d’un TreeView

Problématique

Vous venez de sélectionner un noeud par programme par l’instruction :

myTreeView.SelectedNode=mySelectNode

mais il n’apparaît pas en mode « Highlight » (par défaut en blanc sur fond bleu).

Solution

Deux cas se présentent. Et il faut en fait les traiter tous les deux.

Vous perdez le surlignement quand le treeView perd le focus

Si vous perdez le highlight quand le treeView perd le focus (vous suivez ce mélange d’anglais et de français parce que moi j’ai du mal à l’écrire), il faut vérifier la propriété HideSlection du TreeView : elle est par défaut à False. Donc, c’est logique, il cache la sélection.

Mettez-la à True :

  • soit dans les propriétés du contrôle dans le design de la form
  • soit par programme avec l’instruction

myTreeview.HideSelection = True

et ça ira beaucoup mieux

Et de toute manière vous ne l’avez pas du tout ce surlignement

Il faut simplement après chaque changement de sélection remettre le focus sur le treeView de la manière suivante :

myTreeView.Focus()

C’est simple mais on met un temps fou à trouver ce truc.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

A lire

Visual Basic 2010, étape par étape (Michael Halvorson)

Il s’agit d’un livre Microsoft Press. Et je trouve les ouvrages Microsof Press plutôt bien faits.

Étrangement, ils n’ont rien à voir avec le MSDN Microsoft, plutôt abscons et mal fichu, utile dans le seul cas où on a un besoin précis. En tout cas, il est franchement difficile d’apprendre le langage avec MSDN.

En fait est-ce aussi étrange que ça ? Si on peut vendre un livre en plus du soft, pourquoi se gêner. Mais je vous le redis, ils en valent la peine.

VB.NET. DataGridView sélectionner (et donc afficher) une ligne spécifique

Problématique

Supposons que vous ajoutiez des lignes saisies dans un DataGridView (un peu comme dans le défunt MSMoney où vous saisissiez votre écriture dans un pavé et que la ligne s’affichait dans la grille au-dessus, vous voyez ?). Ou que vous vouliez sélectionner (et donc afficher) la ligne n, celle-là et pas une autre.

Comme souvent en VB.NET, dont le workbench est au demeurant remarquable, ce n’est pas intuitif.

Solution

Nous dirons d’abord que votre DataGridView s’appelle myGrid.

1ère étape

Il est plus esthétique de commencer par désélectionner la ligne actuellement sélectionnée. Facile :

myGrid.CurrentRow.Selected = False

Mais s’il n’y a pas de ligne en cours, il y aura bug ! Il vaut mieux, non il faut, prendre la précaution suivante

if myGrid.CurrentRow IsNot Nothing Then

myGrid.CurrentRow.Selected = False

End If

et parce que le With simplifie l’écriture et rend le programme plus lisible, voici une suggestion (forte) d’écriture définitive

With myGrid

if .CurrentRow IsNot Nothing Then

.CurrentRows.Selected = False

End If

End With

2ème étape

Et là nous entrons dans le vif du sujet avec une grosse surprise : on ne peut pas sélectionner une ligne (row) dans un DataGridView ! Du moins pas directement. Il faut pour cela sélectionner une des cellules de la ligne (row). Et donc voici comment il faut faire si la ligne que vous voulez sélectionner est la n° numrow

With myGrid

.CurrentCell = .Item(0, numrow)

.CurrentRow.Selected = True

End With

Nous avons proposé comme cellule active celle de la colonne 0. Parce qu’on est sûr qu’elle existe : c’est la première colonne et la numérotation commence, ne l’oubliez pas, en 0. Or si vous avez une DataGridView sans colonnes, je vous pose une question : pourquoi ajouter une ligne à un tableau sans colonne. Et d’ailleurs est-ce encore un tableau ?

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

VB.NET – Changement des caractéristiques d’une police de caractères (« font »)

Problématique

Vous voulez changer la police d’un label ou d’un button. Pour la couleur, c’est facile, je ne vous ferai donc pas l’affront de vous l’expliquer. Mais pour passer en gras ou en italique, vous avez sûrement essayé

myButton.Font.Bold = True (ça ne marche pas, c’est un exemple)

Echec sur toute la ligne car, VB.NET vous répond que le propriété est Read Only

Solution

La vraie solution est la suivante :

myButton.Font = New Font([famille de font], [taille de la font], [style de la font]

[famille de font] peut prendre les valeurs :

  • FontFamily.GenericMonospace
  • FontFamily.GenericSansSerif
  • FontFamily.GenericSerif

[taille de la font] est exprimé en points, sachant que la valeur par défaut est 8.25

[style de la font] peut prendre les valeurs :

  • FontStyle.Bold
  • FontStyle.italic
  • etc …

Les paramètres sont assez explicites et c’est plutôt sympathique. Mais reconnaissez que la procédure n’est pas intuitive.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

VB.NET – Une ruse pour la mise en forme d’un formulaire

Problématique

Vous voulez positionner au quart de poil un control TextBox, Label ou autre ComboBox. Et avec la souris, ça saute plusieurs pixels à la fois. Et donc, ça ne retombe jamais pile à l’endroit que vous visiez.

Solution

Vous sélectionnez le contrôle et vous le déplacez avec les flèches de direction. Une pression sur une des touches de direction = 1 pixel de déplacement.

Si après ce conseil destiné à économiser vos nerfs vous n’y arrivez pas, deux solutions : vous avez Parkinson ou, plus vraisemblablement, il faut sérieusement penser à passer au lait-grenadine ou au Perrier-rondelle.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

VB.NET – Les curseurs

Problématique

Vous voulez modifier le curseur pour afficher le curseur d’attente pendant un traitement et revenir au curseur par défaut ensuite. Et vous ne trouvez pas parce que n’est pas intuitif.

Solution

C’est simple mais comme on ne fait pas ça toutes les 5 mn, on oublie à chaque fois et c’est très énervant. Donc voici la solution pour moi comme pour vous.

Pour le curseur d’attente :

Cursor = System.Windows.Forms.Cursors.WaitCursor

pour revenir au curseur par défaut :

Cursor = System.Windows.Forms.Cursors.Default

pour d’autres curseurs, quand vous aurez tapé le point après Cursors, VB se fera un plaisir de vous en proposer d’autres.

Evidemment, si vous avez mis en en-tête de votre form

Imports System.Windows.Forms,

vous pouvez vous passer des trois premiers termes. Mais c’est bien lourd pour un petit curseur.

Bon en fait ce n’est pas intuitif du tout et pas simple non plus.

LE TOUR EST JOUÉ ! ALORS ON  DIT MERCI QUI ?

VB.NET – Ajouter des noeuds dans un TreeView … et les retrouver

Problématique

Même si on visualise bien en quoi ça consiste, il n’est pas toujours facile de manipuler les TreeView. La logique est tellement évidente qu’on se prend facilement les pieds dans le tapis. Mais quand on y est, quel bonheur !

Solution

Ajouter un noeud dans un TreeView

Tout d’abord, quand vous construisez un TreeView (on l’appellera par la suite mùyTreeView), il commence à vide. Il dispose d’une collection Nodes vide. Il faut donc créer le noeud « racine ».

Avec ce noeud-racine, nous apprendrons comment créer un noeud quelconque. Il y a plusieurs syntaxes incluant en particulier celles qui permettent d’assigner une icône au noeud. Mais je n’ai pas encore utilisé cette fonctionnalité, je ne vous en parlerai pas puisque que je ne parle que de ce que j’ai pu faire. Les deux possibilités principales sont :

  • myTreeView.Nodes.Add(text)
  • myTreeView.Nodes.add(key, text)

key et text sont deux paramètres, au format « string » bien entendu, plutôt fondamentaux :

  • key est comme son nom l’indique, le nom du noeud et surtout le moyen d’y accéder
  • text est le texte qui s’affichera sur le noeud. Il est donc tout aussi important. Il n’en est pas moins facultatif puisque vous pouvez parfaitement souhaiter ne pas afficher de texte à un noeud d’un arbre.

Mais étrangement, VB.NET vous propose d’abord de créer un noeud par son texte. Bon …

Par exemple, key pourra être le n° client et text son nom. Classique …

Ces deux données peuvent être lues et mises à jour par les instructions :

  • key :  node.Name = « key »
  • text : node.Text = »text »

ATTENTION DANGER !

key est une string, mais votre clef peut être numérique donc :

à la création du noeud, vous pouvez tout à fait passer la veleur de la clef en numérique, VB convertira automatiquement en string

Mais à la lecture (voir plus loin), il faudra chercher cette clef au format string en la convertissant en string par CStr(key) sinon il cherchera un index.

Imaginez que vous cherchez un n° de Sécu, en mode texte il trouvera sans problème si vous oubliez la conversion (le cast), il cherchera un index de rang 10000 milliards. je ne doute pas que vous gériez des projets titanesques mais à ce point ! Vous risquez plutôt de recevoir de VB un message d’insultes et ce sera bien fait car je vous aurais prévenus.

Mais vous me direz, et vous aurez raison : « c’est quoi node ? ». C’est la variable TreeNode qui contient le noeud. « Ah bon ? et comment la retrouve-je ? » direz-vous car vous êtes pleins de bon sens ? C’est l’objet du paragraphe suivant.

Comment retrouver un noeud dans l’arbre ?

Les deux manières principales sont habituelles en Visual Basic :

  • par l’index du noeud
  • par la key du noeud

Par l’index

L’index est le n° d’ordre du noeud « fils » dans la collection des sous-noeuds du noeud « père ». Ce numéro est généré automatiquement. On peut l’utiliser pour lister les noeuds « fils » mais pour retrouver le noeud, ce n’est pas l’idéal. Par exemple, on peut procéder de la manière suivante :

dim node as TreeNode

for i=1 to Nodes.Count

if Nodes(i). Text = [votre condition] (ou Nodes(i).Name = [votre condition si votre test est sur la clef du noeud]) then

node=Nodes(i)

exit for

endif

next

mais « c’est quoi Nodes me direz-vous ? » car décidément vous ne posez que des questions intelligentes. Et je vous répondrai ensuite car il faut y aller par étapes.

Par la clef

Là c’est beaucoup plus simple pour retrouver le noeud visé, il suffit d’écrire :

node=Nodes(key)

vous comprendrez pourquoi je préfère cette méthode.

La collection Nodes

Nous avons cherché dans la collection Nodes. Mais qu’est-elle ? (à prononcer doucement car « mékétel » ne veut rien dire).

Ne tombez pas dans le panneau dans lequel je suis tombé. La collection Nodes est celle des sous-noeuds d’un noeud donné et non celle des noeuds du TreeView.  Dans un  TreeView, vous pourrez donc avoir des noeuds qui ont la même clef à condition qu’il ne soient pas au même niveau dans la même branche : à monn avis, ce n’est pas sain.

Pour être plus clair, même si vous avez une key unique dans le TreeView, vous ne la trouverez par

myTreeView.Nodes(key)

que si elle est au premier niveau de l’arborescence.

Ce qui signifie que pour retrouver une clef dans un arbre complet, il vous faut écrire une recherche récursive. Vous savez sans doute le faire, sinon un peu de patience, j’en parlerai bien un jour.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

Pourquoi ce « blog-note » informatique ?

Vous trouvez facilement dans les docs en ligne ou sur Google vous ? Moi pas ?

Comme tous ceux qui programment, j’ai parfois des difficultés.

Alors je cherche dans les manuels online.

  • PHP ? Splendide : on cherche, on trouve et ça marche
  • MySQL ? Pas mal : on cherche, on trouve et ça marche si on comprend ce qu’ils racontent
  • MSDN ? Dur : on cherche, on ne trouve pas toujours et quand on trouve, rien ne dit que ça marche.
  • Les forums ? Quand on a passé la couche des fautes d’orthographes, on trouve des réponses manifestement pas essayées que le geek moyen a entendu après sa 5e bière voire son 3e pétard donc auxquelles il a pas pigé un broc. Enervant.

Alors voilà pourquoi ce « blog-note » informatique

Donc ce blog, un forum de plus ?

Non, ce que j’ai essayé ça marche … Ou alors j’aurais mal expliqué et dans ce cas prévenez-moi.

Alors comme je suis d’un naturel jovial et généreux, je vous fais partager mes solutions. A charge de revanche … Et puis comme je suis prudent, c’est un moyen de ne pas oublier 6 mois après comment j’avais réussi à me dépanner.

Petit détail, je programme en VB.NET (même si je connais le C, ce roi des langages, mais VB.NET a une meilleure interopérabilité avec Microsoft Office), en PHP, je me mets à Java (donc n’attendez pas trop de tuyaux là-dessus pour le moment). Je fais du HTML et du WordPress pour mes sites. Et à une époque d’égarement, j’ai utilisé SQL Server en local mais j’ai cru que mon PC était retourné dans les années 80. Et je suis passé à MySQL (en attendant PostgreSQL dont un ami me vante les charmes torrides à chaque rencontre).

En outre, j’ai une assez longue expérience. J’ai connu MSDOS 1.25 les p’tits gars ! Il n’y avait pas de répertoires, juste 16 disques virtuels de A à P, ce qui ne nous rajeunit pas.

Enfin malgré les apparences, je n’ai jamais été salarié comme informaticien mais je me suis toujours fabriqué des outils informatiques pour mon utilisation personnelle ou professionnelle. Donc, attendez-vous à du pratico-pratique.