[英]All controls are null within 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!";
這實際上在我的用戶控件test
設置了文字控件的Text屬性。
這引發了一個異常:
你調用的對象是空的
當它試圖設置
lblTest.Text = value;
null為null的對象是lblTest
。
我沒有正確添加用戶控件嗎? 我應該 - 或者我必須 - 在注冊標簽時指定Src
屬性嗎? 如果是這樣,我必須注冊我使用的每個用戶控件?
這也導致usercontrol中沒有控件加載,並且usercontrol中的所有控件都為null。
如果用戶控件在您當前的項目中,那么您需要在register語句中包含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中使用新名稱控件,但在設計器文件中引用具有舊名稱的控件。 在運行時,這將導致設計器文件屬性為null。
經過多次燒毀之后,如果我在源視圖中進行了任何更改,我要么檢查設計器文件是否已正確更新,要么切換到設計視圖,進行微小更改,然后保存頁面/用戶控制。
當我在錯誤的方式后面的代碼中添加用戶控件時,我遇到了這個問題。 您必須使用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);
這里的問題通常是由於用戶控件的加載機制,它們通常在頁面之后加載。 因此,在包含page_load方法期間,尚未在usercontrol上初始化控件(導致null ref)。 解決此問題的一種方法是在usercontrol上創建和設置屬性,並讓usercontrol在其Page_Load方法中連接/填充自己的UI。
像這樣的東西:
//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;
}
請嘗試將代碼放在Page_prerender事件頁面中。 它會對你有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.