Подтвердить что ты не робот

Все элементы управления имеют значение 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.

4b9b3361

Ответ 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);