Все элементы управления равны нулю в пользовательском контроле - PullRequest
21 голосов
/ 17 ноября 2011

У меня есть 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 литерального элемента управления в моем пользовательском элементе управления test.

Это исключение:

Ссылка на объект не установлена ​​для экземпляра объекта

Когда он пытается установить

lblTest.Text = value; 

Нулевым объектом является lblTest.

Не правильно ли я добавляю пользовательский элемент управления? Должен ли я - или я должен - указать свойство Src при регистрации тега? Если так, я должен был бы зарегистрировать каждый пользовательский контроль, который я использую?

Это также приводит к тому, что элементы управления не загружаются в usercontrol, и все элементы управления равны нулю в usercontrol.

Ответы [ 4 ]

28 голосов
/ 17 ноября 2011

Если пользовательский элемент управления находится в вашем текущем проекте, то вам необходимо включить 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>

Еще одна вещь, о которой следует помнить: бывают случаи, когда дизайнер Visual Studio не «видит» ваши изменения в элементах управления на странице, если вы вносите изменения только в виде исходного кода. Например, если вы измените имя элемента управления, вы можете получить элемент управления с новым именем в ascx, но ссылку на элемент управления со старым именем в файле конструктора. Во время выполнения это приведет к тому, что свойство файла конструктора будет нулевым.

После того, как это было сожжено несколько раз, если я внесу какие-либо изменения в исходное представление, я либо проверяю, правильно ли обновлен файл конструктора, либо я переключаюсь в режим конструктора, вносим незначительные изменения, затем сохраняю страница / пользовательский контроль.

5 голосов
/ 19 января 2018

У меня была эта проблема, когда я добавлял пользовательский элемент управления в коде за неправильным способом. Вы должны использовать метод Page.LoadControl для инициализации элемента управления, который вы не можете просто использовать new.

        //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);
5 голосов
/ 17 ноября 2011

Проблема здесь обычно связана с механикой нагрузки пользовательских элементов управления, они обычно загружаются после страницы. Таким образом, в результате элементы управления еще не были инициализированы в вашем usercontrol (вызывая нулевой ref) во время содержащего метода page_load. Один из способов обойти это состоит в том, чтобы просто создать и установить свойство в 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;
}
1 голос
/ 17 ноября 2011

Пожалуйста, попробуйте ввести код в событие Page_prerender страницы. Это будет работать для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...