无法从按钮调用事件

时间:2013-10-01 21:02:12

标签: c# winforms events

我有三个不同的事件:

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中使用它时会调用该事件,但是当我在按钮事件中使用它时;它只是跳过事件,我试图在调试按钮点击时进入事件。但是我在试图找出为什么不从按钮调用事件时没有取得任何进展。

1 个答案:

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

由于你对事件的基础知识有点模糊,所以可能值得阅读这些文章:

pnlTiles.Invalidate()

Jon Skeet - Events

此外,请务必阅读此帖子中有关未多次订阅同一事件的cgijbels评论。