none
Enregistrer le contenu complet d'une ComboBox dans My.Settings et le restaurer RRS feed

  • Question

  • Bonjour à tous,

    J'ai longtemps cherché, j'ai compris le fonctionnement de My.Settigns mais je suis un peu largué.

    J'aimerai que quand on clique sur un bouton, il sauvegarde tout le contenu de ComboBox1 dans My.Settings, et que quand on relance le formulaire (après l'avoir fermé), il les restaure.

    Comment faire ?

    Merci d'avance !

    mercredi 27 octobre 2010 15:43

Réponses

  • Bonjour, voici :

    Si tu es satisfait, à toutes mes réponses, en haut et à gauche de celles-ci, tu peux cliquer dans le rectangle où il y a le triangle vert (c'est pour mon avancement ;o)

    Code testé, tu n'as plus qu'à suivre les indications.

    '
    ' OBJETS = 3 : form1 + comboBox1 + button1
    Option Explicit On
    Public Class Form1 ' le fichier se trouve dans le répertoire BIN par défaut
     Dim nomFichier As String = "\fichierCombo1.txt" ' nom du fichier
    
     Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     ' si le combo doit trier les valeur, mettre la propriété >> SORTER = TRUE
     Call litCombo1()
     ComboBox1.Focus()
     End Sub
    
     Sub litCombo1() ' lit le fichier et si existant et non vide, l'écrit dans le comboBox1
     Dim existe As Boolean
     Dim longueur As Long
     existe = System.IO.File.Exists(My.Application.Info.DirectoryPath & nomFichier)
     If existe = True Then longueur = FileLen(My.Application.Info.DirectoryPath & nomFichier)
     If existe = False Or longueur < 1 Then Exit Sub
     Dim p As New System.IO.StreamReader(CStr(My.Application.Info.DirectoryPath & nomFichier))
     While p.Peek() >= 0
      ComboBox1.Items.Add(p.ReadLine())
     End While
     p.Close()
     ComboBox1.SelectedIndex = 0
     ComboBox1.Focus()
     End Sub
    
     Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' valide la saisie
     Dim i As Long
     If ComboBox1.Text <> "" Then ' enregistre une saisie (en fin) si la zone texte contient une écriture
      For i = 0 To ComboBox1.Items.Count - 1
      If ComboBox1.Text = ComboBox1.Items(i) Then GoTo suite ' refuse les doublons
      Next
      ComboBox1.Items.Add(ComboBox1.Text)
      ComboBox1.Refresh()
     End If
    suite: ' écrit le fichier
     Dim p As New System.IO.StreamWriter(CStr(My.Application.Info.DirectoryPath & nomFichier))
     For i = 0 To ComboBox1.Items.Count - 1
      p.WriteLine(ComboBox1.Items(i))
     Next i
     p.Close()
     Call litCombo1() ' lit le nouveau fichier écrit
     MsgBox("ComboBox1 enregistré ", vbInformation) ' informe
     End Sub
    
     Sub ComboBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles ComboBox1.KeyPress
     If AscW(e.KeyChar) = 13 Then Call Button1_Click(sender, e) ' validation zone texte par <Entrée>
     End Sub
    
    End Class
    

    Au plaisir, cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Modifié EhJoe jeudi 28 octobre 2010 01:57 correction 1
    • Marqué comme réponse Alex Petrescu vendredi 29 octobre 2010 10:42
    jeudi 28 octobre 2010 01:56

Toutes les réponses

  • Bonjour Natinusala,

    Tu veux sauvegarder les datas de ton comboBox1 dans My.Settings.Save je présume, mais il me semble bien que MySetting c'est pour enregistrer seulement des paramètres de configuration (fonte par exemple), je ne sais pas s'il peut avaler un tas de datas et si c'est la meilleur solution ?

    A priori tu voudrais sauvegarder les datas des ton comboBox1 afin de les récupérer au prochain lancement, pour faire ceci on utilise habituellement un fichier, ne préférerais-tu pas cette méthode ?

    Au plaisir, cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mercredi 27 octobre 2010 18:27
  • Eh bien si c'est possible de faire dans un fichier je veut bien. Mais faut-il écrire chaque variable une par une, ligne par ligne ?
    mercredi 27 octobre 2010 20:42
  • Bonjour,

    Non, heureusement que nom, il faut écrire chaque variable mais on fait une boucle de trois lignes :

    Pour i du début à la fin de ComboBox1
     copie dans fichier1 = ligne(i) de comboBox1
    Fin de "pour i"
    
    
    

    Je te fais ça, cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    jeudi 28 octobre 2010 00:00
  • Bonjour, voici :

    Si tu es satisfait, à toutes mes réponses, en haut et à gauche de celles-ci, tu peux cliquer dans le rectangle où il y a le triangle vert (c'est pour mon avancement ;o)

    Code testé, tu n'as plus qu'à suivre les indications.

    '
    ' OBJETS = 3 : form1 + comboBox1 + button1
    Option Explicit On
    Public Class Form1 ' le fichier se trouve dans le répertoire BIN par défaut
     Dim nomFichier As String = "\fichierCombo1.txt" ' nom du fichier
    
     Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     ' si le combo doit trier les valeur, mettre la propriété >> SORTER = TRUE
     Call litCombo1()
     ComboBox1.Focus()
     End Sub
    
     Sub litCombo1() ' lit le fichier et si existant et non vide, l'écrit dans le comboBox1
     Dim existe As Boolean
     Dim longueur As Long
     existe = System.IO.File.Exists(My.Application.Info.DirectoryPath & nomFichier)
     If existe = True Then longueur = FileLen(My.Application.Info.DirectoryPath & nomFichier)
     If existe = False Or longueur < 1 Then Exit Sub
     Dim p As New System.IO.StreamReader(CStr(My.Application.Info.DirectoryPath & nomFichier))
     While p.Peek() >= 0
      ComboBox1.Items.Add(p.ReadLine())
     End While
     p.Close()
     ComboBox1.SelectedIndex = 0
     ComboBox1.Focus()
     End Sub
    
     Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' valide la saisie
     Dim i As Long
     If ComboBox1.Text <> "" Then ' enregistre une saisie (en fin) si la zone texte contient une écriture
      For i = 0 To ComboBox1.Items.Count - 1
      If ComboBox1.Text = ComboBox1.Items(i) Then GoTo suite ' refuse les doublons
      Next
      ComboBox1.Items.Add(ComboBox1.Text)
      ComboBox1.Refresh()
     End If
    suite: ' écrit le fichier
     Dim p As New System.IO.StreamWriter(CStr(My.Application.Info.DirectoryPath & nomFichier))
     For i = 0 To ComboBox1.Items.Count - 1
      p.WriteLine(ComboBox1.Items(i))
     Next i
     p.Close()
     Call litCombo1() ' lit le nouveau fichier écrit
     MsgBox("ComboBox1 enregistré ", vbInformation) ' informe
     End Sub
    
     Sub ComboBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles ComboBox1.KeyPress
     If AscW(e.KeyChar) = 13 Then Call Button1_Click(sender, e) ' validation zone texte par <Entrée>
     End Sub
    
    End Class
    

    Au plaisir, cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Modifié EhJoe jeudi 28 octobre 2010 01:57 correction 1
    • Marqué comme réponse Alex Petrescu vendredi 29 octobre 2010 10:42
    jeudi 28 octobre 2010 01:56
  • Merci beaucoup ça marche !

    Je viens de me rendre compte que j'ai encore beaucoup à apprendre, les 3/4 du code ci/dessus je ne l'ai pas compris ^^'

    Je t'aurai volontier envoyé l'éxécutable pour que tu voie ce que j'ai fait, mais il ne marche que si World of Warcraft est installé sur la machine, est-ce le cas ?

    jeudi 28 octobre 2010 11:50
  • Bonsoir,

    Non je n'ai pas cette application dont tu parles, par ailleurs, pour être honnête je ne lance pas d'exécutables de personnes que je ne connais pas bien, c'est le cas, désolé, j'espère que tu comprends, par contre tu peux m'envoyer des images, des copies d'écran, que je vois ce que tu veux faire ...

    Je vais tenter de commenter ce que j'ai fait, en gros :

    Option Explicit On

    ** informe et plante si on utilise une variable non déclarée préalablement.

    Public Class Form1 ' le fichier se trouve dans le répertoire BIN par défaut

    ** le code est désormais dans une classe, une sorte de grosse fonction en l'espèce, que l'on peut appeler entre elles si on en met plusieurs, en gros ...

    Dim nomFichier As String = "\fichierCombo1.txt" ' nom du fichier

    ** DIM c'est l'odre de déclaration de variable et derrière on met éventuellement (généralement) le type AS (avec) string (chaîne), donc cette variable sans autres manipulation (car on peu forcer le changement de type d'une variable, mais bon, n'en parlons pas ici), la variable va travailler avec des chaines, donc avec tout en fait (alphanumérique). Alors ici je remplis la variable qui se nomme nomFichier, je mets dedans la chaîne qui sui l'égal (entre guillemets), c'est une chaîne de caractère, et ensuite l'opostrophe est un commentaire non pris en compte par le code, ce qui suite la parenthèse sur sa ligne ici, on peut mettre un commentaire sur plusieurs lignes, mais on laisse pour le moment ...

     Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' si le combo doit trier les valeur, mettre la propriété >> SORTED = TRUE

    ** la SUB c'est la déclaration d'une procédure et dedans ses définitions de variables par valeur (ce qu'elle contiennent), surtout on a SENDER qui est je crois le pointeur et E c'est souvent le plus important, c'est lui qui représente ce que reçoit par défaut la procédure, en fait on n'a pas à écrire ça, il suffit de double cliquer sur la form et le code de base qui la représente s'écrit (comme ici), on voit d'ailleurs l'association FORM1 (cette feuille n°1) _ LOAD (l'évènement de chargement avant affichage), c'est généralement dans cet évènement que l'on met tout ce qui doit être fait avant l'affichage.

     Call litCombo1()
    ComboBox1.Focus()
    End Sub

    ** CALL j'appelle une procédure qui se nomme litCombo et () veut dire que je ne lui envoie aucune valeur particulière ; .FOCUS() signifie que je donne la main au comboBox, et END SUD c'est la fin de la procédure sus-citée...


    Sub litCombo1() ' lit le fichier et si existant et non vide, l'écrit dans le comboBox1

    ** une autre procédure (fonction, presque pareil), ce qui est appelé (sus-cité)
    Dim existe As Boolean
    Dim longueur As Long

    ** Déclaration de variable dont une est de type BOOLEAN, elle pésente deux état seulement, soit 0 soit 1, True ou false ; et l'autre est une variable chiffre entier long, qui occupe théoriquement 4 octet en mémoire, ça correspond à ce qu'absorbent les processeurs actuels, donc dans l'absolu ça ne sert pas à grand chose je crois de déclarer plus petit en numérique (interger 2 octets, byte 1 octet).

    existe = System.IO.File.Exists(My.Application.Info.DirectoryPath & nomFichier)

    ** Je demande à la variable EXISTE de me dire si oui ou non il y a ce qui sui l'agal ; j'onvoque ensuite la gestion de fichier IO (Input Output) puis dans cette famille (classe ? je connais mal le vbNet), de cette IO j'invoque la fonction file.exist ... donc je lui demande si un fichier existe, et dans sa parenthèse j'invoque d'autre éléments qui permettent de dire où est le fichier (là je lui dis qu'il se trouve à l'endroit prévu par défaut (répertoire BIN), et je lui passe le nom du fichier qui est contenu dans la variable sus-citée nomFihier, j'aurais aussi pu écrire son nom en tant que chaîne, donc entre guillemets, c'est là l'avantage de la variable, c'est qu'on a pas à évrire dit fois la même chose, on déclare une variable ou la charge et ensuite on passe son nom en paramètre


    If existe = True Then longueur = FileLen(My.Application.Info.DirectoryPath & nomFichier)
    If existe = False Or longueur < 1 Then Exit Sub

    ** Là au 1er IF je fais un test = si le fichier existe alors je demande la longueur du fichier (en passant comme ci-dessus son chemin et son nom) ; dans le second IF je teste ensuite les variables que j'ai chargé, à savoir si le cichier ecxiste et sa longueur, le fichier de tes mots dans le comboBox, et si le fichier n'existe pas ou OR s'il est vide (< 1 octet) je lui dis d'abandonner, de sorti de la procédure (exit sub) ...

    Dim p As New System.IO.StreamReader(CStr(My.Application.Info.DirectoryPath & nomFichier))

    ** Là je déclare un pointeur p qui va naviguer dans le fichier octet par octet pour le lire READER, ensuite j'indique le lieu et le nom.

    While p.Peek() >= 0

    ** Là je dis TANT QUE p (pointeur) est = ou  > à 0, donc tant qu'il y a encore du texte ...

    ComboBox1.Items.Add(p.ReadLine())

    ** je remplis le comboBox1 el lisant grâce au pointeur p chaque ligne du fichier (je pourrais lire octet par octet, mais comme c'est un fichier texte avec indication de la fin de ligne, on lit par ligne READLINE

    End While

    ** Fin de la condition tant que


     p.Close()

    ** Fermeture du fichier par désallocation de son pointeur

    ComboBox1.SelectedIndex = 0

    ** Je demande au comboBox d'afficher sa première ligne 0


    ComboBox1.Focus()
    End Sub

    Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' valide la saisie
    Dim i As Long

    ** ça c'est la procédure de ton bouton, elle s'inscrit automatiquement en double cliquant sur le bouton

     If ComboBox1.Text <> "" Then ' enregistre une saisie (en fin) si la zone texte contient une écriture

    ** Je demande si un texte a été saisi, donc <> "" veut dire différent de vide

    For i = 0 To ComboBox1.Items.Count - 1

    ** si nous sommes ici c'est qu'il y a du texte, sinon ça ne rentre pas dans le test ente IF et END IF ; l) c'est une boucle, je lui dis de prendere la variable i de 0 à ce que contient en lignes ton comboBox - 1 car il commence à 0, donc i va valoir 0, puis s'il y a dautre ligne, 1, etc.

      If ComboBox1.Text = ComboBox1.Items(i) Then GoTo suite ' refuse les doublons

    ** je teste ce qui vient d'être saisit et ce que contien le comboBox par ligne(i) et si c'est déjà enregistré je n'en tiens pas compte (goto suite, va à suite:)


      Next

    ** fin de la boucle i


    ComboBox1.Items.Add(ComboBox1.Text)

    ** Là nous sommes dans le cas ou le texte saisit n'existe pas dans le comboBox (le fichier), dont je l'écris dans le comboBox

      ComboBox1.Refresh()

    ** Je rafraîchis le ComboBox

     End If

    ** Fin de la condition sus-citée

    suite: ' écrit le fichier

    ** Saute directement ici s'il n'y a rien à écrire voir le GOTO plus hait, sinon y vient en séquence, le texte du code est lu de haut en bas

     Dim p As New System.IO.StreamWriter(CStr(My.Application.Info.DirectoryPath & nomFichier))

    ** Cette fois j'écris dans le fichier en écrasant tout ce qui esiste STREAMWRITER


     For i = 0 To ComboBox1.Items.Count - 1
      p.WriteLine(ComboBox1.Items(i))

    ** J'écris chaque ligne du comboBox dans une ligne du fochier

     Next i
    p.Close()
    Call litCombo1() ' lit le nouveau fichier écrit

    ** Je relis le nouveau fichier avec le texte rajouté en appelant la procédure de lecture afin que l'on voit le changement dans le comboBox


     MsgBox("ComboBox1 enregistré ", vbInformation) ' informe

    ** J'informe avec affichage du logo d'information (I)


     End Sub

    Sub ComboBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles ComboBox1.KeyPress

    ** Là j'ai mis une procédure événementielle qui va capter dans sa variable E ce qui est saisit dans le comboBox.

    If AscW(e.KeyChar) = 13 Then Call Button1_Click(sender, e) ' validation zone texte par <Entrée>

    ** si la touche est <entrée> j'appelle la procédure bouton (voir ce qu'elle contient), ce qui permet de valider sans avoir à appuyer sur le bouton

     End Sub

    End Class

    ------------------

    Tiens, à ce lien il y a un didacticiel pas mal je trouve :

    ftp://ftp-developpez.com/plasserre/cours/vb-net/plasserre-vb-net2.pdf

    -------------------

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Proposé comme réponse EhJoe jeudi 28 octobre 2010 17:01
    • Modifié EhJoe jeudi 28 octobre 2010 17:10 Rajout
    jeudi 28 octobre 2010 16:59
  • Bonjour,

     

    Joe, merci pour cette réponse détaillée !

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    vendredi 29 octobre 2010 10:42
  • Bonjour,

    Comme ça c'est plus rapide mais ça marche aussi bien !:

    pour la sauvegarde:

        My.Settings.MyCombo = New Specialized.StringCollection<br/>
        My.Settings.MyCombo.AddRange(ComboBox1.Items.Cast(Of String)().ToArray())
    
    

    le chargement:

        If My.Settings.MyCombo IsNot Nothing Then
          ComboBox1.Items.AddRange(My.Settings.MyCombo.Cast(Of String)().ToArray())
        End If
    
    

    mardi 2 novembre 2010 15:26