在我的应用程序中,我想让我的主窗体(Form1)在我的UserControl(EmailControl)上调用一个方法。以下是我想要调用的三种主要方法:
public void InitializeConnection(string hostname, int port)
{
try
{
_imapClient = new TcpClient(hostname, port);
_imapNs = _imapClient.GetStream();
_imapSw = new StreamWriter(_imapNs);
_imapSr = new StreamReader(_imapNs);
label1.Text = "*** Connected ***";
Response();
}
catch (SocketException ex)
{
Console.WriteLine(ex.Message);
}
}
,
public void AuthenticateUser(string username, string password)
{
_imapSw.WriteLine("$ LOGIN " + username + " " + password);
_imapSw.Flush();
label2.Text = "Logged in";
Response();
}
和
public string MailCount()
{
_imapSw.WriteLine("$ STATUS INBOX (messages)");
_imapSw.Flush();
string res = Response();
Match m = Regex.Match(res, "[0-9]*[0-9]");
return m.ToString();
}
为此,我在usercontrol页面上使用它:
Form1.getemail += new Form1.sendtoemail(this.sendover);
和
public void sendover()
{
InitializeConnection("hostname", 123);
AuthenticateUser("username", "password");
MailCount();
}
然后在我的主页上我有
public delegate void sendtoemail(object sender, EventArgs e);
public event sendtoemail getemail;
和
private void Form1_Load(object sender, EventArgs e)
{
if (this.getemail != null)
{
this.getemail(this, e);
}
}
执行此操作后,在我的usercontrol页面上,它告诉我“sendover”匹配委托“sendtoemail”没有过载,并且我需要一个对象引用。究竟是什么引发了错误?
答案 0 :(得分:5)
getemail
事件的类型为sendtoemail
,因此您添加为处理程序的函数必须与该签名匹配。
以下是两个解决方案:
更改
public void sendover()
到
public void sendover(object sender, EventArgs e)
或更改
Form1.getemail += new Form1.sendtoemail(this.sendover);
到
Form1.getemail += (s, e) => sendover();
第一个解决方案更改了发送过程的签名以匹配委托类型,第二个解决方案创建了一个具有正确类型的匿名函数,该函数调用sendover。
答案 1 :(得分:2)
您的方法sendover
不尊重sendtoemail
代理人的方法签名:
public delegate void sendtoemail(object sender, EventArgs e); // accepts 2 parameters
而不是方法声明:
public void sendover() { // ...
...宣布为......
public void sendover(object sender, EventArgs e) { // ...