我有三个不同的事件:
form_load
button_click
pnlTiles_Paint
我的按钮点击事件:
private void btnUpdate_Click(object sender, EventArgs e)
{
pnlTiles.Paint += pnlTiles_Paint;
}
我的form_load活动:
private void frmMain_Load(object sender, EventArgs e)
{
pnlTiles.Paint += pnlTiles_Paint;
}
现在我的问题是当我在form_load中使用它时会调用该事件,但是当我在按钮事件中使用它时;它只是跳过事件,我试图在调试按钮点击时进入事件。但是我在试图找出为什么不从按钮调用事件时没有取得任何进展。
答案 0 :(得分:4)
正如其他人所指出的那样,pnlTiles.Paint += pnlTiles_Paint;
表示您正在订阅控件Paint
上的pnlTiles
事件。这意味着每次pnlTiles
引发Paint
事件时,pnlTiles_Paint
指定的方法都会被调用。导致Paint
被解雇的原因是什么?根据{{3}},
重绘控件时会引发Paint事件。它将PaintEventArgs的一个实例传递给处理Paint事件的方法。
所以可能发生的事情是pnlTiles
在主窗体引发Paint
事件后引发Load
事件(因为这是第一次pnlTiles
被引用屏幕)这就是你的处理程序最终被调用的原因。
但是,单击某个按钮不会导致pnlTiles
重新绘制,并且Paint
事件会被引发,因此不会调用您的处理程序。
如果由于某种原因,在Button's
点击处理程序中连接处理程序后,需要重新绘制pnlTiles
,则会调用pnlTiles_Paint
。您可以在订阅Button's
pnlTile's
事件后,在Paint
点击处理程序中调用msdn来测试此问题。
private void btnUpdate_Click(object sender, EventArgs e)
{
pnlTiles.Paint += pnlTiles_Paint;
pnlTiles.Invalidate();
}
由于你对事件的基础知识有点模糊,所以可能值得阅读这些文章:
此外,请务必阅读此帖子中有关未多次订阅同一事件的cgijbels评论。