Динамическое созданное событие в С#

У меня есть динамический объект кнопки создания, где я хочу, чтобы он отправлял событие в основную форму, когда я нажимаю кнопку внутри этого объекта.

У меня есть такой код:

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; компилятор сказал мне, что я должен использовать делегат. Я плохо понимаю это замечание, не могли бы вы мне помочь? В конце главная форма должна подписаться только на кнопку события, которую она хочет щелкнуть.

И тогда в основном мы могли бы использовать его сейчас, когда нажимается кнопка в строке многокнопочного объекта... вот так:

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

Вы можете помочь мне? Заранее спасибо!!


person JudgeDreed    schedule 12.05.2017    source источник
comment
Не могли бы вы сократить код до минимального объема, необходимого для демонстрации этой проблемы?   -  person Enigmativity    schedule 12.05.2017
comment
Я сделаю это. Спасибо.   -  person JudgeDreed    schedule 12.05.2017
comment
Строка internal event EventHandler<SelValue_EArgs>[] e_BtnMember представляет собой массив делегатов. Это не делегат. Ключевое слово event может предшествовать только делегату,   -  person Enigmativity    schedule 12.05.2017
comment
@Enigmativity: если быть точным, ключевое слово event может предшествовать только делегату type. Делегат является экземпляром такого типа. Но да, проблема в корне такая, как вы описываете. К ОП: вам нужно свести проблему к хорошему минимально воспроизводимому примеру, который ясно показывает, что вы пытаетесь сделать. Совершенно непонятно, что вы ожидали от синтаксиса массива в своем объявлении. Я уверен, что в качестве ответа может быть предложена подходящая альтернатива, но то, какой должна быть эта альтернатива, на данный момент открыто для широкой интерпретации.   -  person Peter Duniho    schedule 12.05.2017
comment
Возможный дубликат массива событий в C#?   -  person Vladimir Liubimov    schedule 12.05.2017


Ответы (1)


Решил проблему сам, спасибо за советы.

Код

 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

использование делегатов упрощает задачу. и да, нам нужны такие вещи, чтобы сделать код более понятным и ускорить его разработку.

Спасибо всем!!

person JudgeDreed    schedule 17.05.2017