EventHandler dans une interface
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:
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:
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.