Все элементы управления имеют значение null в usercontrol
У меня есть UserControl, который использует UserControl среди других элементов управления.
В файле ascx
у меня есть следующий код:
<%@ Register TagPrefix="tag" Namespace="some.name.space" Assembly="some.assembly" %>
<tag:control ID="test" runat="server" />
В моем методе Page_Load
я пытаюсь установить свойство на тест следующим образом:
test.Text = "Hello World!";
Это фактически устанавливает свойство Text элемента управления literal в моем пользовательском элементе управления test
.
Это генерирует исключение:
Ссылка на объект не установлена в экземпляр объекта
Когда он пытается установить
lblTest.Text = value;
Объектом, который является null, является lblTest
.
Я не добавляю пользовательский контроль правильно? Должен ли я - или мне нужно - указать свойство Src
при регистрации тега? Если это так, мне придется регистрировать каждый пользовательский контроль, который я использую?
Это также приводит к отсутствию контроля загрузки в usercontrol, и все элементы управления имеют значение null в usercontrol.
Ответы
Ответ 1
Если пользовательский элемент управления находится в вашем текущем проекте, вам необходимо включить src в оператор регистрации:
<%@ Register TagPrefix="uc1" TagName="NavTop" Src="controls/NavTop.ascx" %>
Однако, если вы используете этот элемент управления пользователя более чем на одной странице, вы также можете зарегистрировать его в web.config:
<system.web>
<pages>
<controls>
<add tagPrefix="uc1" tagName="NavTop" src="~/controls/NavTop.ascx" />
</controls>
</pages>
</system.web>
Еще одна вещь, о которой нужно помнить: бывают случаи, когда дизайнер визуальной студии не "видит" ваши изменения в элементах управления на странице, если вы вносите изменения в исходное представление. Например, если вы измените имя элемента управления, вы можете получить элемент управления с новым именем в ascx, но ссылку на элемент управления со старым именем в файле конструктора. Во время выполнения это приведет к тому, что свойство файла конструктора будет равно null.
После того, как это произошло несколько раз, если я внесу какие-либо изменения в исходном представлении, я либо проверю, чтобы убедиться, что файл конструктора был правильно обновлен, либо я переключусь на дизайн, внеся незначительные изменения, а затем сохраните управление страницей/пользователем.
Ответ 2
Проблема здесь, как правило, связана с механикой загрузки пользовательских элементов управления, они загружаются после обычной страницы. Таким образом, элементы управления еще не были инициализированы в вашем usercontrol (вызывающем null ref) во время содержащего метода page_load. Один из способов обойти это состоит в том, чтобы просто создать и установить свойство в usercontrol и подключиться к usercontrol/заполнить свой собственный интерфейс в своем методе Page_Load.
Что-то вроде этого:
//Page
protected void Page_Load(object sender, EventArgs e)
{
test.Text = "Hello World!";
}
//User Control
public string Text {get; set;}
protected void Page_Load(object sender, EventArgs e)
{
lblTest.Text = Text;
}
Ответ 3
Попробуйте ввести код в Page_prerender событие страницы. Он будет работать для вас.
Ответ 4
У меня была эта проблема, когда я добавлял пользовательский элемент управления в неправильный код. Вы должны использовать метод Page.LoadControl для инициализации элемента управления, который вы не можете просто использовать.
//WRONG
UserControls.BingoCardPage bcp = new UserControls.BingoCardPage();
form1.Controls.Add(bcp);
//RIGHT
UserControls.BingoCardPage bcp = (UserControls.BingoCardPage)Page.LoadControl("~/UserControls/BingoCardPage.ascx");
form1.Controls.Add(bcp);