簡體   English   中英

usercontrol中的所有控件都為null

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM