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 :

Remplir l'objets listview d'une form avec une dll


Sujet :

Windows Forms

  1. #1
    Jap
    Jap est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 78
    Points : 36
    Points
    36
    Par défaut Remplir l'objets listview d'une form avec une dll
    Bonjour,
    Le titre n'est pas très clair. Mais difficile d'expliquer ça en une phrase.

    J'ai une application avec une form principale. Celle-ci contient une listview qui est l'historique des actions.

    Ensuite une dll différente est appelé en fonction des différents modes utilisés.

    Ce que je voudrais faire lorsque j'appelle ma dll, c'est qu'elle mette des infos dans ma listview en temps réel.

    Ex : J'appelle ma dll :

    dll.trait

    dans ma function trait

    action 1
    -> je met à jour ma listview

    action 2
    -> je mets à jour ma listview

    ...

    Pour le moment je n'arrive à mettre à jour qu'en passant un message en paramètre byref et je le récupère donc en sortant de ma dll donc s'il y a plein d'actions, c'est pas top car pas d'infos pendant un moment.

    Si vous avez des idées je suis preneur.

    Merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 81
    Points : 55
    Points
    55
    Par défaut
    Salut !

    Si j'ai bien compris, tu veux "importer" les lignes d'une dll dans une listbox non ?

    essaye ça :

    Form1.ListBox1.Items.AddRange(System.IO.File.ReadAllLines(LeCheminDeTaDLL))
    Voilà !

    Xavier

  3. #3
    Jap
    Jap est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 78
    Points : 36
    Points
    36
    Par défaut
    En fait je voudrais plus un truc du genre

    MaDll.traitement(Byref form2.listview)

    dans ma dll je ferais des items.add (si c'est possible). Mais je voudrais que la listeview se rafraichisse au fur et à mesure même si la dll n'a pas fini sont traitement.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 81
    Points : 55
    Points
    55
    Par défaut
    Oula je suis désolé mais j'pense pas pouvoir t'aider plus loin
    Sinon si tu veus écrire une ligne de plus dans ta dll au lieu de tous enlever en écrivant une ligne, tu as juste a faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Variable
     
    Variable = New StreamWriter(TaDLL, True)
    variable.writeline(ceQueTuVEux, true)
    Variable.close
    Mais je ne pense pas que ce code te seras d'une grande utilitée...

    Encore désolé

    Xavier

  5. #5
    Jap
    Jap est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 78
    Points : 36
    Points
    36
    Par défaut
    Oui ce n'est pas vraiment ce que je voulais.

    Mais ne soit pas désolé merci pour tes réponses.

    Si quelqu'un d'autres (ou xav une autre idée) a une idée je suis preneur.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Salut,

    Je pense que tu prends le problème à l'envers... ce n'est pas ta DLL qui doit "remplir la ListView", mais ton programme qui doit obtenir de la DLL les informations pour remplir la ListView. La nuance peut paraitre insignifiante, mais en fait elle est très importante : dans le 2e cas, ta DLL n'a aucune connaissance de l'interface graphique.

    Il est très important de bien séparer le code "métier" du code de l'interface utilisateur. Prenons un exemple : tu as fini ton application, elle fonctionne, mais 2 ans plus tard ton patron te dit "Windows Forms, c'est démodé, je veux une application WPF (ou Silverlight, ou ASP.NET...)". Malheureusement, ta DLL contenant le code "métier" dépendent explicitement de Windows Forms, puisqu'elle prend en paramètre une ListView... tu seras donc obligé de la modifier. Alors que si la DLL se contente de fournir des données, indépendemment de l'interface graphique, il suffira de changer le programme principal, sans toucher aux DLL.

    D'une manière générale, il faut essayer de limiter au minimum les dépendances entre les différents modules de ton application : ça facilite la maintenance, les tests, la réutilisation des modules, et les évolutions futures.

  7. #7
    Jap
    Jap est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 78
    Points : 36
    Points
    36
    Par défaut
    Salut,

    Merci pour ta réponse. Je suis d'accord avec ce que tu me dis, mais je ne vois pas trop comment faire. Là actuellement ma dll renvoie un message une fois sont traitement terminé. Mais comment le faire au fur et à mesure du traitement.

    A+

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Jap Voir le message
    Mais comment le faire au fur et à mesure du traitement
    Tu veux dire, remplir la ListView au fur et à mesure du traitement ? effectivement ça complique un peu...
    La DLL pourrait effectuer le traitement dans un thread séparé, et déclencher un évènement pour indiquer qu'un nouvel élément est disponible. L'interface gèrerait cet évènement pour ajouter le nouvel élément à la ListView.

    Petit exemple simple avec un BackgroundWorker, en supposant que la fonction de la DLL renvoie une liste de personnes :

    Dans la DLL :
    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
    ' Définition des signatures d'évènements
    Public Delegate Sub NewPersonEventHandler(sender As Object, e As NewPersonEventArgs)
     
    Public Delegate Sub GetPersonsCompletedEventHandler(sender As Object, e As GetPersonsCompletedEventArgs)
     
     
    ' Définition des paramètres de l'évènement NewPerson
    Public Class NewPersonEventArgs
                Inherits EventArgs
     
        Public Sub New(p As Person)
            Me._person = p
        End Sub
     
        Private _person As Person
     
        Public ReadOnly Property Person() As Person
            Get
                Return _person
            End Get
        End Property
    End Class
     
    ' Définition des paramètres de l'évènement GetPersonsCompleted
    Public Class GetPersonsCompletedEventArgs
                Inherits EventArgs
     
        Public Sub New(lstPersons As IEnumerable(Of Person))
            Me._persons = New List(Of Person)(lstPersons)
        End Sub
     
        Private _persons As List(Of Person)
     
        Public ReadOnly Property Persons() As IList(Of Person)
            Get
                Return _persons
            End Get
        End Property
    End Class
     
    ' Code du traitement
    Public Class PersonsData
     
        Public Event NewPerson As NewPersonEventHandler
        Public Event GetPersonsCompleted As GetPersonsCompletedEventHandler
     
        Public Sub StartGetPersons()
            Dim bgw As New BackgroundWorker
            bgw.WorkerReportsProgress = True
            AddHandler bgw.DoWork, AddressOf bgw_DoWork
            AddHandler bgw.ProgressChanged, AddressOf bgw_ProgressChanged
            AddHandler bgw.RunWorkerCompleted, AddressOf bgw_RunWorkerCompleted
     
            bgw.RunWorkerAsync
        End Sub
     
        Private Sub bgw_DoWork(sender As Object, e As DoWorkEventArgs)
            Dim bgw As BackgroundWorker = DirectCast(sender, BackgroundWorker)
            Dim lst As New List(Of Person)
     
            ' Boucle de traitement
            For ...
                 Dim p As Person = ... ' Code pour récupérer ou créer la personne
     
                 lst.Add(p)
                 bgw.ProgressChanged(0, p)
            Next
     
            e.Result = lst
     
        End Sub
     
     
        Private Sub bgw_ProgressChanged(sender As Object, e As ProgressChangedEventArgs)
            Dim p As Person = DirectCast(e.UserState, Person)
            RaiseEvent NewPerson(Me, New NewPersonEventArgs(p))
        End Sub
     
        Private Sub bgw_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs)
            Dim lst As List(Of Person) = DirectCast(e.Result, List(Of Person))
            RaiseEvent GetPersonsCompleted(Me, New GetPersonsCompletedEventArgs(lst)
        End Sub
     
    End Class
    Dans le programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Sub buttonGetPersons_Click(sender As Object, e As EventArgs)
        Dim data As New DLL.PersonsData()
        AddHandler data.NewPerson, AddressOf data_NewPerson
        AddHandler data.GetPersonsCompleted, AddressOf data_GetPersonsCompleted
        data.StartGetPersons()
    End Sub
     
    Public Sub data_NewPerson(sender As Object, e As DLL.NewPersonEventArgs)
        listViewPersons.Items.Add(e.Person.Name)
    End Sub
     
    Public Sub data_GetPersonsCompleted(sender As Object, e As DLL.GetPersonsCompletedEventArgs)
        MessageBox(String.Format("Traitement terminé, {0} personnes récupérées", e.Persons.Count))
    End Sub
    La raison pour laquelle j'utilise un BackgroundWorker est qu'il permet de déclencher les évènements sur le thread qui a lancé le traitement, et non sur celui qui effectue le traitement. C'est important car l'interface graphique ne peut être modifiée que par le thread principal

  9. #9
    Jap
    Jap est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 78
    Points : 36
    Points
    36
    Par défaut
    Ok Merci pour ta réponse. ça complique sacrément mon problème.

    Je vais essayé ton code ce soir au calme pour bien comprendre.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Jap Voir le message
    ça complique sacrément mon problème.
    En fait c'est moins compliqué que ça en a l'air, c'est surtout du code de "plomberie" sans grande complexité...

  11. #11
    Jap
    Jap est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 78
    Points : 36
    Points
    36
    Par défaut
    Bon en fait le MaDll.traitement(Byref form2.listview) est possible j'ai réussi à le faire il manquait juste une référence à la windows form dans ma dll.

    Et même si je suis d'accord avec toi tomlev sur le fait que je ne devrais pas le faire, je vais le faire comme ça pour le moment. Pas le temps de chercher plus pour ce projet. Mais si j'ai un moment, je réessairais avec ton code.

    En tout cas merci pour vos réponses.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Jap Voir le message
    je vais le faire comme ça pour le moment
    Par expérience, je sais que les choses qu'on laisse comme ça "pour le moment" restent généralement comme ça très longtemps

    Mais bon, je comprends ton point de vue... on n'a malheureusement pas toujours le temps de faire les choses proprement

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. comment avoir une form avec une partie déroulante?
    Par Jayceblaster dans le forum Delphi
    Réponses: 5
    Dernier message: 21/05/2006, 18h54
  5. Réponses: 3
    Dernier message: 23/02/2006, 15h17

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