【问题标题】:Events occur only after construction?事件仅在构建后发生?
【发布时间】:2012-09-10 14:53:00
【问题描述】:

我试图理解为什么我不能在构造函数的最后一行邀请事件? 构建结束后是否会发生“formload”事件?

public Form1()
    {
        InitializeComponent();
        button1.Text = "a";
        button1.PerformClick();
    }

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

【问题讨论】:

  • Does the event "formload" occur after construction ends? 确实如此。 Load 事件在表单变得可见时触发,而不是在构造时触发。
  • 考虑一个 button1_Click_Helper 类来完成实际工作并直接调用助手。
  • @Blam 你不需要创建一个辅助方法来做到这一点。您可以按原样执行button1_Click 方法。
  • @Servy 但是按原样执行该方法不起作用。
  • @Blam 他没有按原样执行方法,他使用PerformClick 来触发事件,而不是仅仅调用他也分配给事件处理程序的方法。

标签: c# .net winforms events


【解决方案1】:

这种行为是因为如果控件是在 windows 消息上构建的,那么只有在表单实例存在并且有句柄时才有效,而在它仍然构建时则不会。

必须打开表单以确保控件正常工作。

在构造函数上引发事件并不是最佳实践

【讨论】:

    【解决方案2】:

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

    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());你不需要辅助方法。
    猜你喜欢
    • 2010-10-21
    • 2015-05-06
    • 2012-08-18
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2020-08-17
    • 2010-09-14
    相关资源
    最近更新 更多