Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义事件处理程序未初始化_C# - Fatal编程技术网

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:我更喜欢用空的匿名委托初始化委托。