Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 15 su 15
  1. #11
    Sì, scusa, hai ragione.
    Per quanto riguarda il file .cs, ho dichiarato l'ereditarietà in questo modo:

    codice:
    public partial class Customer_ToDo : ToDo 
                          { protected override void Page_Load(object sender, EventArgs e)
                                 { 
                                        base.Page_Load(sender, e); 
                                 }
                           }
    Per quanto invece riguarda l'ascx, io non ho scritto nulla, è così:

    codice:
    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Customer_ToDo.ascx.cs" Inherits="CRME_Web.Controls.Customer_ToDo" %>
    La pagina aspx che ospita il controllo invece, ha questo:

    codice:
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Prove.aspx.cs" Inherits="CRME_Web.Prove" %> <%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="asp" %>
     <%@ Register src="Controls/Customer_ToDo.ascx" tagname="Customer_ToDo" tagprefix="uc1" %> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
        <title></title> 
    </head> 
    
    <body> 
        <form id="form1" runat="server"> 
            <uc1:Customer_ToDo ID="Customer_ToDo1" runat="server" /> 
        </form> 
    </body> 
    
    </html>

    Quando provo ad accedere ai controlli, scrivo cose come questa:

    codice:
    { protected override void Page_Load(object sender, EventArgs e) 
        { 
         base.Page_Load(sender, e); 
         LabelProva.Text = "Riscritto";
    
         //LabelProva è un label creato tramite asp.net nell'user control standard, e si prevede        ereditato nell'user control customer, quello in unso in questo codice
    
        }
    Quando provo a scrivere una cosa come questa, l'intellisense mi trova il controllo e me lo suggerisce. Quando però lo eseguo, mi dice

    NullReferenceException: non è stata gestita dal codice utente.
    Riferimento a un oggetto non impostato su un'istanza di oggetto

  2. #12
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    ho provato a fare quanto proponi e purtroppo ho constatato che ereditando da un usercontrol si perde tutto il meccanismo tipico della pagina/usercontrol. Credo che l'unica maniera sarebbe quella di fare l'override di tutti i metodi/eventi della classe usercontrol ma non la trovo un idea ottimale.

    questo mi riporta a quanto osservavo nei post precedenti e cioè che l'ereditarietà non si sposa molto con gli usercontrol. Gli usercontrol favoriscono la "composition" ed è piu corretto se chi li usa non li erediti ma al massimo li utilizzi in un ulteriore usercontrol. Per farti un esempio pensa al controllo login. Se volessi fare un usercontrol non erediteresti il controllo login ma lo inseriresti dentro il tuo uc insieme a tutto il resto (composition). Il controllo login rimane una "scatola chiusa" dentro un altra scatola chiusa: la tua o quella di un altro utente e, a patto di non toccare la sua interfaccia, sarà sempre possibile effettuare un aggiornamento del controllo mantenendo la retrocompatibilità.
    In queso caso però chi costruisce controlli di terze parti non si deve preoccupare troppo di questo: se la retrocompatibilità non puo essere garantita semplicemente lo si documenta.

    imho.

  3. #13
    Mmm... andiamo per gradi.
    1 - Gluck74 scrive:
    Se crei i controlli da codice nel codebehind, stai sicuro che non ci accedi!!!
    Se invece li crei come controlli nella parte ascx, puoi raggiungerli verificando ed eventualmente modificando in public la loro dichiarazione.
    Io, dopo aver creato tutto nell'ascx, sono andato nel file designer.cs, e impostato tutto in public. Definita l'ereditarietà tra gli user control, ho provato ad accedere ai controlli standard dall'UC costumer. Non li trova, nel senso che non trova l'istanza di oggetto a cui mi riferisco, ma stranamente l'intellisense mi suggerisce il controllo in questione.

    mi viene da pensare quindi che abbia ragione rsdpzed:
    ho provato a fare quanto proponi e purtroppo ho constatato che ereditando da un usercontrol si perde tutto il meccanismo tipico della pagina/usercontrol. Credo che l'unica maniera sarebbe quella di fare l'override di tutti i metodi/eventi della classe usercontrol ma non la trovo un idea ottimale.
    2 - Se creo i controlli non in code behind ma nella pagina ascx, non riesco a farli visualizzare nell'UC costumerizzato. Probabilmente sbaglio nel definire l'ereditarietà, ma non funziona. Semplicemente io definisco il legame:
    codice:
    public partial class Customer_ToDo : ToDo
    e poi trascino in una pagina aspx l'UC costumer. C'è dell'altro da fare?

  4. #14
    confermo quello detto da rsdpzed:
    essendo i tuoi controlli degli WebUserControl (diversi dai WebCustomControl), non puoi fare quello che erroneamente ti ho suggerito.

    Quindi:
    1 - crei il tuo BaseControl.ascx normalmente esponendo con proprietà i dati
    2 - crei il tuo Extended.ascx (non una classe cs)

    ora hai due strade:
    a - dentro Extended.ascx metti un controllo BaseControl.ascx
    pro: rimane la visualizzazione in Design-Time
    def: Devi esporre nuovamente i dati tramite nuove proprietà

    b - Extended.ascx eredita dalla classe BaseControl (non da UserControl)
    pro: espone tutte le proprietà senza toccare una riga di codice
    def: non hai la visualizzazione in Design-Time (non so se si può implementare)

    Viceversa, lasci perdere gli userControl ed implementi un WebControl o CompositeControl
    Qui un corso approfondito:
    http://msdn.microsoft.com/en-us/library/aa530687.aspx

  5. #15
    Alura. Credo di essere giunto a una conclusione. Ho provato e sembra funzionare, anche se da cosa ho capito è un utilizzo "improprio" dei web user control.

    Nel WUC standard credo, tutto in code behind i miei controlli. Devo istanziarli fuori dal Load_Page, errore che prima facevo. Nel Page_Load posso specificare se mai le proprietà dei controlli. Per esempio:

    codice:
    public partial class standard : ....
    {
           // Creo la proprietà
           protected Label prova;
    
           // La istanzio nel costruttore
           public standard()
               : base()
           {
                 this.prova = new Label();
            }
    
            public void Page_Load(....)
            {
                 prova.Text = "provaaaaaaaa";
             }
    
    }
    In questo modo posso creare un WUC che erediti da quello standard che riesca ad accedere direttamente alle proprietà e ai metodi del WUC padre. Funziona, ho provato. La pecca è che devo fare tutto code behind, e io che sono all'inizio con c# fatico parecchio. Ma da una parte è meglio così. Forse è la stessa cosa che ha detto nel post prima Gluck74:

    Extended.ascx eredita dalla classe BaseControl (non da UserControl)
    pro: espone tutte le proprietà senza toccare una riga di codice
    def: non hai la visualizzazione in Design-Time (non so se si può implementare)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.