Synchroniser des DataGridView sur deux Applications

cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024 - 15 août 2022 à 12:06
Whismeril Messages postés 19097 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 juillet 2024 - 22 août 2022 à 07:35

Bonjour,

J'ai deux application qui ont presque des interfaces similaires, Les applications tourne sur deux PC différent.

Les deux applications ont en commun une DataGridView.

J'aimerais savoir si il est possible de les synchroniser pour qu'une modification sur l'un des PC répercute la modif sur le second PC.

Aujourd'hui mon Application fonctionne, j'ai crée un fichier commun avec le contenu de la DataGridView à chaque modif

et toutes les secondes mes deux applications vérifier si le fichier à changé et le cas échant recharge la DataGridView.

J'imaginais aussi une autres technique: mes deux applications pourraient s'envoyer les données via des Sockets à chaque mise à jour. ( je vais utiliser cette méthode qui me semble plus propre, vue que je n'utiliserais pas de timer).

Y a t-il une méthode plus pertinante pour ce cas de figure ?  

Au lieu du Fichier j'aurais pus travailer sur une base de donnée ? ce qui me dérange c'est l'utilisation d'un timer pour le rafraichissement.

 

Avez-vous des idées ? je cherche juste à perfectionner mes applications et rendre le code plus propres et

supprimer mes grosses rustines pas belle.

Cordialement,


3 réponses

Whismeril Messages postés 19097 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 juillet 2024 661
Modifié le 15 août 2022 à 12:24

Bonjour.

Si tu as peuplé "proprement" ton datagridview, c'est à dire grâce au binding (donc d'une collection d'instances d'une classe métier) alors tu serializes la collection à chaque modification et tu l'envoies par réseau (UDP, TCP, c'est toi qui voit en fonction de la sécurisation dont tu as besoin).

Chaque application, écoute son port réseau, déserialize la collection quand elle arrive et rebinde le datagridview.

Si tu n'as pas peuplé ton datagridview comme ça, et bien pour rendre ton code plus propre à mon avis c'est plus important que ton fichier et ton timer. Voir ici https://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource


cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024
15 août 2022 à 19:34

Whismeril, c'est la troixième fois que tu m'aides...
décidement ! et à chaque fois tu es de bon conseil.

Non je n'ai pas utilisé le Binding, je rempli directement les cells à la volé mais je vais étudier la solution Binding.

Pour l'échange de donnée via le TCP ou UDP, j'ai fais quelques appli qui s'échange des fichiers ou des trames.
pour ça je gère bien.

Encore merci, 

J'attend d'avancer sur le code, je mettrais mon code avant de mettre le sujet en résolue.

0
Whismeril Messages postés 19097 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 juillet 2024 661
15 août 2022 à 20:13

Malheureusement nous ne sommes plus nombreux à répondre.

Donc forcément, c'est régulièrement moi....


cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024
21 août 2022 à 20:41

Bonjour Whismeril,

J'ai pas mal bossé sur le binding, Malheureusement je trouve ta source trop compliqué pour mon niveau.

Du coup j'ai ce code dans un module

Module M_DGV_Data
    Friend MyDataGrid As New List(Of C_DGV_Data)
End Module
Public Class C_DGV_Data
    Private m_Id As Integer
    Private m_Nom As String
    Private m_Qte As Integer
    Private m_Valider As Boolean
    Private m_QteReelle As Integer

    <System.ComponentModel.DisplayName("Id")>
    Public Property Id() As Integer
        Get
            Return m_Id
        End Get
        Set(ByVal Value As Integer)
            m_Id = Value
        End Set
    End Property
    <System.ComponentModel.DisplayName("Produit(s)")>
    Public Property Nom() As String
        Get
            Return m_Nom
        End Get
        Set(ByVal value As String)
            m_Nom = value
        End Set
    End Property
    <System.ComponentModel.DisplayName("Qté")>
    Public Property Qte() As Integer
        Get
            Return m_Qte
        End Get
        Set(ByVal Value As Integer)
            m_Qte = Value
        End Set
    End Property
    <System.ComponentModel.DisplayName("Validation")>
    Public Property Valider() As Boolean
        Get
            Return m_Valider
        End Get
        Set(ByVal Value As Boolean)
            m_Valider = Value
        End Set
    End Property
    <System.ComponentModel.DisplayName("Qté" & vbCrLf & "Réelle")>
    Public Property QteReelleee() As Integer
        Get
            Return m_QteReelle
        End Get
        Set(ByVal Value As Integer)
            m_QteReelle = Value
        End Set
    End Property
    Public Sub New(ByVal N_id As Integer, ByVal N_nom As String, ByVal N_qte As Integer, ByVal N_Valider As Boolean, ByVal N_QteReelle As Integer)
        m_Id = N_id
        m_Nom = N_nom
        m_Qte = N_qte
        m_Valider = N_Valider
        m_QteReelle = N_QteReelle
    End Sub
End Class

Dans ma Form_Load, j'ai celui ci et il fonctionne, ma DataGridView contient bien les données

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal _
    e As System.EventArgs) Handles MyBase.Load
        MyDataGrid.Add(New C_DGV_Data("1", "Test 1", 6, True, 6))
        MyDataGrid.Add(New C_DGV_Data("2", "Test 2", 6, True, 6))
        CDGVDataBindingSource.DataSource = MyDataGrid
    End Sub

La ou ca ne fonctionne plus c'est quand j'essai d'ajouter des données dans ma collection et les afficher dans la DataGridView.
 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        MyDataGrid.Add(New C_DGV_Data("3", "Test 3", 6, False, 6))
        CDGVDataBindingSource.DataSource = MyDataGrid
    End Sub

La donnée que j'ajout en click sur button_1 ne se met pas a jour dans la DataGridView. je ne comprend pas pourquoi

Tu aurais une explication svp ?

0
Whismeril Messages postés 19097 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 juillet 2024 661
22 août 2022 à 07:35

Bonjour

Essaye

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        CDGVDataBindingSource.DataSource = Nothing
        MyDataGrid.Add(New C_DGV_Data("3", "Test 3", 6, False, 6))
        CDGVDataBindingSource.DataSource = MyDataGrid
End Sub

Même avec un bindingsource, le rafraîchissement quand un objet est ajouté, déplacé ou supprimé ne se fait pas bien. Ça marche beaucoup mieux en WPF
 


Après, j'ai l'impression que tu raisonnes "à l'envers" (ou alors tu veux faire du MVVM, mais faut pas en winform, ce n'est pas adapté)

L'idée est de créer un objet (et sa collection) qui permet de faire ton traitement et accessoirement l'afficher.

Par exemple, (j'imagine que ton logiciel sert à un grossiste), pout l'argumentaire) pour tes produits, tu pourrais avoir besoin de la masse et du volume pour choisir le moyen de transport d'une commande

  • quelques petites pièces légères => camionnette
  • Peu de volume, mais lourd => un petit camion avec un haillon et un transpalette 
  • Beaucoup de volume => un semi remorque et des moyens de levage

Mais dans la fenêtre d'inventaire, ce n'est pas utile de l'afficher.


Là tu as créé l'objet "juste" pour l'afficher dans ce Datagridview (et pas dans d'autres contrôles ni dans d'autres fenêtres) d'ailleurs c'est dans le nom de l'objet et de la collection.

Et ça donne l'impression que dans la fenêtre de commande, tu vas faire une autre collection d'un autre objet, alors que c'est la même donnée, ça devrait être une seule et même collection qui est juste passée en paramètre.

Je comprends parfaitement que ce sont des concepts difficiles à appréhender quand on est habitué à manipuler des données "unitaires".

Il faut prendre un peu de recul, et imaginer le vrai objet, le produit que te livre le fabriquant, que ton magasinier range, éventuellement que tes ouvriers modifient (il le peigne à tes couleurs on va dire) et enfin que tu envoies à un client, c'est toujours le même produit.

C'est pas une variable qui apparaît dans l'inventaire quand le magasinier vérifie que la quantité livrée est bonne puis disparaît. Puis une seconde variable qui apparaît dans le stock. Et puis que l'on clone le temps du passage à l'atelier de peinture (ben oui, même à l'atelier il est quand même dans le stock) et ha zut, maintenant qu'il est repeint, faut le mettre à jour dans le stock etc...

Non, c'est une seule instance du début à la fin, que l'on passe de collection en collection, il peut même être dans plusieurs en même temps (physiquement dans le stock et à l'atelier et affiché par Joel dans la fenêtre d'inventaire, par Patrick dans celle de l'atelier et par Jacques dans celle de la commande d'un client en préparation (avec une alerte peinture en cours) )


Rejoignez-nous