Bonjour,

Je m'arrache les cheveux sur quelque chose que je pensais simple à l'origine. J'utilise une interface pour définir l'ensemble des méthodes/fonctions que doit définir un Plugin.

IPlugin :
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
 
using System;
using System.Data;
//using System.Collections.Generic;
using System.Windows;
 
namespace test.PluginInterface
{
    public interface IPlugin
    {
        event EventHandler<ValidParametersEventArgs> OnParametersChanged;
        string Traitement();
        void Refresh();
        string getName();
        System.Windows.Forms.UserControl VisualComponent();
 
    }
 
    public class ValidParametersEventArgs : EventArgs
    {
        private bool validParameters = false;
 
        public ValidParametersEventArgs(bool validParameters)
        {
            if (validParameters == null) throw new NullReferenceException();
            this.validParameters = validParameters;
        }
 
        public Boolean ValidParameters
        {
            get { return this.validParameters; }
        }
    }
}
Je souhaiterais imposer que toute classe répondant à la définition de cette interface implémente un événement "OnParametersChanged" qui permettrait de savoir si les valeurs renseignées dans mes différents éléments winforms (un DateTimePicker, un Label, ... n'importe quoi) sont cohérentes entre elles. Pour ça j'ai créé un EventArgs perso pour mon événement qui renvoie juste un booléen pour me dire si oui ou non les données renseignées sont cohérentes. Cette analyse sera faite dans le code du Plugin.

Cela me servira à rendre actif/inactif un bouton (qui lui est conçut en dehors du plugin).

Mais il m'est impossible de compiler !!!!! J'ai essayé des modifications dans tous les sens, car à la fin, je n'y comprenais plus rien.

Pour info, j'ai consulté ça (qui m'a bien aidé) :
http://geekswithblogs.net/technetbyt...10.aspx#390040

... et quand j'applique exactement la même méthode, j'ai un message me disant que je n'implémente pas le membre d'interface OnParametersChanged.

Je tiens aussi à préciser que j'arrive à compiler si je n'utilise pas le type précis de mon EventArgs perso. Bref, les problèmes ont commencé quand j'ai voulu utiliser autre chose que le EventArgs par défaut que gère un EventHandler.

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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
 
using System;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using test.PluginInterface;
 
namespace test
{
    //public delegate void ValidParametersEventHandler(object sender, ValidParametersEventArgs e);
    public delegate void EventHandler<ValidParametersEventArgs>(object sender, ValidParametersEventArgs e);
 
    public class Req1 : System.Windows.Forms.UserControl, IPlugin
    {
        private System.ComponentModel.Container components = null;
        private System.Windows.Forms.DataGridView DGV_res;
        private System.Windows.Forms.Panel PNL_bottom;
        private System.Windows.Forms.Label LBL_EndDate;
        private System.Windows.Forms.DateTimePicker DTP_startDate;
        private System.Windows.Forms.Label LBL_StartDate;
        private System.Windows.Forms.DateTimePicker DTP_endDate;
        private Label LBL_Description;
        private System.Windows.Forms.GroupBox GB_RangePeriod;
 
        public event EventHandler<ValidParametersEventArgs> ParametersChangedEvent;
        public event EventHandler<ValidParametersEventArgs> ParametersChanged
        {
            add
            {
                if (ParametersChangedEvent != null)
                {
                    lock (ParametersChangedEvent)
                    {
                        ParametersChangedEvent += value;
                    }
                }
                else
                {
                    //ParametersChangedEvent = new EventHandler(value);
                    ParametersChangedEvent = new EventHandler<ValidParametersEventArgs>(value);
                }
            }
            remove
            {
                if (ParametersChangedEvent != null)
                {
                    lock (ParametersChangedEvent)
                    {
                        ParametersChangedEvent -= value;
                    }
                }
            }
        }
 
        protected virtual EventHandler<ValidParametersEventArgs> OnParametersChanged(ValidParametersEventArgs e)
        //protected void OnParametersChanged(EventArgs e)
        {
            if (OnParametersChanged != null)
                OnParametersChanged(this, e);
        }
 
 
 
        // Constructeur : Initilialise la partie visuelle du composant
        public Req1()
		{
			InitializeComponent();
            DTP_startDate.Value = new DateTime(DateTime.Today.Year, DateTime.Today.Month - 1, 1);
            DTP_endDate.Value = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddDays(-1);
		}
 
        // Destructeur
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
        }        
 
        private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Req1));
        (...)
        }
 
        // Fonction de traitement
        // ne retourne rien pour l'instant
        public string Traitement()
        {
            return "Traitement de" + this.getName();
        }
 
        public string getName()
        {
            return ("Req1");
        }
 
        // Permet de récupérer le contrôle utilisateur qui est la classe d'où
        // le return this.
        public System.Windows.Forms.UserControl VisualComponent()
        {
            return this;
        }
 
        private void DTP_startDate_ValueChanged(object sender, EventArgs e)
        {
            partialRefresh();
        }
 
        private void DTP_endDate_ValueChanged(object sender, EventArgs e)
        {
            partialRefresh();
        }
 
        private void partialRefresh()
        {
            (...)
            /*ValidParametersEventArgs evArgs = new ValidParametersEventArgs(DTP_startDate.Value.CompareTo(DTP_endDate.Value) <= 0 && DTP_startDate.Value.CompareTo(DateTime.Now) <= 0);
            if (evArgs != null)
                OnParametersChanged(evArgs);*/
 
            EventHandler handler = ParametersChangedEvent;
            if (handler != null)
            {
                ValidParametersEventArgs evArgs = new ValidParametersEventArgs(DTP_startDate.Value.CompareTo(DTP_endDate.Value) <= 0 && DTP_startDate.Value.CompareTo(DateTime.Now) <= 0);
                handler(this, evArgs);
            }
        }
    }
}
Quelqu'un aurait-il une idée de ce qui cloche ??? Merci d'avance.