ASP.NET / C # путаница с динамически созданными элементами управления - PullRequest
3 голосов
/ 24 марта 2011

Я поигрался с шаблоном веб-приложения ASP.NET по умолчанию, и следующий код выдает исключение:

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

при нажатии на созданную кнопку.

Может кто-нибудь предложить техническое объяснение?

Примечание 1. Разметка - это просто пустая страница с заполнителем - см. Ниже.

Примечание 2. Подстановка Button для LinkButton, а код не выдаетисключение и работы.

public partial class test : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        foo();
    }
    protected override void OnLoad(EventArgs e)
    {
        foo();
    }
    protected void foo()
    {
        placeholder1.Controls.Clear();
        placeholder1.Controls.Add(new Button() { Text = "test", ID = "btn" });
    }
}

Разметка:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test.aspx.cs" Inherits="WebApplication1.test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:PlaceHolder runat="server" ID="placeholder1" />
    </div>
    </form>
</body>
</html>

Ответы [ 3 ]

0 голосов
/ 24 марта 2011

Я думаю, что кнопка будет нулевой, как только она вернется с постбека.По сути, вы удаляете кнопку и создаете новую кнопку, которая, скорее всего, удалит связанное событие.

Просто для поддержки моей работы я попытался это сделать:Вы получили.

Почему вы хотите добавить кнопку во время выполнения, как вы?

0 голосов
/ 28 мая 2011

Если вы удалите вызов функции foo () из OnLoad (), я думаю, код начнет работать.

Причина этого связана с порядком событий в жизненном цикле страницы. Чтобы элемент управления мог вызывать события, он должен быть создан до того, как произойдут события ProcessPostData (), RaiseChangedEvents () и RaisePostBackEvents () (графическое представление жизненного цикла страницы см. http://www.eggheadcafe.com/articles/o_aspNet_Page_LifeCycle.jpg) Эти события возникают после OnInit (), но до OnLoad ()

Поскольку ваш код стоит в данный момент, вызывая foo () в OnLoad (), вы уничтожаете экземпляр, созданный при вызове foo () в OnInit (), и поэтому, когда вызывается событие, элемент управления, который его вызвал, больше не существует. следовательно, сообщение «Ссылка на объект не установлена ​​на экземпляр».

0 голосов
/ 24 марта 2011

Похоже, что placeholder1 или placeholder1.Controls имеет значение null. Это единственное объяснение исключения NullReferenceException с учетом вашего примера кода.

...