WinForm应用程序事件处理程序

时间:2010-11-02 15:27:23

标签: c# windows winforms

我只是尝试一些WinForm应用程序,并创建一个简单的事件处理程序,但我收到一条错误消息。代码:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public delegate void MyHandler1(object sender, EventArgs e);

        public Form1()
        {
            InitializeComponent();

            List<string> names = new List<string>();
            names.Add("S");
            names.Add("I");
            names.Add("G");

            MyHandler1 onClicked = new MyHandler1(clicked);

            listBox1.DataSource = names;
            listBox1.Click += onClicked;


        }

        public void clicked(object sender, EventArgs e)
        {
            label1.ResetText();
            label1.Text = listBox1.SelectedItem.ToString();
        }
    }

}

错误:

Error   1   Cannot implicitly convert type 'WindowsFormsApplication1.Form1.MyHandler1' to 'System.EventHandler'

3 个答案:

答案 0 :(得分:2)

您的代码无法编译的原因是不同委托类型之间不存在隐式转换,即使签名是“兼容的”。

尝试其中任何一种:

// Implicit method-group conversion, should work from C# 2.0 or later.
// Essentially shorthand for listBox1.Click += new EventHandler(clicked);
listBox1.Click += clicked; 

// Creating a delegate-instance from a 'compatible' delegate,
// a trick I recently learnt from his highness Jon Skeet
listBox1.Click += new EventHandler(onClicked);

顺便说一下,除非打算学习如何使用委托,否则我建议你不要创建自己的委托类型,当框架附带的那个委员会完成这项任务时。

答案 1 :(得分:0)

只需使用此代码:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public delegate void MyHandler1(object sender, EventArgs e);

        public Form1()
        {
            InitializeComponent();

            List<string> names = new List<string>();
            names.Add("S");
            names.Add("I");
            names.Add("G");

            listBox1.DataSource = names;
            listBox1.Click += clicked;


        }

        public void clicked(object sender, EventArgs e)
        {
            label1.ResetText();
            label1.Text = listBox1.SelectedItem.ToString();
        }
    }
}

您不需要使用EventHandler1来侦听使用点击的方法处理事件。

答案 2 :(得分:0)

您无需创建全新的委托类型即可订阅现有事件。您订阅的事件已使用现有的System.EventHandler委托类型。

你只需要这样做:

listBox1.Click += new EventHandler(onClicked);