2010-11-02 52 views
2

我只是试图在一些WinForm应用程序,并创建一个简单的事件处理程序,但我收到一条错误消息。代码: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' 

回答

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); 

顺便说一句,除非其目的是学习如何使用委托,我建议,当一个自带的框架,你没有创建自己的委托类型将完成这项工作。

+0

感谢。第二个像魅力一样工作。 – xbonez 2010-11-02 15:29:58

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为了听来处理事件与点击方法。

0

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

你只需要做:

listBox1.Click += new EventHandler(onClicked);