2 Stimmen

WinForm Applications-Ereignishandler

Ich bin gerade versuchen, meine Hand auf einige WinForm-Anwendungen und wurde ein einfaches Ereignis-Handler erstellen, aber ich erhalte eine Fehlermeldung. Code:

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

}

Fehler:

Error   1   Cannot implicitly convert type 'WindowsFormsApplication1.Form1.MyHandler1' to 'System.EventHandler'

3voto

Ani Punkte 107342

Der Grund dafür, dass Ihr Code nicht kompiliert werden kann, ist, dass implizite Konvertierungen zwischen verschiedenen Delegatentypen nicht möglich sind, selbst wenn die Signaturen "kompatibel" sind.

Versuchen Sie eine von diesen:

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

Nebenbei bemerkt: Wenn Sie nicht lernen wollen, wie man Delegaten verwendet, sollten Sie nicht Ihren eigenen Delegatentyp erstellen, wenn einer, der mit dem Framework geliefert wird, die Aufgabe erfüllt.

0voto

Dror Helper Punkte 29647

Verwenden Sie stattdessen einfach diesen Code:

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

Sie brauchen den EventHandler1 nicht wirklich, um ein Ereignis zu hören und zu behandeln mit angeklickt Methode.

0voto

Pete Punkte 11063

Sie müssen keinen völlig neuen Delegatentyp erstellen, um ein vorhandenes Ereignis zu abonnieren. Das Ereignis, das Sie abonnieren, verwendet bereits den vorhandenen System.EventHandler Delegatentyp.

Sie müssen nur etwas tun:

listBox1.Click += new EventHandler(onClicked);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X