c#中动态创建的事件

时间:2017-05-12 06:12:29

标签: c# dynamic delegates eventhandler

我有一个动态创建按钮对象,我希望它在单击此对象内的按钮时向主窗体发送事件。

我有这样的代码:

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

    }

}

但是在行中:内部事件EventHandler [] e_BtnMember; 编译器告诉我,我应该使用委托。我不明白这句话,你能帮助我吗? 最后,mainform只应订阅它想要的事件按钮。

然后在main中我们可以使用它来点击对象多按钮行中的按钮...就像这样:

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 个答案:

答案 0 :(得分: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

使用委托更容易。是的,我们确实需要这些东西来使代码更清晰,更快速地开发。

谢谢大家!!