我只是尝试一些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'
答案 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);