5

È possibile ereditare un controllo utente da un altro controllo utente?Come ereditare un UserControl da un altro UserControl?

Quello che sto cercando di ottenere è un controllo utente che eredita da un altro controllo utente. Quindi ho baseusercontrol.ascx, e questo ha solo il testo "Stuff". Quindi ho un altro controllo utente, childusercontrol.ascx che eredita da baseusercontrol.ascx. Se non cambio nulla in childusercontrol.ascx, mi aspetterei che il testo baseusercontrol.ascx visualizzi "Stuff".

E inoltre dovrei essere in grado di estendere le funzionalità di controllo utente di base in quella derivata.

Ho anche provato qualcosa come this, ma non è abbastanza nel mio caso.

Ora il mio childusercontrol.ascx sembra trovarsi al di sotto

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="childusercontrol.ascx.cs" Inherits="test_childusercontrol" %> 
<%@ Register src="baseusercontrol.ascx" tagname="baseusercontrol" tagprefix="uc1" %> 

childusercontrol.ascx.cs come di seguito

public partial class test_childusercontrol : baseusercontrol 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
} 

Quando si naviga in questa pagina ottenendo errore Im come

Object reference not set to an instance of an object. 
Description : An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
Exception Details : System.NullReferenceException: Object reference not set to an instance of an object. 

Qualsiasi traccia?

+0

Puoi condividere il codice da baseusercontrol.ascx? Il tuo errore dice che hai un riferimento null su un numero di linea specifico. Ho il sospetto che tu abbia un riferimento nullo. o_O –

+0

Dovrai esaminare la traccia dello stack, proprio come ti dice il messaggio di eccezione. Quasi tutti i casi di 'NullReferenceException' sono uguali. Per alcuni suggerimenti, vedere "[Cos'è una NullReferenceException in .NET?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)". –

+1

Inoltre, no, i controlli utente non sono destinati ad essere ereditati. Il meglio che puoi fare è creare classi di base che ereditano 'UserControl', ma non contengono alcun markup (nessun file .ascx). –

risposta

3

Ho provato questa situazione per me stesso. In realtà non è possibile ereditare da una classe base che è un UserControl con il proprio codice ASCX.

Cosa si può fare però, è l'attuazione di alcune funzionalità di base in un (possibilmente astratto) classe di base (senza ASCX) come questo:

public class BaseClass:UserControl 
{ 
    public String BaseGreeting { get { return "Welcomebase!"; }} 
} 

e quindi utilizzare i metodi e le proprietà di questa classe di base in calcestruzzo UserControl classi che hanno il proprio file ASCX.

public partial class childusercontrol : BaseClass 
{ 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     Greeting = base.BaseGreeting; //As initial value 
    } 
    public String Greeting 
    { 
     get { return LabelGreeting.Text; } 
     set { LabelGreeting.Text = value; } 
    } 
}