У меня неприятная проблема, у которой есть обходной путь, но я хочу, чтобы код был как можно более похожим. Проблема связана с конкретной переменной в базовом классе для моих пользовательских элементов управления, которая может быть или не быть нулевой, и она никогда не должна быть нулевой.
В основном у меня есть несколько пользовательских элементов управления с одним базовым классом, который захватывает экземпляр моего основного окна формы, поэтому пользовательский элемент управления имеет доступ к свойствам основной формы и может вызывать методы в основной форме. Вот фрагмент (this.frmParent является публичным участником):
private void ucBase_Load( object sender, EventArgs e )
{
// Establish the link to the main form.
this.frmParent = FindForm() as frmMain;
}
Затем каждый пользовательский элемент управления использует этот базовый класс:
public partial class ucLiberty : ucBase
Затем в основной форме я вызову пользовательский элемент управления следующим образом:
ucLiberty Liberty = new ucLiberty();
IQDevicePath = Liberty.GetIQDrivePath();
По какой-то причине, когда я создаю экземпляр пользовательского элемента управления (в данном случае он находится в основной форме), переменная frmParent в базовом классе может быть заполнена или не заполнена ненулевым значением.
Я заметил, что событие загрузки в пользовательском элементе управления не запускается. Я нашел метод под названием CreateControl (), который должен принудительно создать элемент управления, а затем мое событие load начало срабатывать, однако, когда я отследил выполнение в отладчике, я добрался до базового класса, где он пытался заполнить frmParent, FindForm () не всегда возвращает ненулевое значение.
У меня есть другие пользовательские элементы управления, с которыми у меня нет этой проблемы, и разница между ними в том, что некоторые пользовательские элементы управления имеют дочерние элементы управления, а некоторые не имеют дочерних элементов управления. У того, у кого нет дочерних элементов управления, есть эта проблема.
Мой обходной путь - отслеживать, какой пользовательский элемент управления FindForm () выходит из строя, и в событии загрузки этого пользовательского элемента управления присваивать значение с помощью вызова конструктора основной формы, примерно так:
this.frmParent = new frmMain();
Однако мне все еще нужен вызов CreateControl () для запуска события load, и мне не нравится идея требовать, чтобы будущие сопровождающие имели явные знания о различных поведенческих императивах. Другими словами, я бы хотел, чтобы все мои пользовательские элементы управления работали одинаково, чтобы упростить обслуживание.
Я разорвал свой код на части и не могу понять, почему иногда событие загрузки пользовательского элемента управления может или не может срабатывать, и почему не удается вызвать FindForm () в базовом классе пользовательского элемента управления.
Есть ли у кого-нибудь идеи, как решить эти проблемы? Спасибо.