(信息):我知道已经多次询问了这个问题,但恕我直言的问题是,事件并没有真正添加到调用函数中,这不是这里的情况。
我有以下课程:
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。
答案 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);
}