C# 形式。提前装弹
我有一个用户控件,加载事件触发得太早。用户控件有一对传递到构造函数的对象,并有一个加载事件C# 形式。提前装弹,c#,forms,events,C#,Forms,Events,我有一个用户控件,加载事件触发得太早。用户控件有一对传递到构造函数的对象,并有一个加载事件 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, EventAr
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();
}
我的问题是,无论何时调用控件,initialize都会过早地调用Load事件。在Designer.cs中InitializeComponent()的末尾,它使用以下代码向控件添加加载事件
this.Load += new System.EventHandler(this.MyControl_Load);
在添加事件处理程序之后,它立即进入事件。所以如果我在设计师中有这样的东西
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结束
这通常不是问题,因为加载只是设置一些文本框,但它们使用的是通过构造函数传入的值,并且由于这些值是在initializeComponent()之后设置的,因此所有内容都将以NULL结束
简单的回答是将
this.num=num
和this.value=value
放在对initializeComponent()的调用之上,但这个完全相同的方法适用于多个其他用户控件,我只是好奇为什么这个方法不适用于这个用户控件。我同意adv12,这可能不是实际发生的事情;allthis.Load+=new System.EventHandler(this.MyControl\u 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关于在构造函数中应该/不应该做什么的回答 你所描述的听起来不可能。注册事件处理程序不会导致立即调用该事件处理程序。是否已在调试器的
this.Load+=new System.EventHandler(this.MyControl\u Load)行中放置断点代码>并通过它进行跟踪?这些文本框是自定义控件的子项吗?问题中没有任何提示,您必须发布复制代码。或者不必麻烦,因为在本例中使用Load事件是错误的,请将代码移动到构造函数中。对于延迟,很抱歉,但我已经调试了所有过程-只要注册了该事件,就会立即调用它。这太奇怪了。是的,这是我考虑过要做的另一件事,但我仍然好奇eventhandler寄存器最终如何调用load函数