2010-11-02 2 views
2

Я просто пытаюсь использовать свои приложения в некоторых приложениях WinForm и создаю простой обработчик событий, но получаю сообщение об ошибке. Код:WinForm Applications event handler

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

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