2010-03-01 35 views
2

我有一個基本的用戶控件(WC1),它繼承自WebUserControl和從WC1繼承的子用戶控件(WC2)。我在vs設計視圖中添加了一個文本框和一個標籤給WC1,而不是代碼隱藏。 但我放入WC1的所有服務器控件都是空的,並給出空指針異常。我嘗試訪問不同事件中的文本框和標籤,但它們全部爲空。asp.net UserControl繼承,基本用戶控件中的Web控件是空指針

有人知道這裏出了什麼問題嗎?謝謝。

步驟來重現錯誤:

  1. 創建的名爲WC1 web用戶控制VS
  2. 添加新項
  3. 加入VS的設計視圖中的文本框和標籤服務器控件WC1和放碼後面:var value = txetBox.Text;
  4. 創建的名爲WC2另一個Web用戶控件在VS添加一個新的項目並改變其基類WC1在後面
  5. 其代碼在VS和阻力WC2添加新項目的設計視圖中創建一個網頁頁面
  6. 運行頁面,那麼你將看到異常的代碼隱藏在WC1

代碼:

WC1:

code behind: 
    public partial class WC1: System.Web.UI.UserControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 
    } 

頁:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WC1.ascx.cs" Inherits="WebApplication1.WC1" %> 
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 

WC2: 後面的代碼:

public partial class WC2: WC1 
    { var txt = TextBox1.Text} 

頁:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WC2.ascx.cs" Inherits="WebApplication1.WC2" %> 

綜上所述,我的問題:

WC1的可以通過Web服務器控件是在這種情況下實例化?或者是否可以將用戶控件從其他用戶控件繼承,並將父級用戶控件的Web服務器控件傳遞給其子項,而不必擔心佈局?

好吧,我已經測試過,如果我不添加控件在WC1代碼隱藏,它將永遠不會被實例化。

+1

需要更多信息。你是否將控件聲明式添加到ASCX文件或在代碼隱藏文件中創建它們?你如何將用戶控件添加到頁面?一些代碼示例也會有幫助。 – 2010-03-01 00:09:09

回答

1

如果您未將基本類型設置爲WC1,則將控件添加到標記時,將在WC2的designer.cs中創建控件,並且這些控件都隱藏了從WC1繼承的控件。

要解決這個問題,只需打開WC2的designer.cs並刪除控件,那麼基類上的控件就是標記在編譯時所使用的。替代解決方案:確保您的基類是WC1,刪除設計器,右鍵單擊.ascx,然後選擇轉換爲Web應用程序,這將重新生成設計器,而不會創建它在基類中找到的控件。同樣的效果。

如果我誤解了你,並且你試圖繼承基本控件的標記 ......你不能這麼做,想想它將如何呈現,將會在何處?如果它是其他東西,請將您的標記和屬性都發布到兩個控件上,這可以清楚地說明發生了什麼。

+0

繼承標記可以像重寫方法調用base.method()一樣完成。例如,從WC1呈現標記的佔位符WC2。如果WC2沒有這樣的佔位符,則不會繼承標記。 – 2010-03-16 13:11:17