2017-05-12 1 views
-1

Ich habe ein dynamisches create button-Objekt, wo ich möchte, dass ein Ereignis an das mainform gesendet wird, wenn ich auf eine Schaltfläche in diesem Objekt klicke.Dynamisch erzeugtes Ereignis in C#

Ich habe den Code wie folgt:

class Class1 
{ 
    internal class FObj_BtnRow 
    { 
     private Button[] _Btnmembers; 
     internal event EventHandler<SelValue_EArgs>[] e_BtnMember; //subscribe to a change 

     internal class SelValue_EArgs : EventArgs//events args (selected value) 
     {//return arguments in events 
      internal SelValue_EArgs(Boolean ivalue) { refreshed = ivalue; }//ctor 
      internal Boolean refreshed { get; set; }//accessors 
     } 
     private Boolean[] _ActONOFFValue; //Pump=0, valveInput = 1, Shower = 3, Washtool = 4 , WashWPcs = 5 
     private Boolean ActONOFFValue(int number) 
     { 
      _ActONOFFValue[number] = !_ActONOFFValue[number]; 
      { 
       if (e_BtnMember[number] != null && number == 0) e_BtnMember[number](this, new SelValue_EArgs(_ActONOFFValue[number])); 
      } 
      return _ActONOFFValue[number]; 
     } 
     public FObj_BtnRow(String[] TxtBtn, String UnitName)//ctor 
     { 
      _Btnmembers = new Button[TxtBtn.Length]; 
      e_BtnMember = new EventHandler<SelValue_EArgs>[TxtBtn.Length]; 
      for (int i = 0; i < TxtBtn.Length/2; i++) 
      { 
       _Btnmembers[i].Click += new EventHandler(_Btnmembers_Click); 
      } 
     } 
     protected virtual void _Btnmembers_Click(object sender, EventArgs e) 
     { 
      int index = Array.IndexOf(_Btnmembers, (Button)sender); 
      ActONOFFValue(index); 
     } 

    } 

} 

Aber in der Linie: internal event Eventhandler [] e_BtnMember; der Compiler sagte mir, dass ich einen Delegierten verwenden sollte. Ich verstehe diese Bemerkung nicht gut, könntest du mir helfen? Am Ende sollte das Mainform nur die Ereignisschaltfläche abonnieren klicken Sie darauf.

Und dann in Haupt könnten wir es jetzt in der Zeile Objekt Mehrtasten, wenn eine Taste verwenden, wird ... wie diese angeklickt:

public void main() 
{ 
String[] txtbtn = new String[] { "btn1", "btn2", "btn3" }; 
FObj_BtnRow thisbtnrow = new FObj_BtnRow(txtbtn); 
thisbtnrow.e_BtnMember[0] += new EventHandler<FObj_BtnRow.SelValue_EArgs> (btnmember0haschanged); 
} 
    public void btnmember0haschanged(object sender,  FObj_BtnRow.SelValue_EArgs newvalue) 
    { 
     bool thisnewvalue = newvalue.refreshed; 
    } 

Können Sie mir helfen? Vielen Dank im Voraus !!

+1

Können Sie den Code bitte auf die minimale Menge reduzieren, die zur Demonstration dieses Problems erforderlich ist? – Enigmativity

+0

Ich werde es tun. Vielen Dank. – Jablonovo

+0

Die Zeile 'internes Event EventHandler [] e_BtnMember' ist ein Array von Delegaten. Es ist kein Delegierter. Das Schlüsselwort 'event' kann nur einem Delegaten vorangehen, – Enigmativity

Antwort

0

Ich löste das Problem selbst, danke für Ihre Ratschläge.

-Code

class Class1 
{ 
internal class FObj_BtnRowtest 
{ 
    private Button[] _Btnmembers; 
    public delegate void del_Btnmember(Boolean value); 
    public del_Btnmember[] btnvaluechanged; 

    internal class SelValue_EArgs : EventArgs//events args (selected value) 
    {//return boolean arguments in events 
     internal SelValue_EArgs(Boolean ivalue) { refreshed = ivalue; }//ctor 
     internal Boolean refreshed { get; set; }//accessors 
    } 
    private Boolean[] _ActONOFFValue; 
    private Boolean ActONOFFValue(int number) 
    { 
     _ActONOFFValue[number] = !_ActONOFFValue[number]; 
     return _ActONOFFValue[number]; 
    } 
    public FObj_BtnRowtest(int numofbtn, String UnitName)//ctor 
    { 
     _Btnmembers = new Button[numofbtn]; 
     btnvaluechanged = new del_Btnmember[numofbtn]; 
     _ActONOFFValue = new bool[numofbtn]; 
     for (int i = 0; i < numofbtn/2; i++) 
     { 
      _Btnmembers[i].Click += new EventHandler(_Btnmembers_Click); 
     } 
    } 
    protected virtual void _Btnmembers_Click(object sender, EventArgs e) 
    { 
     int index = Array.IndexOf(_Btnmembers, (Button)sender); 
     if (btnvaluechanged[index] != null) btnvaluechanged[index](ActONOFFValue(index)); 
    } 
} 
} 

Und dann in Haupt

thisrow = new Class1.FObj_BtnRowtest(4,"thisunittest");//4 buttons 
    thisrow.btnvaluechanged[0] += new Class1.FObj_BtnRowtest.del_Btnmember(valuetesthaschanged);//to subscribe to btn0 change 

mit Delegierten erleichtern. und ja, wir brauchen solche Dinge, um den Code klarer und schneller zu machen.

Vielen Dank !!

Verwandte Themen