如何知道它是否是委托事件回调中的读者?

时间:2016-10-27 11:35:51

标签: c# winforms events delegates twincat

我对回调有疑问。

我有两种形式(VS2010)。

当''valueIN''发生变化时,我创建了一个引发事件的类。

我在我的课程中设置了一个委托,以便任何Form在更改时都可以获得它。

问题

我创建Form2对象并将回调链接到它,以便它能够得到''valueIN''。但是如果没有实例化form2对象,则运行时会告诉我没有对象的实例化。 所以我想知道我怎么知道Form2存在于我的工作站中。 这一行:SetValueINValCallback(value_received); 应该看起来像什么(在工作室中看到Form2):if(SetValINCallbackFn.exists) SetValueINValCallback(value_received);

窗体2

namespace DelegateTest
{
    using Beckhoff.App.Ads.Core;
    using Beckhoff.App.Ads.Core.Plc;
    using TwinCAT.Ads;
    using System.IO;

    public delegate void DEL_SetValIN(Single value);//test event

    public partial class Form1 : Form
    {
        IBAAdsServer _adsServer;
        WorkingStation WorkStation;
        public Form1()
        {
            InitializeComponent();
            WorkingStation WorkStation = new WorkingStation(_adsServer);
        }

        private void btn_Frm2Open_Click(object sender, EventArgs e)
        {
            Form2 Form2Test = new Form2();
            WorkStation.SetValueINValCallback += new DEL_SetValIN(Form2Test.SetValINCallbackFn);
            Form2Test.Show();
        }
    }
}

namespace DelegateTest
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public void SetValINCallbackFn(Single Value_received)//refresh valueIN
        {
            label1.Text = Value_received.ToString("F1");
        }
    }
}

工作站

namespace DelegateTest
{
    using System;
    using System.Collections.Generic;
    using System.IO;

    using System.Windows.Forms;//msgbox
    using Beckhoff.App.Ads.Core;
    using Beckhoff.App.Ads.Core.Plc;
    using TwinCAT.Ads;

    public class WorkingStation
    {//working station class
        public DEL_SetValIN SetValueINValCallback;

        private static IBAAdsCncClient _cncClient;
        private static IBAAdsPlcClient _plcClient;
        public static List<IBAAdsNotification> _notifications;

      //no need  public event System.EventHandler e_RefreshValueIN;//Input value has changed

        public WorkingStation(IBAAdsServer _adsServer)                  //constructor
        {
            try
            {
                _cncClient = _adsServer.GetAdsClient<IBAAdsCncClient>("CNC");
                _plcClient = _adsServer.GetAdsClient<IBAAdsPlcClient>("PLC");
                _notifications = new List<IBAAdsNotification>();

                var _refreshValueIN = new OnChangeDeviceNotification("GlobalVar.PLC.valueInput", ValINHasChanged);//event handler value
                _plcClient.AddPlcDeviceNotification(_refreshValueIN);
                _notifications.Add(_refreshValueIN);
            }
            catch (Exception Except)
            { MessageBox.Show("Error init object:" + Except.Message); }
        }
        ~WorkingStation()//destructor
        {
            foreach (var notify in _notifications)
            {
                _plcClient.RemovePlcDeviceNotification(notify);
            }
        }
        protected virtual void ValINHasChanged(object sender, BAAdsNotificationItem notification)//get Input value
        {//event method
            Single value_received = 0;
            try
            {
                value_received = _plcClient.ReadSymbol<Single>("valueInput");
                SetValueINValCallback(value_received);
               //no need   EventHandler E_VIChange = e_RefreshValueIN;
               //no need   if (E_VIChange != null)
               //no need       E_VIChange(this, EventArgs.Empty);
            }
            catch (Exception except)
            {
                MessageBox.Show("bad event (valueIN): " + except.Message);
            }
        }
    }
}

或者它是否存在将事件从类传递到多个表单的另一种方式?

我需要这些值来在Form2中绘制图表作为示例。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

很抱歉,因为我没有看到我正在举办活动。 如果我已经让代表订阅了这个活动,那么我不需要举办活动,我只需要订阅。 引发错误的原因是,如果您编写如下事件:

 protected virtual void ValINHasChanged(object sender, BAAdsNotificationItem notification)//get Input value
    {//event method
        {
          EventHandler E_VIChange = e_RefreshValueIN;
          if (E_VIChange != null)
          E_VIChange(this, EventArgs.Empty);
        }

您需要拥有像

这样的订阅者
subscriber += new EventHandler... and so on

你不再需要它,因为你有代表来完成工作。所以你只需要订阅委托回调即可获得你的信息。

抱歉浪费时间。

祝你好运