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 :

Datagridview : mettre à jour la source de données


Sujet :

VB.NET

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut Datagridview : mettre à jour la source de données
    Bonjour,

    J'ai un souci dont je ne comprends pas la cause.

    J'ai sur mon formulaire un contrôle datagridview dont je me sers pour afficher une liste d'objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        Dim partie As Partie
        Dim parties As Parties
        Private Sub tpPartie_Enter(sender As System.Object, e As System.EventArgs) Handles tpPartie.Enter
            parties = DAL_Partie.GetAllParties
            dgvPartie.DataSource = parties
        End Sub
    N.B. : tp pour TabPage

    Et voici la classe :

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    Public Class Parties
        Inherits List(Of Partie)
     
        Public Overloads Function Find(ByVal id As Integer) As Partie
            For Each elem As Partie In Me
                If elem.Id = id Then
                    Return elem
                End If
            Next
            Return Nothing
        End Function
    End Class
     
    Public Class Partie
        Implements IComparable(Of Partie)
        Protected Function CompareTo(ByVal other As Partie) As Integer _
          Implements IComparable(Of Partie).CompareTo
            If TypeOf other Is Partie Then
                Dim temp As Partie = CType(other, Partie)
                Return Me.ordre.CompareTo(temp.Ordre)
            End If
     
            Throw New ArgumentException("L'objet n'est pas un Document")
        End Function
     
        Private _id As Integer
        Public Property Id As Integer
            Set(value As Integer)
                _id = value
                Me.Status = e_status.Updated
            End Set
            Get
                Return _id
            End Get
        End Property
     
        Private _ordre As Integer
        Public Property Ordre As Integer
            Set(value As Integer)
                _ordre = value
                Me.Status = e_status.Updated
            End Set
            Get
                Return _ordre
            End Get
        End Property
     
        Private _textes As Textes
        Public Property Textes As Textes
            Set(value As Textes)
                _textes = value
                Me.Status = e_status.Updated
            End Set
            Get
                Return _textes
            End Get
        End Property
     
        Public Property Status As e_status
        Public Enum e_status As Integer
            UpToDate = 1
            Created = 2
            Updated = 3
        End Enum
     
     
        Public Sub New(ByVal id As Integer, ByVal ordre As Integer, ByVal textes As Textes) 'ByVal nom As String
            Me.Id = id
            Me.Ordre = ordre
            Me.Textes = textes
            Me.Status = e_status.UpToDate
        End Sub
     
        Public Sub New(ByVal ordre As Integer, ByVal textes As Textes) 'ByVal nom As String
            Me.Ordre = ordre
            Me.Textes = textes
            Me.Id = 0
            Me.Status = e_status.Created
        End Sub
     
    End Class
    Lors de l'ouverture du formulaire et de l'affichage du tabpage, pas de souci, le datagridview se remplit bien comme il le doit.

    Par contre, quand j'ajoute une nouvelle partie à la liste, le datagridview ne se mets pas à jour...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Dim newPartie As New Partie(les paramètres qui vont bien)
            parties.Add(newPartie)
            parties.Sort()
     
            dgvPartie.DataSource = parties
            dgvPartie.Refresh()
    J'ai bien sûr vérifier en mode débug et l'objet est bien ajouté à la liste. Le problème se situe uniquement au niveau de l'affichage.

    Quelqu'un aurait un indice svp. ?

    Merci d'avance.

    Griftou.

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    bonjour griftou
    Pour un class perso utilise comme source de donne il doit posseder une notification de changement de valeur de prop lorsqu'il est binde à un control faute de quoi la maj n'est pas repercute sur le controle.....

    il faut implementer la notification dans ton custom data source(le class).....
    code exemple:
    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
     
    'Each property that must notify a bound control of a change must expose an 
    'event using the following naming convention:
     
    'Public Event <propertyName>Changed As EventHandler
     
    'When firing, the data source object passes itself as the sender of the event:
    'par Chris Seller gourou microsoft.......
     
     
     
    Class NameAndNumber
      ' For bound controls
      Public Event NameChanged As EventHandler
      Public Property Name() As String
          Get
              Return myName
          End Get
          Set
              myName = Value
              ' Notify bound control of changes
              RaiseEvent NameChanged(Me, EventArgs.Empty)
          End Set
      End Property
      End Class
     
    'Now, when the data source object's properties are changed, bound controls
     'are automatically updated....................
    bon code................

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Merci Mabrouki.

    Je comprends la logique derrière ce que tu expliques mais ce que je ne comprends pas alors, c'est pourquoi lorsque je modifie un objet qui est déjà présent dans la liste, le datagridview se met correctement à jour.

    Il n'y a pourtant pas non plus d'évènement....

    Pourquoi cela fonctionne-t-il dans ce cas là ?

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    bonjour griftou
    En fait tu as raison .A cause de mr Bindingsource à l'oeuvre en sous-main
    Le mecanisme de notification peut implemente mieux encore par le custom datasource par INotifyPropertyChanged(mieux que onpropertychanged).
    Quand tu ajoutes un element à liste celui qui s'oppose à ce que datagridgridview affiche la maj c'est mr Bindingsource car il gere implicitement et uniquement la partie de la liste binde initialement....................et n'autorise pas les ajout.

    Sauf si tu lie la liste a datagridview exeplicitement en autorisant les ajouts.....avec event AddingNew de mr Bindingsource comme le montre cet exemple:
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    Imports System.ComponentModel
     
    Public Class Form4
    	Private lstPerso As List(Of Perso)
    	Private WithEvents bdSourceList As BindingSource
    	Public Sub New()
     
    		' Cet appel est requis par le Concepteur Windows Form.
    		InitializeComponent()
     
    		' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
    		'initialise liste et bindindinsource
    		lstPerso = New List(Of Perso)
    		bdSourceList = New BindingSource
    		'autorise l'ajout de nouveau element
    		bdSourceList.AllowNew = True
    	End Sub
    	Private Sub btnPopulate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPopulate.Click
    		Dim p As Perso
    		For i As Integer = 0 To 9
    			p = New Perso
    			p.Name = "item" & (i + 1).ToString
    			Dim dt As Date = DateAdd(DateInterval.Day, -5, Date.Now)
    			p.DateNaissance = dt
    			lstPerso.Add(p)
     
    		Next
    		bdSourceList.DataSource = lstPerso
    		Me.DataGridView1.DataSource = bdSourceList
    	End Sub
     
    	Private Sub btnAddItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddItem.Click
    		' Get the BindingManagerBase for the list.
    		If lstPerso Is Nothing Or lstPerso.Count = 0 Then Return
    		Me.bdSourceList.AddNew()
    	End Sub
     
    	Private Sub changeItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles changeItem.Click
    		' Get the BindingManagerBase for the list.
    		If lstPerso Is Nothing Or lstPerso.Count = 0 Then Return
    		Dim p As Perso = Me.bdSourceList.Current
    		p.Name = "Hello"
    		p.DateNaissance = Date.Today
     
     
     
    	End Sub
     
    	Private Sub bdSourceList_AddingNew(ByVal sender As Object, ByVal e As System.ComponentModel.AddingNewEventArgs) Handles bdSourceList.AddingNew
    		e.NewObject = New Perso
     
    	End Sub
    End Class
    Public Class Perso
    	Implements INotifyPropertyChanged
    	Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    	Private Sub NotifyPropertyChanged(ByVal info As String)
    		RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
    	End Sub
     
    	Private m_name As String
    	Public Property Name() As String
    		Get
    			Return m_name
    		End Get
    		Set(ByVal value As String)
    			m_name = value
    			NotifyPropertyChanged("Name")
    		End Set
    	End Property
     
     
    	Private m_DateNaissance As Date
    	Public Property DateNaissance() As Date
    		Get
    			Return m_DateNaissance
    		End Get
    		Set(ByVal value As Date)
    			m_DateNaissance = value
    			NotifyPropertyChanged("DateNaissance")
    		End Set
    	End Property
     
    End Class
    bon code..............

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Oki doki ! Merci bien !

    Je suis en congé maladie là (une trachéite comme cadeau d'annif '-_-) mais je teste ça dès que je retourne au boulot (voir p-e avant en vpn ^^)

  6. #6
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Bonjour,

    De retour de maladie, je veux tester la solution proposée par Mabrouki mais j'ai un souci...

    On dirait que mon VS2010 ne reconnait pas INotifyPropertyChanged...

    Je reçois une erreur qui me dit que ce n'est pas défini.

    Y a-t-il une référence à ajouter au projet ?

    EDIT : Ok j'ai trouvé ! C'est dans le namespace ComponentModel

    EDIT 2 : Ca fonctionne bien. Encore merci !!!

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

Discussions similaires

  1. [Débutant] Mettre à jour la base de données depuis dataGridView
    Par Elaich dans le forum C#
    Réponses: 4
    Dernier message: 15/02/2012, 12h03
  2. Réponses: 2
    Dernier message: 26/03/2010, 20h07
  3. Mettre à jour ma base de données depuis un DataGridview
    Par The-msx dans le forum Windows Forms
    Réponses: 3
    Dernier message: 13/07/2009, 10h52
  4. Réponses: 2
    Dernier message: 15/01/2009, 11h21
  5. [SQL SERVER] Mettre à jour une base de donnée
    Par grellierj dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/05/2006, 11h33

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