用户控件加载事件未触发。

7

我有一个WinForms应用。我的Form派生类有一个UserControl派生类。我简单地将几个控件放入一个UserControl中,以便简化重用。但是UserControlLoad事件没有触发。我需要设置一些属性吗?


2
请展示你的代码(大纲)。 - H H
你是否已经在类中为每个用户控件订阅了 onload 事件? - Ravisha
3个回答

15
尝试在你的用户控件中重写 OnLoad() 方法。 来自 MSDN 的说法:

OnLoad 方法还允许派生类处理事件而无需附加委托。 这是在派生类中处理事件的首选技术。

protected override void OnLoad(EventArgs e)
{
    //Your code to run on load goes here 

    // Call the base class OnLoad to ensure any delegate event handlers are still callled
   base.OnLoad(e);
}

谢谢@Ashley,它完美地运行。您是否知道为什么在某些情况下OnLoad事件不起作用,但覆盖OnLoad时,每次都能正常工作? - Samuel

3

对于UserControl的事件触发,您无需设置任何特殊属性。有两种方式可以订阅事件。在属性(属性网格)中选择事件列表...双击“Load”属性。所有必要的代码都将被放置,并且光标将在适当的方法处等待您。

第二种方法是这样订阅事件:

public MyMainForm( )
{
    InitializeComponents();
    myUserControl.Load += new System.EventHandler(myUserControl_Load);
}

void myUserControl_Load(object sender, EventArgs e)
{
    MessageBox.Show(((UserControl)sender).Name + " is loaded.");
}

1
我完全按照您在此编写的代码操作,但是它根本不起作用。如果我改为覆盖OnLoad方法,就可以正常工作... - Ted
嗯...看起来MSDN更清楚,所以我也会选择那个。 - IAbstract
Load+= 必须出现在 InitializeComponents() 之前。 - Batavia

1

Load事件停止触发的一个原因是您的控件有一个父控件执行了以下操作:

    protected override void OnLoad(EventArgs e)
    {
     //do something
    }

你总是需要确保做到这一点

    protected override void OnLoad(EventArgs e)
    {
     //do something
     base.OnLoad(e);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接