2017-05-12 2 views
-1

동적 인 버튼 객체가 있는데,이 객체 내부의 버튼을 클릭하면 mainform에 이벤트를 보내고 싶습니다.C에서 동적으로 생성 된 이벤트 #

는이 같은 코드가 있습니다

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); 
     } 

    } 

} 

을하지만 라인 : 내부 이벤트 핸들러 [] e_BtnMember; 컴파일러에서 델리게이트를 사용해야한다고 말했습니다. 나는이 말을 잘 이해하지 못한다. 너 나를 도울 수 있니? 끝까지 메인 폼은 원하는 이벤트 버튼 만 구독해야합니다.

그리고 다음 주에 우리는 다음과 같이 ... 객체 멀티 버튼 행에있는 버튼을 클릭 할 때 지금 사용할 수 있습니다 : 당신이 나를

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; 
    } 

도와 드릴까요? 미리 감사드립니다 !!

+1

이 문제를 설명하는 데 필요한 최소한의 코드로 코드를 줄이실 수 있습니까? – Enigmativity

+0

나는 그것을 할 것이다. 감사. – Jablonovo

+0

'내부 이벤트 EventHandler [] e_BtnMember' 행은 델리게이트의 배열입니다. 그것은 대의원이 아닙니다. 'event' 키워드는 델리게이트보다 앞서야 만합니다. – Enigmativity

답변

0

저는 혼자서 문제를 해결했습니다. 귀하의 조언에 감사드립니다.

코드

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)); 
    } 
} 
} 

그리고 사용

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

주 대표에보다 쉽게합니다. 그렇습니다. 코드를 더 명확하고 빠르게 개발할 수 있도록 이러한 종류의 물건이 필요합니다.

감사합니다.

관련 문제