Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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
来自自定义usercontrol中类的C#事件从不激发_C#_Winforms_Events - Fatal编程技术网

来自自定义usercontrol中类的C#事件从不激发

来自自定义usercontrol中类的C#事件从不激发,c#,winforms,events,C#,Winforms,Events,我有一个类,它有一个事件,假设每次它的一个属性更改时都会触发该事件 public event EventHandler StructureChanged; protected virtual void NotifyStructureChanged(EventArgs e) { if (StructureChanged != null) { StructureChanged(this, e); }

我有一个类,它有一个事件,假设每次它的一个属性更改时都会触发该事件

    public event EventHandler StructureChanged;
    protected virtual void NotifyStructureChanged(EventArgs e)
    {
        if (StructureChanged != null)
        {
            StructureChanged(this, e);
        }
    }
我包括
NotifyStructureChanged(neweventargs())”。
每当调用该方法时,
StructureChanged
始终为空。我的类是自定义usercontrol中的私有成员,类事件在usercontrol的构造函数中注册,如下所示

\u pt.StructureChanged+=\u pt\u StructureChanged

在这里处理

    void _pt_StructureChanged(object sender, EventArgs e)
    {
        UpdateControl();
    }
到目前为止,我拥有的是一个自定义类,其中包含一个事件,该事件是自定义用户控件的私有成员。我在自定义usercontrol中注册我的类事件。每当类属性更改时,我都会更新控件以反映类中的更改


我做错了什么?我在usercontrol上有一个按钮,可以注册该事件,为什么我不能注册我的类事件?

如果
StructureChanged
null
,则在触发事件后附加事件处理程序(或者在某处分离处理程序)

也不要传递
EventArgs
——它只是无用的伪参数

public event EventHandler StructureChanged;

protected virtual void OnStructureChanged()
{
    if (StructureChanged != null)        
        StructureChanged(this, EventArgs.Empty);        
}
并在setter中调用此方法:

public Foo Bar
{
    get { return _bar; }
    set {
       if (_bar == value)
          return;

       _bar = value;
       OnStructureChanged();
    }
}

作为旁注,您需要执行
StructureChanged handler=StructureChanged
并检查
处理程序
是否为
null
。否则,在多线程情况下,存在可能导致
NullReferenceException
的争用条件。当在方法中StructureChanged字段始终为null时,我确实调用setter中的
OnStructureChanged()
方法。我没有在代码中的任何地方显式分离处理程序。此用户控件是带有按钮和文本框的图形控件,在winform中使用。@user3421997那么您肯定会在附加处理程序之前引发事件。很高兴看到您的setter和这个逻辑的参与者。谁提出这一事件?什么时候谁订阅?什么时候?这是我的逻辑。我有一个带有StructureChanged事件的PtClass。这是自定义usercontrol的私有字段。usercontrol订阅其构造函数中的StructureChanged事件。usercontrol将托管在winform上。当winform加载时,它创建一个PtClass对象,该对象被分配给usercontrol。