我正在制作一个连接到多个第 3 方系统的程序。与不同格式的连接,所以我创建了多个类来处理它们。我现在有三个 4 类。
MainForm 是第一类。这是带有用户界面的基本窗体类。
SDKCommunication 是第二类。
VMS(该类处理第二方系统给出的事件并激活SDK通信上的方法)
活动
活动类
public class Events
{
public event EventHandler LoginStateChanged;
private bool loginstate;
public bool LogInState
{
get { return this.loginstate; }
set
{
this.loginstate = value;
if (this.LoginStateChanged != null)
this.LoginStateChanged(this, new EventArgs());
}
}
}
SDKCommunicatie 类的一部分
Events events = new Events();
public void onLogon(string username, string directory, string system)
{
events.LogInState = false;
}
主窗体类
SDKCommunicatie sdkcommunicatie = new SDKCommunicatie();
Events events = new Events();
public MainForm()
{
InitializeComponent();
events.LoginStateChanged += new EventHandler(events_LoginStateChanged);
}
void events_LoginStateChanged(object sender, EventArgs e)
{
log.Info("EventFired loginstateChanged");
}
当 SDKCommunicatie 类中的 LogInState 发生变化时。需要在 MainForm 类中触发一个事件。但遗憾的是,这行不通。但是,当我更改主窗体中的登录状态时(使用按钮单击)(请参见下面的代码),该事件被触发。但这不是我想要的意图。
private void button1_Click(object sender, EventArgs e)
{
events.LogInState = true;
}
如果我的问题不够清楚,请告诉我。
VMS 类添加为对@Astef 的回复
class VMS {
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(MainForm));
GxUIProxyVB m_UIProxy = new GxUIProxyVB();
public string username2;
public string directory2;
public string Status;
public void initOmni()
{
m_UIProxy.CreateInstance();
m_UIProxy.OnLogon += new _IGxUIProxyVBEvents_OnLogonEventHandler(m_UIProxy_OnLogon);
m_UIProxy.OnLogoff += new _IGxUIProxyVBEvents_OnLogoffEventHandler(m_UIProxy_OnLogoff);
m_UIProxy.OnError += new _IGxUIProxyVBEvents_OnErrorEventHandler(m_UIProxy_OnError);
m_UIProxy.OnAlarmStatusEx2 += new _IGxUIProxyVBEvents_OnAlarmStatusEx2EventHandler(m_UIProxy_OnAlarmStatusEx2);
}
public void login(string username, string password, string directory)
{
username2 = username;
directory2 = directory;
initOmni();
m_UIProxy.LogOn(directory, username, password,false);
}
public void logOff()
{
m_UIProxy.LogOff();
}
void m_UIProxy_OnLogon()
{
SDKCommunicatie sdkcommunicatie = new SDKCommunicatie();
sdkcommunicatie.onLogon(username2, directory2, "Genetec Omnicast");
}
我已通过删除以下内容来解决此问题:
SDKCommunicatie sdkcommunicatie = new SDKCommunicatie();
并在 VMS 的基础上添加以下内容:
SDKCommunicatie sdkcommunicatie;
但是现在当我尝试在 SDKCommunicatie 中调用一个类时,我在主窗体中遇到了一个新错误
connectedStatus = sdkcommunicatie.connectedStatus();
我收到以下错误:
NullReferenceException 未处理