2010-11-02 81 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);