У меня есть 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;
}
}
}
Это может сработать... так что UserControl с этим не виден, но существует ли объект?
Да он до сих пор существует. Но вы спрашиваете о Я хочу не отображать UserControl?
Вы правы в том, что я сказал. Я хотел бы исправить это, сказав, что я не хочу, чтобы он создавался.
Инстанцирование отличается от OnLoad.
Я также предлагаю переместить base.OnLoad(e); в последнюю строку блока try, если это приемлемо для вашей логики.





Создание экземпляра происходит с помощью конструктора, и это отличается от OnLoad, который происходит при создании элемента управления. Вы не можете предотвратить создание экземпляра в OnLoad, это слишком поздно, однако вы можете сделать это в конструкторе, вызвав исключение.
Что вы можете сделать в OnLoad, так это предотвратить видимость элемента управления, установив для его свойства Visible значение false, а также, если вас беспокоит удаление элемента управления, вы можете удалить его из родительской коллекции элементов управления, а затем удалить его:
Visible = false;
Parent.Controls.Remove(this);
Dispose();
Имейте в виду, что все ссылки на элемент управления будут указывать на удаленный объект, а IsDisposed элемента управления будет истинным, а вызов его членов приведет к ObjectDisposedException. Но ссылки на элемент управления не нулевые.
Можно ли удалить объект изнутри его onload?
@GuidoG Да, это так. И тогда свойство IsDisposed элемента управления истинно, и попытка вызова его методов и свойств приведет к ObjectDisposedException. Например, если у вас есть myView1 контроль типа MyView (описанного в вопросе), то после утилизации myView1.IsDisposed будет true.
Я получаю InvalidOperationException в своем переопределении Dispose в строке base.Dispose(disposing);: «Value Dispose() не может быть вызван при выполнении CreateHandle()»
Но когда вы удаляете его из родителя и утилизируете, нужен ли тогда Visible = false;?
@GuidoG Не совсем так, но я бы оставил его, потому что это главное, что задается в вопросе.
@AllLelopath Никаких исключений в чистом UserControl поэтому любое исключение, вероятно, будет вызвано вашими пользовательскими реализациями в распоряжении.
В чем проблема
Visible = false;?