没有超载匹配委托..为什么?

时间:2012-12-09 17:30:25

标签: c#

我有这段代码:

Button ssr = new Button();
                ssr.Text = "SSR";
                ssr.Location = new Point(500, 5);
                ssr.Size = new Size(50, 30);
                ssr.Click += new EventHandler(ssr_Click);

我有一个方法ssr_Click,它在按钮上写了一个“1234”。那只是为了测试,现在方法看起来像这样:

private void ssr_Click(string callsign, object sender, EventArgs e)
    {
        using (var wb = new WebClient())
        {
            string url = "xxxxxxxx";
            WebRequest request = WebRequest.Create(url);
            request.Method = "POST";
            string postData = "callsign=" + callsign;
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = byteArray.Length;
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();
            WebResponse response = request.GetResponse();
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string squawk = reader.ReadToEnd();
            System.Windows.Forms.MessageBox.Show(squawk); // !!!
            reader.Close();
            dataStream.Close();
            response.Close();
        }
    }

没关系,它只是不知道“callsign”,这是有意义的,因为它是在其他地方定义的,所以我在方法参数中添加了“字符串callign”,当我调用它时,我也会给它是呼号。由于我这样做,我在第一部分代码中遇到错误,在

ssr.Click += new EventHandler(ssr_Click);

它说:'ssr_Click'没有重载匹配委托'System.EventHandler'。编辑此方法之前没问题。 它应该这样做:有人点击按钮,它将呼号发送到方法,从网站上的.php获取四位数代码,并将代码写在按钮上,所以我知道我也必须编辑方法,以便返回一个字符串,但首先我需要解决这个问题。 有任何想法吗?

3 个答案:

答案 0 :(得分:2)

EventHandler是一个委托类型,定义为:

public delegate void EventHandler(object sender, EventArgs e);

所以你的处理程序方法必须具有相同的签名,即

private void ssr_Click(object sender, EventArgs e)

在您的处理程序中,sender应该是引发事件的对象,因此您可以从中获取callsign数据,或者您可以将其存储在成员变量中。

答案 1 :(得分:0)

从事件处理程序方法中删除第一个参数string callsign。按钮Click事件的事件处理程序应该接受两个参数 - sender和event参数。

请记住,应该通过按钮调用此方法。 Button对您的callsign参数一无所知。所以,你需要自己获得这个价值:

private void ssr_Click(object sender, EventArgs e)
{
     string callsign = // get your value e.g. from textbox

     // call to web service
}

答案 2 :(得分:0)

EventHandler 委托需要一个返回void并且只接收两个参数的方法。第一个类型Object(发件人)和第二个类型EventArgs。一旦添加了另一个参数,就更改了函数的签名,它不再与预期的委托相同。

解决方案:从方法的参数中删除string callsign,使其如下所示:

private void ssr_Click(object sender, EventArgs e)