Domanda

ho bisogno di creare le seguenti funzionalità, e cercando il modo migliore per conservare informazioni su più postback:

Di 'Ho un TextBox, che è legato a una domanda, vale a dire "Luoghi che ho visitato". Una volta TextBox sarà caricato sul primo carico. In base a tale, c'è un pulsante "Aggiungi un altro luogo". Ciò postback, che sarà poi aggiungere un altro TextBox sotto il primo. Questo può essere fatto x numero di volte.

La domanda che ho è, come faccio da magazzino / ricordo il numero di controlli che sono stati aggiunti alla pagina da parte dell'utente, considerando che questa necessità di carico da fare nell'evento Init, e ViewState non è stato caricato a questo punto?

EDIT *:

Ho dimenticato di dire, che quando l'utente salva, ci sarebbe qualche convalida, quindi, se la convalida non riesce, necessità di mostrare tutte le caselle di testo, con i loro dati pubblicati.

È stato utile?

Soluzione 3

Dopo qualche pensiero, e considerando le risposte date, si avvicinò con questa soluzione.

Nel controlli segnaposto, hanno un campo di input nascosto che conterrà il numero di controlli aggiunti alla pagina. Poi, Init, posso avere il seguente codice (testando solo):

protected override void OnInit(EventArgs e)
{
    int i = 0;
    i = Int32.Parse(hdnTestCount.Value);

    if(Request.Params[hdnTestCount.UniqueID] != null)
    {
        i = Int32.Parse(Request.Params[hdnTestCount.UnitueID]);
    }

    for (int j = 1; j <= i; j++)
    {
         TextBox txtBox = new TextBox();
         txtBox.ID = "Test" + j.ToString();
         plhTest.Controls.Add(txtBox);
    }
}

protected void btnAdd_OnClick(object sender, EventArgs e)
{
    int i = 0;
    i = Int32.Parse(hdnTestCount.Value) + 1;

    TextBox txtBox = new TextBox();
    txtBox.ID = "Test" + i.ToString();
    plhTest.Controls.Add(txtBox);
    hdnTestCount.Value = i.ToString();
}

Naturalmente l'unico problema con questo, è che il valore potrebbe essere manipolato dall'utente nel campo nascosto. L'unica altra opzione sarebbe quella di utilizzare Sessione, che io non voglio usare come si attacca in giro, per cui se la pagina viene aggiornata in questo modo, il modulo sarà azzerato in sé, che è quello che dovrebbe accadere.

Altri suggerimenti

Se si dovesse andare a consentire solo un numero finito di caselle di testo sul modulo, è possibile creare il numero di caselle di testo durante Page_Init e impostare la loro visibilità su false in modo da non essere rese nel browser. Sul evento click del pulsante, si potrebbe trovare il primo testo invisibile e modificare la visibilità su true. Qualcosa del genere

protected void Page_Init(object sender, EventArgs e)
{
    for (int i = 0; i < 20; i++)
    {
        this.Form.Controls.Add(new TextBox() { Visible = false });
    }
}

protected void addTextboxButton_Click(object sender, EventArgs e)
{
    TextBox tb = this.Form.Controls.OfType<TextBox>().FirstOrDefault(box => box.Visible == false);
    if (tb != null) tb.Visible = true;
}

Con questo approccio, le caselle di testo saranno una sola visibile uno per ogni scatto del tasto, ed i valori di postback bastone.

Ovviamente, che ci si vuole mettere un po 'più di lavoro in esso, come forse definining alcuni controlli letterali per creare interruzioni di riga e richiede la caselle di testo, così come la visualizzazione di un messaggio quando il colpo utente qualunque finito limite impostato.

Opzione 1: È possibile utilizzare Session per memorizzare il numero di caselle di testo ...

Opzione 2:. È anche possibile aggiungere i controlli in caso di carico della pagina, in cui avrete le informazioni ViewState

Ecco i link che potrebbero aiutare a ...

VERAMENTE Controlli dinamici comprensione

capire veramente ViewState

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top