异常时取消OnLoad

时间:2019-03-01 15:39:36

标签: c# .net winforms exception-handling user-controls

我有一个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;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

实例化由构造函数发生,它不同于OnLoad,后者在创建控件时发生。您无法阻止在OnLoad中实例化,为时已晚,但是您可以在构造函数中通过引发异常来实现。

您可以在OnLoad中进行的操作是通过将控件的Visible属性设置为false来防止控件可见,并且如果您担心控件的废弃,则可以从父项的控件集合中删除它,然后进行处理:

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

请记住,所有对控件的引用都将指向已处置的对象,并且控件的IsDisposed为true,调用其成员将得到ObjectDisposedException。但是对控件的引用不为空。