Form.Load提前开火

时间:2015-05-20 16:15:13

标签: c# forms events

我有一个用户控件,其中Load事件过早发生。用户控件有几个对象传递给构造函数,并且有一个load事件。

public int num;
public String value;

public myControl(int num, String value)
{
    InitializeComponent();
    this.num = num;
    this.value = value;
}

private void MyControl_Load(object sender, EventArgs e)
{
    sometextbox.Text = value;
    someothertextbox.Text = num.ToString();
}

我的问题是无论何时调用控件,初始化都会过早地调用Load事件。在Designer.cs中接近InitializeComponent()的末尾,它使用此代码将Load事件添加到控件

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

在它添加事件处理程序之后,就会转到事件。所以如果我在Designer中有这样的东西......

Some code 1
Some code 2
this.Load += new System.EventHandler(this.MyControl_Load);
Some code 4
Some code 5

它实际上将跳过InitializeComponent()并运行MyControl_Load,然后返回并完成somecode4和somecode5。

这通常不是问题,因为Load只是设置一些文本框,但它们使用的是通过构造函数传递的值,并且由于值是在initializeComponent()之后设置的,所以一切都结束了为NULL。

简短的回答是将this.num = numthis.value = value放在对initializeComponent()的调用之上,但这个完全相同的方法适用于多个其他用户控件,我只是好奇为什么这个方法不适用于此用户控件。

1 个答案:

答案 0 :(得分:2)

我同意adv12,这可能不是实际发生的事情;所有this.Load += new System.EventHandler(this.MyControl_Load);都会注册事件,而不是实际触发它。

话虽如此,请记住设计师只是一个为您生成代码的工具。如果你想要更多控制,你可以自己做设计师做的事情(以及更多!)。

因此,如果您遇到问题,而不是在设计器中添加Load事件,请更改您的代码:

public int num;
public String value;

public myControl(int num, String value)
{
    InitializeComponent();
    this.num = num;
    this.value = value;
    InitializeTextboxes();
}

private void InitializeTextboxes()
{
    sometextbox.Text = value;
    someothertextbox.Text = num.ToString();
}

您可能希望阅读Hans Passant的答案here以及您在构造函数中应该/不应该做什么。