Form1_Load即使在添加处理程序后也不会触发

时间:2011-03-04 18:22:47

标签: c# winforms event-handling form-load

自从我涉足C#以来,已经有很长一段时间了,但是我有一段时间让我的form_load开火了。这是最简单的事我无法想象它为什么不会开火!任何帮助将不胜感激。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AppName_v4._0___TestRoom_Addon{
    public partial class Form1 : Form{

        public Form1() {
            InitializeComponent();
            this.Load += new EventHandler(this.Form1_Load); //FIRES!
        }

        private void Form1_Load(object sender, EventArgs e) {
            webKitBrowser1.Dock = DockStyle.Fill; //DOES NOT FIRE!
            webKitBrowser1.Navigate("http://192.168.0.10/?zoneid=11");
        }

    }
}

更新

  • 我使用了断点来验证该行不是他的
  • 表单确实显示 Screenshot of resulting Form

我也试过以下但没有成功......

namespace AlphaEntry_v4._0___MailRoom_Addon{
    public partial class Form1 : Form{

        public Form1() {
            InitializeComponent();

        }

        protected override void OnLoad(EventArgs e)
        {
            webKitBrowser1.Dock = DockStyle.Fill;
            webKitBrowser1.Navigate("http://192.168.0.10/?zoneid=11");

            base.OnLoad(e);
        }


    }
}

UPDATE#2 我能够通过删除并重新添加对WebKit Control的引用来实现此功能。不确定发生了什么。谢谢大家。

9 个答案:

答案 0 :(得分:7)

我刚刚解决了同样的问题。根本原因应该是在加载Form1时未触发Form1_Load事件。只需在Designer视图中打开Form1,单击Form1的标题,单击Form1属性下的'Event'标签,在属性列表中找到'Load',您将在其右侧找到一个事件列表。选择“Form1_Load”,重建它。您可以通过选择Form1_Load以外的任何事件来验证是否调用了Form1_Load()。

答案 1 :(得分:4)

通常更好的方法是处理内部事件的重写虚拟方法,而不是注册被触发的事件。

protected override void OnLoad(EventArgs e)
{
  // Your code here

  base.OnLoad(e);
}

如果不调用它会很有趣。

答案 2 :(得分:4)

这是一种解决方法:

InitializeComponent();之后直接插入您的代码 在此调用之后,表单的私有字段被初始化,您可以与UI对象进行交互。

我知道这不会直接回答这个问题,但在大多数情况下都应该有效。

答案 3 :(得分:3)

  

这是我能想象的最简单的事情,为什么它不会开火!

我怀疑问题并不在于它“不会触发”,而在于所讨论的代码并没有像你怀疑的那样处理事情。

尝试在“* .Dock”行上设置断点。鉴于上面的代码,一旦你显示这个表单就应该打它。但是,因为它是Form.Load事件,所以只有在通过form.Show()实际显示表单实例时才会发生这种情况。

答案 4 :(得分:3)

我能够通过删除并重新添加对WebKit Control的引用来实现此功能。不确定发生了什么,但John Arlen的评论引导我朝着正确的方向前进。谢谢大家。

答案 5 :(得分:2)

我来到这里是因为同样的问题。我一看到更新:

  

我能够通过删除并重新添加对WebKit Control的引用来实现此功能。不确定发生了什么。谢谢大家。

我意识到我的情况出了什么问题。像斯科特一样,我在一段时间内没有完成任何c#而忘记了一个关键的细节。

我想要一些简单的示例代码来检查listview是否按照我需要的方式工作。最好的文档是工作代码,所以我从https://www.dotnetperls.com/listview复制了一个样本。解雇VS2010并将代码粘贴到为我生成的Visual Studio表单程序中。跑了,得到了与斯科特完全相同的东西 - 一张带有空白列表的空白表格。

原因是在Visual Studio中,当您向表单添加控件时,您不会自动获取所有事件处理程序 - form_load是缺少的处理程序之一。您可以获得用于绘制控件的代码。要告诉Windows您有表单加载事件的处理程序,您必须添加

  

this.Load + = new System.EventHandler(this.Form1_Load);

到表单的InitializeComponent中的代码。当我将控件添加到表单中时,该行丢失了,因此我的处理程序没有被调用。

您可以手动添加该行,也可以进入Visual Studio的设计窗口,然后单击表单的空白部分。您将看到一个自动生成的新空存根,如下所示:

  

private void Form1_Load_1(object sender,EventArgs e)

     

{

     

}

下划线-1被添加到名称上,因为我已经有了无效的Form1_Load例程。

如果您再检查form1.designer.cs代码,您会看到this.load + = ....行已添加到初始化代码中。

有时简单的示例代码并非如此简单。

答案 6 :(得分:0)

它不会触发的另一个原因是,如果您使用DataBindings并且因为更改了属性名称或删除了属性而出现错误。

答案 7 :(得分:0)

今天遇到这个,起初困惑。在阅读了这个和类似的建议解决方案后,我的神秘感被解锁了。

首先:我如何快速确定我的问题 - 我将this.Load事件注册为设计器生成的代码中InitializeComponent()的第一行。然后我的断点到了。然后我为所有抛出的异常打开“break”,包括native。这让我直截了当地解决了这个问题。

在我的情况下,包含一个网络控件导致负载在一个令人惊讶的早期时刻发生,就在施工后;我的代码是用假设编写的,在UI中最终激活页面时会发生Load。它依赖于尚未设置的状态变量。

其他问题,如缺少依赖延迟的DLL,上游Load处理程序中的异常等,都可以通过这种方式进行跟踪。

修好之后,我把它移动了。载荷()回到原来的位置。

答案 8 :(得分:0)

这里的聚会有点晚了,但只需双击 Form1.cs [设计] 选项卡上的标题,它就会创建 Form1_Load 函数,然后它就可以正常工作了。

手动编写它似乎不起作用,因为当您双击它时会创建连接,就像双击按钮、列表框等时发生的相同功能一样。