Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 形式。提前装弹_C#_Forms_Events - Fatal编程技术网

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,这可能不是实际发生的事情;all
this.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函数