自定义事件处理程序未初始化

时间:2011-01-20 08:12:02

标签: c#

以下是我正在使用的代码

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

我之前已经创建了一些事件,但我无法弄清楚这个事件的错误。我肯定应该是一些愚蠢的错误。

3 个答案:

答案 0 :(得分:2)

可能发生这种情况的一种情况是,如果您尝试从ImpersonatedTab类的构造函数中调用该事件。你把那些...放在哪里。最好在调用之前检查事件处理程序是否已初始化。

答案 1 :(得分:2)

将您的代码更改为:

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

您现在可以在添加访问者和SaveData()上设置断点,并验证事件订阅是否正常工作。如果您执行看到添加访问者被调用但仍然为处理程序获取null,那么对象引用就会出现问题。

答案 2 :(得分:1)

您尝试在附加任何处理程序之前调用TriggerSaveSetting事件处理程序。确保要检查事件是否附加了一些处理程序:

private void OnTriggerSaveSetting(_tabdata)
{
    if (TriggerSaveSetting != null)
        TriggerSaveSetting(_tabdata);
}