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

VB.NET Discussion :

Synchronisation de position Dataview-Dataset


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 21
    Par défaut Synchronisation de position Dataview-Dataset
    Bonjour,
    J'ai un Dataview qui alimentent en données un Datagrid et quelques Textbox.
    Si je respecte le tri d'origine du Dataview (donc également Dataset), pas de problème, Edit et Delete se font correctement.
    Par contre, et uniquement sur les TextBox associés, si je clique sur un en-tête de colonne pour faire un tri différent, les modifications sont effectuées sur la ligne correspondante aux tri de départ.
    Ex : Si, après un tri manuel, je fais une modif sur les TextBox associés à l'avant-dernière ligne, la modif se fera, après l'update, sur les TextBox associés à l'avant-dernière ligne du tri d'origine.
    J'ai un évènement Validating sur ces TextBox qui crée certainement le problème mais je ne vois pas comment l'exprimer autrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Private Sub TbCode2_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TbCode2.Validating
            Try
                If TbCode2.TextLength = 0 Then
                    Me.DataSet31.Tables("Films").Rows(Me.BindingContext(DtvFilms).Position).Item("Code2") = DBNull.Value
                Else
                    Me.DataSet31.Tables("Films").Rows(Me.BindingContext(DtvFilms).Position).Item("Code2") = TbCode2.Text
                End If
            Catch Ex As Exception
                MessageBox.Show("Error: Code 2", "", MessageBoxButtons.OK, MessageBoxIcon.Stop)
            End Try
        End Sub
    Merci d'avance pour votre aide toujours très précieuse pour un vieux débutant...

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    pas tout compris
    mais au moment ou l'utilisateur change le tri, t'as ptete le temps de faire l'update ou de lancer la sub du validating tout simplement

    non ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 21
    Par défaut
    Bon, tu as raison, mon exposé manque de clarté et est incomplet.

    Ce qui me fait penser que le problème est lié à une absence de synchronisation de position entre le Dataview et le Dataset (Datagrid) est que cette anomalie est visible déjà avant l'Update.
    Je m'explique :
    1/ Je charge le Datagrid et les Textbox
    2/ Je modifie le tri en cliquant sur un autre en-tête de colonne que celui du tri d'origine
    3/ Je modifie le texte de Tbcode2 (Textbox lié) : enregistrement X (par exemple position : avant-dernière ligne dans la grille)
    4/ Je reviens au tri d'origine en cliquant sur l'en-tête de colonne correspondant
    5/ La modification s'est faite sur l'enregistrement Y qui correspond à la ligne qui à la même position dans la grille mais dans le tri d'origine ! Soit dans ce cas : l'avant-dernière ligne dans la grille

    Au moment de l'Update c'est la mauvaise ligne qui est modifiée.
    J'ai essayé bien entendu de lancer un évènement Click sur l'en-tête de colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HTI.Type = DataGrid1.HitTestType.ColumnHeader
    mais je n'ai sans doute pas trouvé la bonne instruction car rien n'y a fait, c'est toujours le même problème...

    J'ai été plus clair ? Merci de toute façon de t'intéresser à mon cas.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 374
    Par défaut
    Bonjour,
    Le tri du datagridview ne se fait pas dans la table du dataset mais dans une dataview sousjacente.
    Utilise un bindingsource pour lier le dataview et les textbox.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Dim WithEvents BS As BindingSource 
        Dim OBind As Binding     
        BS = New BindingSource
        BS.DataSource = Dataview
        DGV.DataSource = BS
    'lier les textbox
          OBind = New Binding("Text", Me.BS, "NomCol")
          TextBox.DataBindings.Add(OBind)
    De cette façon les textbox et le DGV sont synchronisés lors d'un tri
    Pour récupérer l'enregistrement courant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim DTARV As DataRowView
        DTARV = CType(BS.Current, DataRowView)
    Pour modifier les champs de l'enregistrement courant, modifie le DataRowview et BS.endEdit enregistre les modifs dans la table du dataset.
    Utilise les méthodes du bindingsource pour les mises à jour(.addnew, .canceledit, endedit ...).
    Bon boulot Jean

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 21
    Par défaut
    Merci pour ta réponse qui me parait parfaitement correspondre à la situation. J'essaye de mettre tout cela en pratique et je re-poste pour te tenir au courant.
    Une bonne soirée, Guy

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 21
    Par défaut
    Bonjour,
    J'avais omis de préciser que je travaille sous VB.Net 2003 (Framework 1.1), donc pas de BindingSource, j'essaye d'adapter avec BindingContext...

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 21
    Par défaut
    Bon c'était pas très compliqué, mais sans votre aide je serais toujours dans le brouillard.
    Code transformé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub TbCode2_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TbCode2.Validating
            Try
                Dim DTARV As DataRowView
                DTARV = CType(BindingContext(Me.DtvFilms).Current, DataRowView)
                If Me.TbCode2.TextLength = 0 Then
                    DTARV("Code2") = DBNull.Value
                Else
                    DTARV("Code2") = TbCode2.Text
                End If
            Catch Ex As Exception
                MessageBox.Show("Error: Code 2", "", MessageBoxButtons.OK, MessageBoxIcon.Stop)
            End Try
        End Sub
    Un grand merci.

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

Discussions similaires

  1. [C#] Positions d'Eléments triés d'un dataview
    Par mardoch dans le forum ASP.NET
    Réponses: 16
    Dernier message: 25/09/2011, 02h50
  2. [VB 2005] synchronisation Dataview
    Par Herlece dans le forum Windows Forms
    Réponses: 10
    Dernier message: 24/04/2007, 00h27
  3. [VB.Net] Comment récuperer un DataSet dans un DataView ?
    Par Ruddy dans le forum Accès aux données
    Réponses: 1
    Dernier message: 08/09/2006, 11h32
  4. Réponses: 2
    Dernier message: 02/05/2006, 22h09
  5. Réponses: 8
    Dernier message: 01/12/2005, 11h40

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