Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    42

    Il controllo...deve essere inserito in un tag Form con runat=server

    Che cosa vuole??
    Spiego il mio problema: ho inserito nella mia pagina asp.net un volgarissimo pulsante:
    <asp:Button ID="Button1" runat="server" Text="Button" />
    e, da un metodo server, voglio cambiare il Text del bottone, con il seguente codice:

    Button pulsante = (Button)page.FindControl("Button1");
    pulsante.Text = "testo modificato";
    StringWriter sw = new StringWriter();
    HtmlTextWriter writer = new HtmlTextWriter(sw);
    pulsante.RenderControl(writer);
    sw.Close();

    all'esecuzione di "pulsante.RenderControl(writer);" si arrabbissima, va in eccezione http, e mi dice "Il controllo 'Button1' di tipo 'Button' deve essere inserito in un tag Form con runat=server." ...ma il tag form ha runat= "server" così come il mio pulsante!!!
    Prima di iniziare a scocciare la comunità ho cercato e da qualche parte ho letto che bastava fare override del metodo VerifyRenderingInServerForm, che io ho fatto nella pagina Default.aspx.cs (ovvero la pagina che contiene il pulsante)

    public override void VerifyRenderingInServerForm(System.Web.UI.Control control)
    {
    }

    ed è vero, l'errore non lo fa più...ma non fa più niente....
    e che faccio??
    Pat

  2. #2
    il codice che hai scritto non è necessario, basta del codice più semplice.
    Comunque non ho capito DOVE hai scritto questo codice.

    Io ti faccio un esempio presupponendo di mettere queste righe di codice dentro il gestore dell'evento PreRenderComplete
    codice:
    protected override void OnPreRenderComplete(EventArgs e)
    {
        Button1.Text = "Testo Modificato";
        base.OnPreRenderComplete(e);
    }
    Semplice no?

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    42
    chiedo venia...ma pensavo che meglio più che meno codice...il mio codice è nella classe App_Code/ClsCodici.cs
    mentre l'override l'ho messo nella default.aspx.cs.

    Pat

  4. #4
    ora ho capito perché non ti funzionava.
    Non puoi chiamare il render di un controlla da una classe esterna.

    principalmente devi utilizzare i metodi dei controlli e/o delle pagina, intendo dire modifica dell'interfaccia prevalentemente, direttamente nel code behind, mentre metti in classi esterne metodi che implementano funzioni di logica dell'applicazione.
    L'operazione che volevi fare era strettamente legata all'interfaccia, quindi da lasciare nella pagina.
    Ti faccio un semplice esempio (stupido e inutile) per farti capire cosa puoi mettere in classi esterne:

    codice:
    protected override void OnPreRenderComplete(EventArgs e)
    {
        Button1.Text = clsCodici.getTestoPulsante();
        base.OnPreRenderComplete(e);
    }
    codice:
    public static class clsCodici
    {
        public static string getTestoPulsante()
        {
            //qui la logica dell'applicazione
            //ad esempio reperire il testo in base alla lingua del client
            //leggere sul DB o su file di risorse e prelevare il testo
    
            return "testo modificato";
        }
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    42
    Scusami, ma oltre che ignorante sono anche dura di comprendonio:
    cosa devo fare al mio codice???
    nella classe server App_Code/csCodici.cs ho il metodo
    private void changeButton(Page page)
    {
    Button pulsante = (Button)page.FindControl("Button1");
    pulsante.Text = "testo modificato";
    StringWriter sw = new StringWriter();
    HtmlTextWriter writer = new HtmlTextWriter(sw);
    pulsante.RenderControl(writer);
    sw.Close();
    }

    e questo mi viene richiamato internamente, sotto alcune condizioni, da un'altro metodo server.
    Come faccio a farlo funzionare?
    Devo modificare il metodo VerifyRenderingInServerForm? lo devo sovrascrivere? se si..cosa deve fare?
    Uff...
    Pat

  6. #6
    mi scrivi anche il codice dell'altro metodo che chiama la ChangeButton?
    Inoltre, come viene chiamato quest'altro metodo? dalla pagina? nel load? facendo qualche operazione?
    Spiegami meglio

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    42
    Non ci posso credere che non mi mandi a quel paese!!
    Allora, questa è la mia classe incriminata, che è contenuta all'interno di APP_CODE/GestoreTool.cs


    ----------------------------------------------------------------------------

    public class Tool_Rect : ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServe rToolAction
    {
    public void ServerAction(ESRI.ArcGIS.ADF.Web.UI.WebControls.To olEventArgs tool)
    {
    Map map= (Map) tool.Control;
    Page page = map.Page;
    this.changeButton(page);
    }




    //****METODO CHE CAMBIA IL TESTO DEL PULSANTE***//

    private void changeButton(Page page)
    {
    Button pulsante = (Button)page.FindControl("Button1");
    pulsante.Text = "txt modificato";
    System.IO.StringWriter sw = new System.IO.StringWriter();
    HtmlTextWriter writer = new HtmlTextWriter(sw);
    String htmlContent;
    htmlContent = sw.ToString();
    try
    {
    pulsante.RenderControl(writer);
    }
    catch (Exception e)
    {
    string exc = e.Message;
    }
    htmlContent = sw.ToString();
    sw.Close();
    new CallbackResult(pulsante, "content", htmlContent);
    }
    }

    ------------------------------------------------------------------------
    Questo è tutto....devo riuscire a fargli fare il rendering del controllo, questo l'ho capito....ma non ci riesco, perchè mi genera l'eccezione di cui sopra....
    Guarda....ti sono già tantissimo debitrice....
    Pat

  8. #8
    se non ho capito male, la classe Tool_Rect si occupa di gestire i cambiamenti e le operazioni da fare sull'interfaccia (la situazione è "simile" ad un Model-View-Presenter).

    il metodo changeButton deve cambiare il nome ad un bottone, ma vedo che fai anche la renderizzazione. e questo non mi piace molto.

    Dovresti utilizzare la CallbackResult non per restituire il codice HTML generato, ma per restituire la pagina cambiata.
    Il rendering deve rimanere gestito dalla pagina stessa.

    Se hai necessità particolari per le quali devi per forza (anche se secondo me è sbagliato) generare il codice HTML nella tua classe, dobbiamo trovare un'altra soluzione.

    codice:
    public void ServerAction(ESRI.ArcGIS.ADF.Web.UI.WebControls.ToolEventArgs tool)
    {
        Map map= (Map) tool.Control;
        Page page = map.Page;
        this.changeButton(ref page);
        //a questo punto hai la pagina con il testo del bottone cambiato
        // cosa fa la new CallbackResult?
    }
    
    private void changeButton(ref Page page)
    {
        Button pulsante = (Button)page.FindControl("btnOrdina");
        pulsante.Text = "txt modificato";
    }

  9. #9

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    42
    ...si, ma se non faccio la renderizzazione il pulsante non cambia....
    ...e se la faccio va in eccezione...form con runat = server...
    Pat

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 © 2025 vBulletin Solutions, Inc. All rights reserved.