我有一个用户控件,其中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 = num
和this.value = value
放在对initializeComponent()的调用之上,但这个完全相同的方法适用于多个其他用户控件,我只是好奇为什么这个方法不适用于此用户控件。
答案 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以及您在构造函数中应该/不应该做什么。