UserControl не может отображаться в конструкторе — ссылка на нулевой объект

Я создал UserControl с полем со списком. Этот выпадающий список заполняется из xml, когда его нет, он загружается из файла ресурсов.
Он отлично работает в программе, но не может отображаться в дизайнере - пишет: "Ссылка на объект не установлена ​​на экземпляр объекта».

В классе, отвечающем за загрузку списка из xml, проверка нулевой ссылки пропущена по непонятным мне причинам...

public SortedDictionary<string, string> Countries
{
    get
    {
        if (object.ReferenceEquals(countries, null))
        {
            GetCountryList();
        }
        return countries;
    }
}

Заполнение comboBox происходит следующим образом:

comboBoxCountry.DataSource = new BindingSource(Program.language.Countries, null);

Program.language инициализируется в Программе, но Дизайнеру это не помогает.

Вопрос в том, как (когда, при каком событии) я должен заполнить ComboBox (= список загрузки из xml), чтобы иметь возможность отображать мой элемент управления в дизайнере.


person Lukas    schedule 22.07.2009    source источник


Ответы (2)


Если возможно, вы хотите проверить this.DesignMode, а затем просто не загружать ComboBox во время разработки.

person jasonh    schedule 22.07.2009
comment
Кажется, это работает. Есть ли причина, по которой ‹code›if(!this.DesignMode‹/code› не работает в конструкторе компонента, а работает в событии Load? - person Lukas; 23.07.2009
comment
Вроде бы игнорируется... Не работает - не отображается в дизайнере. public LoacationUserControl() { InitializeComponent(); if (!this.DesignMode) { LoadCountries(); } } Это работает: private void LoacationUserControl_Load(object sender, EventArgs e) { if (!this.DesignMode) { LoadCountries(); } } В обоих случаях содержимое LoadCountries() находится в if (!this.DesignMode){} - person Lukas; 23.07.2009

Задает ли GetCountryList() переменную-член? Если это так, переместите этот вызов в метод. Аксессуар свойства get и метод ToString() предполагаются чистыми: состояние программы до и после должно быть идентичным. Нарушение этого предположения может вызвать всевозможные проблемы, особенно несогласованность дизайнера/отладчика/среды выполнения. Различные тирады, но самое главное нужно понять предположение, следовать ему и позволить ему работать в ваших интересах во время отладки.

person Sam Harwell    schedule 22.07.2009
comment
Да, он инициализирует один. В основном это означает, что перед получением свойства мне придется вручную вызвать метод, заполняющий список и тем самым предоставляющий любые данные, необходимые свойству. Я прав? - person Lukas; 23.07.2009