为什么我的事件总是为null,即使它在调用函数中正确添加了?

时间:2017-08-30 10:45:38

标签: c# events

(信息):我知道已经多次询问了这个问题,但恕我直言的问题是,事件并没有真正添加到调用函数中,这不是这里的情况。

我有以下课程:

 public class FilePanel : BasePanel
{
    public event LinkClickedEventHandler FileOpen;
    private PlaylistElement _element;

    public FilePanel() : base()
    {
        AddControls(new PlaylistElement { Description = "lorem ipsom" });
    }

    public FilePanel(PlaylistElement element) : base(element)
    {
        AddControls(element);
    }

    private void AddControls(PlaylistElement element)
    {
        _element = element;
        ToolTip tt = new ToolTip();
        var textControl = new Label { Dock = DockStyle.Fill, Text = element.File.Title, Padding = new Padding(2, 2, 5, 2) };
        var linkControl = new LinkLabel { Dock = DockStyle.Right, TextAlign= System.Drawing.ContentAlignment.MiddleRight, Width = 200, Text = "Datei öffnen",  Padding = new Padding(2, 2, 5, 2) };
        tt.SetToolTip(linkControl, element.File?.FileReference);
        linkControl.Click += LinkControl_Click;
        this.Controls.Add(textControl);
        base.AddControls(element);
        this.Controls.Add(linkControl);

        this.Height = 50;
    }

    private void LinkControl_Click(object sender, EventArgs e)
    {
        FileOpen?.Invoke(this, new LinkClickedEventArgs(_element.File.FileReference));
    }
}

此类的调用方式如下:

private void AddScheduleFile(RadCollapsiblePanel blockPanel, PlaylistElement element)
{
    var panel = new ScheduleControls.FilePanel(element);
    panel.FileOpen += Panel_FileOpen;
    blockPanel.Controls.Add(new ScheduleControls.FilePanel(element));
}

如您所见,FileOpen-Event被分配给调用类。

但是当我进入LinkControl_Click时,FileOpen仍为NULL。

1 个答案:

答案 0 :(得分:3)

似乎你在错误的对象中触发事件。虽然您注册了该事件,但您可以为panel对象执行此操作。但是你向控件添加了一个全新的对象:

blockPanel.Controls.Add(new ScheduleControls.FilePanel(element));

如果您现在使用此对象触发事件,您将看到它是null,因为您尚未注册它。为什么不将原始对象传递给控件?=! :

private void AddScheduleFile(RadCollapsiblePanel blockPanel, PlaylistElement element)
{
    var panel = new ScheduleControls.FilePanel(element);
    panel.FileOpen += Panel_FileOpen;
    blockPanel.Controls.Add(panel);
}