C# 自定义事件处理程序未初始化
下面是我正在使用的代码C# 自定义事件处理程序未初始化,c#,C#,下面是我正在使用的代码 class ImpersonatedTab : System.Windows.Forms.TabPage { Credentials _cred = new Credentials(); public delegate void Savesetting(TabData Tb); public event Savesetting TriggerSaveSetting; public Imper
class ImpersonatedTab : System.Windows.Forms.TabPage
{
Credentials _cred = new Credentials();
public delegate void Savesetting(TabData Tb);
public event Savesetting TriggerSaveSetting;
public ImpersonatedTab(TabData tb)
{
........
}
private void SaveData()
{
TriggerSaveSetting(_tabdata);
}
private Onclick()
{
SaveData();
}
}
当我在ImpersonatedTab类中调用Onclick函数时,它返回一个错误,表示TriggerSaveSetting为null
我像这样初始化这个调用
ImpersonatedTab Tab = new ImpersonatedTab(tb);
Tab.TriggerSaveSetting += new ImpersonatedTab.Savesetting(Tab_TriggerSaveSetting);
我之前已经创建了事件,但无法找出这一事件的错误。。我确信这应该是一个愚蠢的错误。可能发生这种情况的一种情况是,如果您试图从
ImpersonatedTab
类的构造函数中调用事件。你把那些…
放在那里。此外,在调用事件处理程序之前,最好检查事件处理程序是否已初始化。您正在尝试在任何处理程序附加到TriggerSaveSetting事件处理程序之前调用它。要检查,请确保事件已附加了一些处理程序:
private void OnTriggerSaveSetting(_tabdata)
{
if (TriggerSaveSetting != null)
TriggerSaveSetting(_tabdata);
}
将代码更改为:
public delegate void Savesetting(TabData Tb);
private Savesetting saveSettingDlg;
public event Savesetting TriggerSaveSetting {
add { saveSettingDlg += value; }
remove { saveSettingDlg -= value; }
}
private void SaveData() {
var handler = saveSettingDlg;
if (handler != null) handler(_tabdata);
}
现在可以在add accessor and SaveData()上设置断点,并验证事件订阅是否正常工作。如果确实看到add访问器被调用,但处理程序仍为null,则对象引用存在问题。您是否可能从
ImpersonatedTab
构造函数中调用SaveData
方法?一个好的方法是总是检查事件是否不是null:private void SaveData(){if(triggersaveseting!=null)triggersaveseting(_tabdata);}@zavaz:我更喜欢用空的匿名委托初始化委托。