构造函数之后才会发生事件?

3
我尝试理解为什么我不能在构造函数的最后一行邀请事件? "formload"事件是否发生在构建结束之后?
public Form1()
    {
        InitializeComponent();
        button1.Text = "a";
        button1.PerformClick();
    }

private void button1_Click(object sender, EventArgs e)
    {
        button1.Text = "b";
    }

1
“formload”事件是在构造结束后发生的吗?是的。当窗体变为可见时,会触发“Load”事件,而不是在构造时触发。 - Kevin Gosse
考虑一个名为button1_Click_Helper的类,它执行实际工作并直接调用该辅助程序。 - paparazzo
@Blam,你不需要创建一个辅助方法来完成这个任务。你可以直接执行button1_Click方法。 - Servy
@Servy 但是按照原样执行该方法并不起作用。 - paparazzo
@Blam 他并没有按照方法本身的方式执行,而是使用了 PerformClick 来触发事件,而不是直接调用他同时分配给事件处理程序的方法。 - Servy
2个回答

2

这种行为是因为控件都建立在窗口消息上,这只有在窗体实例存在并具有句柄时才有效,而在构建期间是没有的。

要确保控件正常工作,必须打开窗体。

在构造函数中触发事件不是最佳实践。


0

已测试。 不依赖于创建的控件。

public Form1()
{
    InitializeComponent();
    button1.Text = "A";
    button1_Click_helper();
}

private void button1_Click(object sender, EventArgs e)
{
    button1_Click_helper();
}

private void button1_Click_helper()
{
    button1.Text = "B";
}

你可以在构造函数中直接添加 button1_Click(this, new EventArgs()),而不需要使用一个辅助方法。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接