异常时取消 OnLoad

Cancel OnLoad on Exception

我有一个 UserControl 覆盖 OnLoad。如果发生异常,我不想实例化 UserControl。我该怎么做?

public partial class MyView : System.Windows.Forms.UserControl
{
    protected override void OnLoad(System.EventArgs e)
    {
        try
        {
            this._presenter.OnViewReady();
            base.OnLoad(e);
            InitializeViewComponents();
        }
        catch (Exception exception)
        {
            System.Windows.Forms.MessageBox.Show(exception.Message, 
                "Error Loading Project", 
                System.Windows.Forms.MessageBoxButtons.OK,
                System.Windows.Forms.MessageBoxIcon.Error);

            -- stop load here --
            //throw;
        }
    }
}

实例化由构造函数进行,它不同于 OnLoad 控件创建时发生的实例化。您不能阻止 OnLoad 中的实例化,为时已晚,但是您可以通过抛出异常在构造函数中进行。

您可以在 OnLoad 中做的是通过将其 Visible 属性 设置为 false 来防止控件可见,并且如果控件的处置是担心你,你可以从 parent 的控制集合中删除它,然后处理它:

Visible = false;
Parent.Controls.Remove(this);
Dispose();

请记住,所有对控件的引用,然后将指向已处置的 object,控件的 IsDisposed 将为真,调用其成员将导致 ObjectDisposedException.但是对控件的引用不为空。