【问题标题】:Dynamic created event in c#c#中的动态创建事件
【发布时间】:2017-05-12 06:12:28
【问题描述】:

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

我有这样的代码:

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; 编译器告诉我应该使用委托。我不明白这句话,你能帮我吗? 最后,主窗体应该只订阅它想要的事件按钮单击。

然后在 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;
    }

你能帮帮我吗? 提前致谢!!

【问题讨论】:

  • 能否将代码减少到演示此问题所需的最少数量?
  • 我会做的。谢谢。
  • internal event EventHandler&lt;SelValue_EArgs&gt;[] e_BtnMember 行是一个代表数组。它不是代表。 event 关键字只能在委托之前,
  • @Enigmativity:准确地说,event 关键字只能在委托 type 之前。委托是这种类型的实例。但是,是的,问题基本上正如您所描述的那样。 致 OP: 你需要将你的问题减少到一个好的minimal reproducible example,它清楚地表明你正在尝试做什么。完全不清楚您希望在声明中使用数组语法会发生什么。我确信可以提供一个合适的替代方案作为答案,但目前该替代方案应该是什么有待广泛解释。
  • array of events in C#?的可能重复

标签: c# dynamic delegates eventhandler


【解决方案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));
    }
 }
}

然后在 main

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

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

谢谢大家!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 2012-03-18
    • 2018-03-10
    • 1970-01-01
    相关资源
    最近更新 更多