无法将click事件分配给使用扩展eventargs参数的事件处理程序

时间:2015-07-08 05:13:40

标签: c# winforms events toolstripmenu

我正在尝试分配一个事件处理程序,该事件处理程序使用将System.EventArgs扩展到ToolStripMenuItem的事件参数。当我输入处理程序的名称时,它想要创建一个使用System.EventArgs的事件处理程序。这是一个最近文件的列表。

这是代码

RecentEventArgs e = new RecentEventArgs();
e.FileName = item;
ToolStripMenuItem recentItem = new ToolStripMenuItem(item);
recentItem.Click += new EventHandler(RecentItem_Click);
mnuFileOpenRecentList.DropDownItems.Add(item);

private void RecentItem_Click(object sender, RecentEventArgs e)
{
    MessageManager.DisplayMessageBox("File -> Open Recent ->");
    OpenRecentFile(e.FileName);
    }

public class RecentEventArgs : EventArgs
{
    private string fileName;

    public RecentEventArgs()
        :base()
    {

    }

    public string FileName
    {
        get { return fileName; }
        set { fileName = value; }
    }
}

对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

你正朝着正确的方向前进,但你错过了一些关键部分。请记住,c#中的所有内容都是强类型的,这意味着所有方法签名都无法在运行时更改其任何参数。对于delegates也是如此(如果您订阅活动,那就是您正在使用的内容)。

由于您已经拥有自定义的EventArgs,所以仍然缺少的是一个委托,它描述了您的新事件(因为这就是您所追求的)将要调用的方法签名。

// the public delegate with the custom eventargs
public delegate void RecentEventHandler(object sender, RecentEventArgs e);

现在你需要一些充当ToolStripMenuItem的东西,但会触发Recent事件,它会被点击并发送你的自定义eventargs作为有效负载。让我们创建一个子类来处理该逻辑:

public class RecentFileMenuItem:ToolStripMenuItem
{
    private string filename; // holds your path+file

    // constructur
    public RecentFileMenuItem(string filename)
        :base(Path.GetFileName(filename))
    {
        // keep our filename
        this.filename = filename;
    }

    // event delegate, subscribe to this
    public RecentEventHandler Recent;

    // click invokes all subscribers 
    // for the Recent Event
    protected override void OnClick(EventArgs e)
    {
        RecentEventHandler recent = Recent;
        if (recent !=null)
        {
            // create your RecentEventArgs here
            recent(this, new RecentEventArgs { FileName = filename });
        }
    }
}

在上面的类中,我覆盖默认的OnClick处理程序,以调用我们创建新的RecentEventArgs的Recent事件的任何订阅者。请注意类型为Recent的{​​{1}}委托。

有了这些位,我们需要让我们的课程发挥作用。

RecentEventHandler

在这里,我们看到我们在构造函数中将 private void Form3_Load(object sender, EventArgs e) { RecentFileMenuItem recentItem = new RecentFileMenuItem("foo"); mnuFileOpenRecentList.DropDownItems.Add(recentItem); recentItem.Recent += new RecentEventHandler(Show); } // method signature that matches our RecentEventHandler delegate public void Show(object s, RecentEventArgs e) { MessageBox.Show(e.FileName); } 的新实例添加到最近列表中。 RecentFileMenuItem方法与签名匹配,因此我们可以使用指向该方法的委托订阅Show事件。