Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    48

    Visualizzazione di una texbox ad ogni click

    Salve ragazzi, scusate la domanda per voi forse banale ma sto cercando di imparare.
    In una pagina inserisco un Button e voglio far sì che al primo click appaia la prima Textbox (textbox1), al secondo click appaia la seconda Textbox (textbox2) nella stessa pagina, al terzo click la terza Textbox (textbox3) e così via, visualizzando così tante Textbox (con un preciso ID) nella stessa pagina, quanti sono i click sul Button, senza un limite teorico di quantità.
    Mi date una dritta su come procedere?

  2. #2
    Potresti utilizzare un indice che salvie nella cache del viewstate, ad ogni click viene incrementato e successivamente ti fornisce un numero che ti servirà ad identificare l'ipotetica TextBox[i] da visualizzare.
    Per essere più chiaro: supponi di avere 5 textbox con i seguenti id:
    TextBox1
    TextBox2
    TextBox3
    TextBox4
    TextBox5

    Ora, tutte hanno la proprietà Visible="false";
    poi hai il tuo bottone che è collegato al seguente metodo per l'OnClick:
    codice:
    protected void btnClick(object sender, EventArgs e)
    {
        int v = 0;
        if(ViewState["Indice"] != null)
             v = (int)ViewState["Indice"];
        else v = 1;
    
        Control ctrl = this.FindControl(string.Format("TextBox{0}", indice);
        if(ctrl != null)
        {
           ctrl.Visible=true
           indice++;
         }
         ViewState["Indice"] = indice;
    }
    Spero sia facile capire il suo funzionamento:
    1. dichiara un indice
    2. verifica che nel viewstate sia presente un dato relativo ad esso
    3. se c'è lo imposta per la variabile dichiarata, in caso contrario imposta l'indice = 1 in quando è la prima volta che stiamo utilizzando il tasto ed il ViewState non è stato utilizzato.
    4. Utilizza il metodo FindControl presente nella pagina per cercare un controllo che ha un particolare id (ogni elemento eredita da Control)
    5. se lo trova lo visualizza.

    Chi sbaglia, apprende meglio di chi non ha mai commesso errori.
    DOT.NET Addicted since 2006 (My Blog)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    48
    Grazie RoBYCoNTe per l'utilissimo intervento che mi ha consentito di scoprire nuove funzionalità del linguaggio ed ha risolvere il problema ... ovviamente nel codice che hai scritto la variabile "indice" va sostituita con la variabile "v" nell'argomento del Format, nell'incremento e nell'assegnazione finale.
    Sarebbe interessante capire a questo punto se ASP.NET mette a disposizione strumenti in grado di generare una nuova TextBox in risposta ad ogni click sul bottone, evitando quindi il ricorso alla modifica dello stato di visibilità di TextBox già esistenti.


  4. #4
    Di niente, cmq certo che lo permette, ecco un semplice esempio:
    Supponi di avere un div con id="container" runat="server" in cui puoi inserire controlli di ogni tipo (in quanto questo ha una proprietà, Controls, cioè l'elenco di tutti i suoi controlli figlio).
    codice:
    TextBox txt = new TextBox();
    txt.ID = "ID";
    container.Controls.Add(txt);
    Tutto ciò avviene per una semplice struttura ereditaria che ogni elemento a partire da System.Web per quanto concerne i controlli, si porta dietro!

    spero di essere stato chiaro!
    Chi sbaglia, apprende meglio di chi non ha mai commesso errori.
    DOT.NET Addicted since 2006 (My Blog)

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    48
    Benissimo, grazie ai tuoi suggerimenti ho fatto un bel passo in avanti scrivendo il seguente codice di risposta all'evento click sul Button:

    protected void Button1_Click(object sender, EventArgs e)
    {
    int a;
    if (ViewState["chiave"] == null)
    {
    a = 1;
    }
    else
    {
    a = (int)ViewState["chiave"];
    a++;
    }
    ViewState["chiave"] = a;


    for (int i = 1; i <= a; i++)
    {
    TextBox txt = new TextBox();
    txt.ID = "TextBox" + i.ToString();
    container.Controls.Add(txt);
    }
    }

    In pratica ho impostato un ciclo for che genera tante textbox quanti sono i click sul Button, quindi il primo click genera una textbox, al secondo genera due textbox, al terzo tre e così via.

    Il problema sta nel fatto che ad ogni click vengono rigenerate tutte le textbox e aggiunta una in più, pertanto l'eventuale testo digitato nelle textbox, verrà inesorabilmente perso ad ogni click sul Button. Come evitare questo inconveniente ?
    In pratica vorrei che ad ogni click venga aggiunta una textbox vuota e lasciate intatte le altre, complete del testo eventualmente digitato in esse.

  6. #6
    Allora, prima di tutto ti spiego una cosa: quando tu clicchi nuovamente sul button che deve generare la TextBox successiva, questo genera un evento di tipo Submit, il submit a sua volta ha un comportamento Standard per i form, all'interno di una Request salva tutti i valori che sono stati compilati per preservarne il contenuto e poterlo successivamente analizzare.

    Ora veniamo a te: se tu generi un elemento di tipo input che ha ID = "TextBox1", successivamente puoi gestirne il valore richiamando la proprietà: Request.Params["TextBox1"] (dalla pagina web), se per questo elemento è stato impostato un valore, Request.Params restituirà il suo contenuto in formato stringa, quindi rivedendo il tuo controllo e volendo gestirlo ancor meglio puoi, nel ciclo di generazione degli indici inserire un'altra riga di codice:
    codice:
    TextBox txt = new TextBox();
    txt.ID = "TextBox" + i.ToString();
    ....
    txt.Value = Request.Params[txt.ID];
    Scusa la mia ripetizione finale, ho paura di dilungarmi troppo cmq spero di essere stato chiaro

    Chi sbaglia, apprende meglio di chi non ha mai commesso errori.
    DOT.NET Addicted since 2006 (My Blog)

  7. #7
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    uhm...ma non si puo' fare molto piu' semplicemente con un placeholder o sfruttando Page.Controls.Add, tenendo conto di quanti ne sono stati aggiunti e ricostruendoli ad ogni PB ?

  8. #8
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da djciko
    uhm...ma non si puo' fare molto piu' semplicemente con un placeholder o sfruttando Page.Controls.Add, tenendo conto di quanti ne sono stati aggiunti e ricostruendoli ad ogni PB ?
    Io direi che si deve fare proprio così. Se mantiene in memoria (viewstate o session) quello che serve per ricostruire i textbox (basta una variabile integer); poi si ricreano sempre e comunque ad ogni PostBack.

    ps.
    Ho mandato il codice in aspitalia.it per un quesito uguale, ma ho avuto il gravissimo torto di scriverlo in vb.net. Diavolo, che lo abbiano degnato di un'occhiata , eppure funzionava perfettamente

    Non ho più la pagina, quando quel sito sarà riparato (attualmente è "rotto" ) manderò il link.
    Pietro

  9. #9
    Parliamo della stessa cosa in due modi diversi Un PlaceHolder è simile ad un Contenitore (il div runat="server", per la precisione: un HtmlGenericControl), ho utilizzato quello nell'esempio perchè solitamente una serie di controlli vanno inseriti nello stesso contenitore (pensiamo ad un modulo etc.). Ovviamente ho preferito mostrargli quella soluzione per dettagliare meglio le modalità con cui effettuare questo tipo di operazioni.

    Io direi che si deve fare proprio così. Se mantiene in memoria (viewstate o session) quello che serve per ricostruire i textbox (basta una variabile integer); poi si ricreano sempre e comunque ad ogni PostBack.


    Ma io cosa ho detto? :P
    Cmq vanno ricreati ad ogni PostBack I controlli dinamici non vengono memorizzati direttamente nel ViewState, qui il controllo viene lasciato completamente allo sviluppatore che deve preoccuparsi di gestire la logica. Provare per credere
    Chi sbaglia, apprende meglio di chi non ha mai commesso errori.
    DOT.NET Addicted since 2006 (My Blog)

  10. #10
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Ho letto il messaggio di djciko ma il tuo non con la dovuta attenzione

    Pietro

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.