VB.NET - problème de string

Fermé
Chico95 - Modifié par Chico95 le 5/11/2010 à 11:12
 chico95 - 19 nov. 2010 à 09:08
Bonjour a tous,

Voila, j'ai un problème en vb.net avec les string et OpenFileDialog.

En Faite j'ai crée une collection(Liste) de classe contenant plusieurs string dans le constructeur, et quand je quitte l'appli, j'enregistre toutes les données de ma collection dans un document XML(Sérialisation)

Jusque là, je n'ai pas de soucis particulier. Je fais un Dim Liste as new List(of Class)

Pour résumer, ma classe contient : Le Nom | Le Chemin
Donc ma collection va contenir une liste de nom et de chemin

(Chemin = Chemin D'image)


Mon problème :

Je demande à l'utilisateur d'entrer une image via un OpenFileDialog (explorateur de disque dur). L'utilisateur choisit l'image et je récupère le chemin via : OpenFileDialog.FileName


Or quand j'insère le nom du chemin dans ma collection tout se passe normalement, mais quand je l'enregistre dans mon doc. XML, le chemin est inconnu, seul le nom s'insère correctement, et je ne trouve pas pourquoi.

J'ai donc fais plusieurs test, et je me suis dis que ça devait être un problème de type car quand je rentre le chemin à la main, il l'enregistre correctement.

Pourquoi OpenFileDialog.FileName n'est-il pas reconnu comme un string ?

Voila mon code :

Dim Chemin as New OpenFileDialog 
Dim MonFichier as string 

Chemin.ShowDialog() 
MonFichier = Chemin.FileName 

if MonFichier IsNot Nothing then 
        Me.txt_chemin.Text = MonFichier 
EndIf



Merci !!


27 réponses

Karosis Messages postés 13 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 18 novembre 2010
5 nov. 2010 à 15:56
Bonjour,

A mon avis essaye de caster ton chemin :
MonFichier = Chemin.FileName  as string
0
Bonjour karosis et merci de ta réponse,

Concernant le cast, j'ai deja tout essayé et sa ne marche pas.
Mais je me suis rendu compte que c'était non pas un problème sur le fileName mais un problème de sérialisation de chez microsoft.

Je ne comprends pas pourquoi la sérialisation marche pour le nom en string mais pas pour le chemin en string.
0
Karosis Messages postés 13 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 18 novembre 2010
8 nov. 2010 à 09:02
Vérifie en pas à pas à quel moment il délaisse le chemin pour ne prendre que le nom car j'ai testé et sans sérialisation le chemin est correct.
Et suivant ta version attention au "\" qui peut être pris pour un caractère d'échapement, à mon avis ça peut venir de là.
0
Après vérification en pas a pas je me suis rendu compte que c'était bien au niveau de la sérialisation qu'il y a un problème.

Mais lorsque je rentre le chemin à la main sans passer par OpenFileDialog ça marche correctement.

J'ai testé le nom en mettant des caractères spéciaux pour voir si ce n'était pas la cause du problème, mais apparemment non.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Karosis Messages postés 13 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 18 novembre 2010
8 nov. 2010 à 14:10
Mets-moi ton code complet avec la ligne qui, en pas à pas, change ton chemin d'accès que je puisse tester.
0
Voila le code de la sérialisation. Pour tout le reste c'est hyper long.
Mais dans le debuger c'est ici que ça merde :

Le pas a pas m'indique bien que dans _ListeContact j'ai une partie chemin avec "C:\chemin...\image.png" de type string

Private Sub Serialisation()
        Try
            'On crée le fichier et récupère ses données
            Dim Fichier As FileStream = File.Create("bibliotequeContact.xml")
            Dim Serialiseur As New XmlSerializer(GetType(List(Of Contact)))

            'Enregistrement et écriture
            Serialiseur.Serialize(Fichier, _ListeContact)
            'Fermeture du fichier
            Fichier.Close()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
8 nov. 2010 à 14:43
Bonjour,
Peut-être avec...
    MonFichier = Chemin.FileName.ToString

A+
0
Bonjour,

Je viens d'essayer, et non cela ne change rien.
Je ne pense pas que ce soit un réel problème de string en faite.

Je pense vraiment que le OpenFileDialog et la sérialisation ne s'entendent pas. Car quand je rentre le chemin à la main, cela marche, mais si je passe par OpenFileDialog, sa bug...
0
Si vraiment ça marche pas, je pourrais essayé de remplacer ma sérialisation et mon fichier XML par une bdd qui tourne derrière, mais je ne sais vraiment pas comment faire.

Cela est-il plus judicieux ?

Merci
0
Karosis Messages postés 13 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 18 novembre 2010
8 nov. 2010 à 15:14
A mon avis cela doit venir de ta façon de remplir ta liste "_ListeContact". Merci de m'indiquer de quel manière tu la remplie.
0
_ListeContact est une liste de la classe Contact :

Voici le code :

Private _ListeContact As List(Of Contact) 

Public Property ListeContact As List(Of Contact) 
        Get 
            Return _ListeContact 
        End Get 
        Set(ByVal value As List(Of Contact)) 
            _ListeContact = value 
        End Set 
    End Property


Ma classe contact est comme sa (dsl c'est un peu long):

 
Dim chemin as string...

Public Sub New(ByVal surnom As String, ByVal chemin As String, ByVal nom As String, ByVal prenom As String, ByVal DateNaissance As Date, ByVal groupe As String, ByVal adresse As String, ByVal ville As String, ByVal fixe As String, ByVal port As String, ByVal pro As String, ByVal mail As String) 
        _surnom = surnom 
        _chemin = chemin 
        _nom = nom 
        _prenom = prenom 
        _dateNaissance = DateNaissance 
        _groupe = groupe 
        _adresse = adresse 
        _ville = ville 
        _mail = mail 
        _fixe = fixe 
        _port = port 
        _pro = pro 
    End Sub
0
Karosis Messages postés 13 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 18 novembre 2010
8 nov. 2010 à 16:08
Désolé on s'est pas compris, comment passe tu le chemin d'accès à l'attribut "chemin" d'une liste "_ListeContact".
Passe-tu par un string tampon ou le lui passe-tu directement ?

Si c'est dans ce dernier cas essaye de créer un string auquel tu passera le chemin pour ensuite passer ce string dans ton contact.

Parfois une interaction directe bug, mais le fait d'utiliser un paramètre tampon peut régler bien des problèmes.
0
a oui dsl j'avais pas compris.

Ba je passais par un label.text tampon, mais je vais essayer avec un string tampon.

Voila le code que j'avais :

FichierSelect = Chemin.FileName
        If FichierSelect IsNot Nothing Then
            Me.lbl_chemin.Text = FichierSelect
            Me.lbl_chemin.Text = CStr(Me.lbl_chemin.Text)
        End If

        Me.txt_chemin.Text = Me.lbl_chemin.Text


Et quand j'update ma liste, je lui récupère la valeur de ma textBox qui contient le chemin.
0
Nop, ça ne marche toujours pas...

Sinon le mieux pour contourner ce problème serait peut-être de passer par une BDD ou de supprimer mon image tout simplement.

Mais je ne comprends pas pourquoi c'est le OpenFileDialog qui me pose tant de problèmes.
0
Karosis Messages postés 13 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 18 novembre 2010
8 nov. 2010 à 17:02
Honnêtement je suis perplexe, j'ai tester et le OpenFileDialog.FileName fonctionne très bien avec un textbox et une liste, voici mon code avec un test tout bête au cas où tu vois quelque chose :

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim chemin As New OpenFileDialog
        Dim fichier As String

        chemin.ShowDialog()
        fichier = chemin.FileName

        Me.TextBox1.Text = fichier

    End Sub
Private Sub TextBox1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDoubleClick
        Dim maliste As New List(Of String)

        maliste.Add(TextBox1.Text)
        MessageBox.Show(maliste.Item(0).ToString())

    End Sub


Sinon, tu peux toujours tester comme tu le dis sur une base Access mais je ne pense pas que la sérialisation ou le openfiledialog y sois pour quelque chose, à moins que ta version de logiciel ait un bug :/
0
ba en faite ce que tu as fais marche correctement.

Mais chez moi aussi ça marche, le chemin est bien ajouté dans ma liste et apparait correctement !

Sauf que quand je ferme et je ré-ouvre l'appli, le chemin n'apparait plus du tout dans la liste.

Peux-tu essayé de sérialiser ta liste et de me dire si ton chemin passe. Si tel est le cas, je pense que je dois avoir un problème avec VS2010.

J'ai même extrait ma liste vers excel et le chemin s'affiche correctement comme un string, c'est donc pas un problème à ce niveau là je pense.

En tout cas merci beaucoup pour ton aide !
0
Karosis Messages postés 13 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 18 novembre 2010
9 nov. 2010 à 15:44
Désolé d'avoir mis du temps à répondre mais j'avais pas trop eu le temps de tester.

J'ai donc tout recréé en C# (j'y suis plus à l'aise qu'en VB) peu importe le langage vue que le framework est le même.

ça marche sans problème voici mon fichier xml :

   <?xml version="1.0" ?> 
  <string>C:\Documents and Settings\All Users\test.jpg</string>  


voici mon code :

XmlSerializer xmls = new XmlSerializer(typeof(string));
            FileStream fichier = new FileStream(@"C:\test.xml", FileMode.CreateNew);

            OpenFileDialog ofd = new OpenFileDialog();
            ofd.ShowDialog();
            string test = ofd.FileName.ToString();

            textBox1.Text = test;

            List<string> liste = new List<string>();

            liste.Add(textBox1.Text);

            xmls.Serialize(fichier, liste[0]);


A tout moment mon string reste inchangé.

Si tu comprend pas trop le C#, dis moi le et je te traduirai, mais normalement ça se lit plutôt bien.
0
C'est vrai que ça se ressemble beaucoup donc j'arrive a peu près à comprendre.

Juste une question, c'est quoi le @ devant le chemin ??

Toi tu as une liste de string, moi j'ai une liste de classe, à ton avis ça change beaucoup sachant que dans ma classe il y a des string et des dates... ?

Merci
0
Karosis Messages postés 13 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 18 novembre 2010
10 nov. 2010 à 11:21
le "@" mis devant un string permet de ne pas faire cas des "\" dans le chemin, c'est le terme .NET pour indiquer que le string est une adresse.

Je ne pense pas que le fait d'avoir une liste de classe joue un rôle si ton champ "image" est bien un string.
0
Deja merci pour ton aide et pour tes réponses.

Si je tente de mettre un @ devant mon chemin, à ton avis ça pourrait marcher ?
0