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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[vb.net] probleme de construction de chaine dynamiquement


Sujet :

Windows Forms

  1. #1
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut [vb.net] probleme de construction de chaine dynamiquement
    Bonjour,

    Framework : 2.0
    IDE : VBExpress


    But
    construire une chaine dynamiquement en fonction des valeurs stockées dans une base de données.

    Schéma SQL Simplifié

    - Table [Fields] (FieldId, FieldName)

    - Table [ConstraintMessages] (ConstraintMessageId, Message)

    - Table [ConstraintMessageFields] (ConstraintMessageId, FieldId, FieldPosition)

    Le Principe

    Une listbox contient la liste de tous les enregistrement de la table [Fields]. L'utilisateur peut glisser-déposer des 'Fieldname' depuis cette listbox vers une textbox. Une fois dans la textbox, un Fieldname est entouré par des [ ] de maniere a identifier qu'il s'agit d'un Field. L'utilisateur peut également éditer la textbox pour compléter ce qui sera enregistré comme un 'ConstraintMessage'.

    Je parcours le texte de la textbox, si je rencontre un Field je stocke sa position ainsi que le FieldId dans la table [ConstraintMessageFields] et je stocke le reste de la chaine dans le champs Message de [ConstraintMessage].
    De maniere a etre sure que l'utilisateur n'a pas édité un FieldName entre les [ ] j'ai une méthode qui vérifie que ce FieldName existe bien.

    Mon Probleme
    Je n'arrive pas a écrire l'algorithme permettant de sauvegarder le ConstraintMessage ainsi que les fields.

    Attention à la subtilité ! : Au moment de reconstruire le ConstraintMessage, un enregistrement de [Fields] a pu etre modifié (le fieldname a changé) ou meme supprimé par l'adminstrateur SQLServeur.

    Exemple de ConstraintMessage

    Un [Field1] Message [Field2]

    La table [Fields] contient:

    FieldId = 1
    FieldName = "Field1"

    FieldId = 2
    FieldName = "Field2


    La table [ConstraintMessages] contient:

    ConstraintMessageId = 1
    ConstraintMessage ="Un Message "


    La table [ConstraintMessagesFields] contient:

    ConstraintMessageId = 1
    FieldId = 1
    FieldPosition = 3

    ConstraintMessageId = 1
    FieldId = 2
    FieldPosition = 12

    Pouvez vous m'aider? N'hésitez pas a me demander plus d'explications si ce n'est pas clair

    Merci

  2. #2
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    Je pense avoir l'algo de sauvegarde du ConstraintMessage. En tout cas les valeurs dans mes tables sont correctes, et j'ai essayé plusieurs cas et ca fonctionne.

    Par contre pour reconstruire les ConstraintMessage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    Private Sub Save()
           Dim FieldName As String = txtFieldName.Text
     
            m_final = New StringBuilder
     
            For iCntr As Integer = 0 To FieldName.Length - 1
                'any character different from [ 
                If Not (FieldName.Chars(iCntr).Equals("["c)) Then
                    m_final.Append(FieldName.Chars(iCntr))
                Else
                    Dim str As String = FieldName.Substring(iCntr + 1)
                    Dim Field As String = ""
                    If FindField(str, Field, iCntr) Then
                        FieldName = FieldName.Remove(iCntr, Field.Length + 1)
                    Else
                        m_final.Append(FieldName.Chars(iCntr))
                    End If
                End If
                If iCntr >= FieldName.Length - 1 Then Exit For
            Next
     
            If m_tokenFields.Save(m_final.ToString, m_fieldId, m_fieldsDic) Then
                Me.DialogResult = Windows.Forms.DialogResult.OK
            End If
        End Sub
     
        Private Function FindField(ByVal str As String, ByRef Field As String, ByVal pos As Integer) As Boolean
            Dim jcntr As Integer
     
            Do Until jcntr = str.Length
                If str.Chars(jcntr).Equals("["c) Then
                    Return False
                ElseIf str.Chars(jcntr).Equals("]"c) Then
                    Dim fieldId As Integer = m_tokenFields.ChkFieldExists(Field, m_QueryId)
                    If fieldId = -1 Then
                        'field does not exsit so save as text
                        Return False
                    Else
                        'add field to the collection of fields in the message
                        m_fieldsDic.Add(pos, fieldId)
                        Return True
                    End If
                Else
                    'save as field
                    Field = Field & str.Chars(jcntr).ToString
                End If
                jcntr += 1
                If jcntr = str.Length Then
                    Return False
                End If
            Loop
        End Function

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 43
    Points : 37
    Points
    37
    Par défaut
    En fait ton probleme c'est de replacer tes fields dans ta chaine à partir de la BD ?

    Comme tu sauvegardes les positions et que la longueur de tes fields peut avoir changer commence par ajouter le dernier field, puis l'avant dernier et ainsi de suite jusqu'au premier avec une fonction de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string message = message.Insert(Field2);
    [/code]

  4. #4
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    Merci pour ta réponse.
    Je ne sais pas si ca marcherait car un ConstraintMessage ne se termine pas forcément par un field (meme si c'était le cas dans l'exemple que j'ai donné).
    Voici l'algo de reconstruction que j'ai trouvé. Je pense qu'il est correct. J'ai pas mal testé et ca a l'air de fonctionner. Mais je le trouve assez laid...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
            Dim pk(0) As DataColumn
            Dim row As DataRow
            Dim icntr As Integer = 0
            Dim jCntr As Integer = 0
            Dim bLoop As Boolean = True
     
            pk(0) = dt.Columns("FieldPosition")
            dt.PrimaryKey = pk
     
            Do While bLoop
                row = dt.Rows.Find(icntr)
                If row IsNot Nothing Then
                    NewFieldName.Append("[" & row("FieldName").ToString & "]")
                ElseIf jCntr <= FieldName.Length - 1 Then
                    NewFieldName.Append(FieldName.Chars(jCntr))
                    jCntr += 1
                Else
                    bLoop = False
                End If
                icntr += 1
            Loop

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 43
    Points : 37
    Points
    37
    Par défaut
    Arf j'ai du mal avec le VB désolé.

    Bah j'ai pas du comprendre ce que tu voulais faire alors. La méthode que je t'ai proposée marche meme si tu n'as pas de Field à la fin.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VB NET Probleme de format de chaine d'entrée
    Par floriaan60 dans le forum Windows Forms
    Réponses: 13
    Dernier message: 29/05/2008, 15h56
  2. Réponses: 1
    Dernier message: 31/03/2005, 15h32
  3. [VB.Net] Probleme avec dialogues (confirm et alert)
    Par crackity_jones666 dans le forum ASP.NET
    Réponses: 5
    Dernier message: 26/11/2003, 22h05
  4. [jAPI]Probleme de construction
    Par exe dans le forum C++Builder
    Réponses: 10
    Dernier message: 07/08/2003, 10h03
  5. [VB.Net] Comment generer une page html dynamiquement ?
    Par Anonymous dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/03/2003, 10h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo