2012-03-07 6 views
0

Я довольно новичок в сценарии .NET и столкнулся с небольшой проблемой с простым приложением asp.net и доступом к элементам управления, определенным в файле .ascx в код позади.Код Asp.net за отсутствием доступа к элементам управления в ascx

Вот мой Default.ascx файл:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" 
    CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> 
</asp:Content> 
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> 
    <p> 
     <asp:Label AssociatedControlID = "userText" AccessKey = "L" runat="server"      ID="userLabel">Username</asp:Label> 
     <asp:TextBox ID = "userText" runat="server" MaxLength="20" ></asp:TextBox> 
    </p> 
</asp:Content> 

Вот файл Default.aspx.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
    protected void Page_PreInit(object sender, EventArgs e) 
    { 
     userLabel.Text = "Hello!"; 
    } 

} 

Как вы можете видеть, довольно прямо вперед, все, что я пытаюсь do - это изменение текстового свойства метки программно. Однако, когда я запускаю это, я получаю исключение NullReferenceException, userLabel не установлен в экземпляр объекта. Должно ли userLabel быть свойством моего класса _Default? Я попытался явно установить userLabel как свойство, но получаю ошибку времени компиляции, говоря, что userLabel уже имеет определение.

Я полагаю, что мне не хватает чего-то очень простого здесь, но я не уверен, что это такое. Может ли кто-нибудь сказать мне, что я делаю неправильно? Большое спасибо!

ответ

1

Элементы управления недоступны до тех пор, пока они не будут инициализированы; элемент управления еще не создан в событии PreInit, поэтому вы не можете получить к нему доступ.

Значения, которые вы делаете, обычно должны выполняться в событии Load или, по крайней мере, после запуска события Init.

0

Я не вижу никакой ярлык с именем userLabel. Имя вашего ярлыка похоже на bel userText.

+1

Прокрутите направо. Это здесь. :) – Khan

1

Как вы можете прочитать here, в page_perinit вы не можете получить доступ к управлению, потому что они не существуют.

Это хорошая практика применить тему и персонализацию во время этого события, а не доступ к состоянию органов управления

1

Инициализация элементов управления должно быть сделана на Page_Init.

protected void Page_Init(object sender, EventArgs e) 
{ 
    userLabel.Text = "Hello!"; 
} 
1

Прежде всего, вы не можете просто открыть метку в пользовательском элементе управления с userLabel.Text. Вам нужно получить Label lbl = (Label)UserControlID.FindControl("userLabel"); на родительской странице. (Но то, что вам нужно, это множества юдоли метки в UserControl от родительской страницы.)

Так что я хотел бы сделать, как:

Put недвижимость в UserControl:

public string UserName {get; set;} 
protected void Page_Load(object sender, EventArgs e) 
{ 
    userLabel.Text = this.UserName; 
} 

В случае загрузки страницы из родительской страницы, установите значение свойства:

protected void Page_Load(object sender, EventArgs e) 
{ 
    UserControlID.UserName = "Hello!"; 
} 

Page_Load родительской страницы позвонит перед тем загрузки страницы UserControl, и это должно быть в порядке.