OnLoad 方法可用于 UserControl 但不适用于 Control

OnLoad method available for UserControl but not for Control

在 Windows 窗体中。

我有一个自定义控件,它只包含一个控件:PictureBox。

public partial class VarIllumButton : UserControl

它使用 OnLoad 方法:

    protected override void OnLoad(EventArgs e) 
    {
        base.OnLoad(e); // Handle the default function
        pictureBox.Image = image0;
    }

由于自定义控件只有1个控件,我想改成:

public partial class VarIllumButton : PictureBox

但是我得到一个错误

'System.Windows.Forms.PictureBox' does not contain a definition for 'OnLoad'    

然而,我看到 the Control class does have an OnLoad method

你能想到为什么我可以从 UserControl 访问它,而不是从 Control 访问它吗?

有没有我可以使用的另一种方法,即在控件完成加载时调用的方法?

(假设这是一个 ASP.NET 问题)

您的源代码中似乎有一个不正确的 using 指令,例如:

using System.Windows.Forms;

因此您的控件派生自 System.Windows.Forms.Control,它没有 OnLoad 方法。

将 using 指令替换为 using System.Web.UI;,它应该可以编译(尽管 System.Web.UI 中没有 PictureBox 控件)。

UserControl 有一个加载事件 protected virtual void OnLoad(EventArgs e) [System.Windows.Forms.UserControl.Load] 并且因为它是虚拟的,所以它可以像您所做的那样被覆盖。

但是 PictureBox 没有任何此类事件,因此您无法覆盖。相反,它有一个 public 方法加载 public void Load() 和事件,如 public event AsyncCompletedEventHandler LoadCompletedpublic event ProgressChangedEventHandler LoadProgressChanged 等。这就是你得到错误的原因。

UserControl UserControl -> ContainerControl -> ScrollableControl -> Control 的继承层次结构,PictureBox 是 PictureBox -> Control,public void Load() 只是一个 public PictureBox 中的方法 class。

正如我在评论中提到的,提及 OnLoad 的 MSDN 文档是针对 Web UI 控件的,而不是 the WinForms one。 WinForms 没有 OnLoad 方法。

最好的地方是在构造函数中分配图像,但不幸的是你提到这是不可能的。也许您可以处理 OnCreateControl/CreateControl 事件,或者您应该让控件的用户在正确的时间分配图像。

我通常建议避免使用 form/control 的 Load 事件来做事,因为 64 位 windows 上的 32 位程序存在异常被吞噬的问题[ SO Q&A, article].