无法从按钮调用事件

本文关键字:调用 事件 按钮 | 更新日期: 2023-09-27 18:33:27

我有三个不同的事件:

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中使用它时,该事件被调用,但是当我在按钮事件中使用它时;它只是跳过事件,我在调试按钮单击时尝试单步执行事件。但是我在试图弄清楚为什么事件没有从按钮调用方面没有取得任何进展。

无法从按钮调用事件

正如其他人指出的那样,pnlTiles.Paint += pnlTiles_Paint;意味着您正在订阅控件pnlTiles上的Paint事件。这意味着每次pnlTiles引发Paint事件时,都会调用 pnlTiles_Paint 指定的方法。是什么原因导致Paint被解雇?根据 msdn,

重绘控件时将引发 Paint 事件。它将 PaintEventArgs 的实例传递给处理 Paint 事件的方法。

因此,可能发生的情况是,pnlTiles在主窗体引发Load事件之后引发Paint事件(因为这是第一次在屏幕上绘制pnlTiles(,这就是您的处理程序最终被调用的原因。

但是,单击按钮不会导致重绘pnlTiles并引发Paint事件,因此不会调用处理程序。

如果出于某种原因,在Button's单击处理程序中挂接处理程序后,需要重新绘制pnlTiles,则会调用pnlTiles_Paint。可以通过在订阅事件后在Button's单击处理程序中调用pnlTiles.Invalidate()来测试pnlTile's Paint这一点。

private void btnUpdate_Click(object sender, EventArgs e)
{
    pnlTiles.Paint += pnlTiles_Paint;
    pnlTiles.Invalidate();
}

由于您对事件的基础知识有点模糊,因此可能值得阅读以下文章:

乔恩·斯基特 - 活动

MSDN - 事件。

另外,请务必阅读 cgijbels 对这篇文章的评论,关于不要多次订阅同一事件。