Обработчик событий приложений WinForm - PullRequest
2 голосов
/ 02 ноября 2010

Я просто пробую свои силы в некоторых приложениях 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 ]

2 голосов
/ 02 ноября 2010

Причина, по которой ваш код не компилируется, заключается в том, что неявные преобразования не существуют между различными типами делегатов, даже когда сигнатуры «совместимы».

Попробуйте любой из этих:

// 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 голосов
/ 02 ноября 2010

Вам не нужно создавать совершенно новый тип делегата, чтобы подписаться на существующее событие.Событие, на которое вы подписаны, уже использует существующий System.EventHandler тип делегата.

Вам нужно всего лишь:

listBox1.Click += new EventHandler(onClicked);
0 голосов
/ 02 ноября 2010

Просто используйте этот код вместо:

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 для прослушивания обработки события методом clicked .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...