Checkbox

lunedì 23 marzo 2009 - 10.19

bolla111 Profilo | Senior Member

ciao...volevo sapere se era possibile creare un checkbox da codice...

rossimarko Profilo | Guru

Ciao,

si i controlli li puoi creare anche da codice. Basta che crei un'istanza del controllo e poi lo aggiungi alla pagina, magari all'interno di un controllo PlaceHolder che hai inserito prima.

Es:
CheckBok chk = new CheckBox();
chk.ID = "chkProva";

plcHolder.Controls.Add(chk);

Qual'è nel caso specifico la tua esigenza?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

diciamo che ho fatto una cosa del genere...l'unica differenza è che ho messo una textbox dove io gli inserisco un numero...e vengono creati tanti checkbox quanti quel numero...
ora con un altro tasto voglio controllare se sono chekkato o meno...solo che non riesco a recuperare gli id

Anonimo Profilo | Senior Member

Ciao la soluzione migliore secondo me potrebbe essere:

ControlCollection cc = Page.Form.Controls; foreach (Control c in cc) { try { CheckBox chk = (CheckBox)c; //fai quello che vuoi } catch { } }

Ciao.

PS: Scusate per la firma obsoleta, ma ho aperto il ticket con dotnethell, quanto prima verrà aggiornata.

rossimarko Profilo | Guru

>diciamo che ho fatto una cosa del genere...l'unica differenza
>è che ho messo una textbox dove io gli inserisco un numero...e
>vengono creati tanti checkbox quanti quel numero...
>ora con un altro tasto voglio controllare se sono chekkato o
>meno...solo che non riesco a recuperare gli id

L'id lo definisci tu?

Io ti consiglio di mettere come id un contatore (chk1, chk2) e quindi quando poi devi reperire il controllo basta che fai un FindControl passando il nome corretto basandoti su un indice che va da 0 al numero inserito nella textbox.

Più che altro considera che ad ogni postback devi ricreare i controlli sulla pagina altrimenti questi non vengono renderizzati. Supponiamo ad esempio che tu abbia la textbox, un pulsante che una volta premuto crea i controlli (btnCrea) e un pulsante che verifica la selezione (btnCheck).

Quando premi il pulsante btnCrea la tua routine crea i controlli. Quando poi premi il pulsante btnCheck i tuoi controlli non esistono perchè in questo caso non sono stati istanziati, quindi devi ricrearli nell'evento OnInit per far si che prendano i automatico dal viewstate i valori inseriti prima del postback


-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

Anonimo Profilo | Senior Member

Scusa Rossimako ma non sono d'accordo...

1) Dopo i postback il controllo dotnet mantiene li stati precedenti, quindi se aggiunti alla pagina non devono essere ridisegnati.
2) Il comando findcontrol di fatto scannerizza tutti i controlli del form fino a quando non trova il controllo che cerchi, è un po' uno spreco di risorse eseguire 100 find controll quindi 100 scansioni quando con una ottieni lo stesso risultato...

ma accetto volentieri soluzioni alternative.

rossimarko Profilo | Guru

>Scusa Rossimako ma non sono d'accordo...
>
>1) Dopo i postback il controllo dotnet mantiene li stati precedenti,
>quindi se aggiunti alla pagina non devono essere ridisegnati.

Mantiene lo stato se ricrei il controllo. Io infatti ho fatto presente che se crei i controlli dinamicamente da codice (e quindi non inserendoli nell'aspx) nei postback successivi devi ricrearli con lo stesso id per far si che poi il motore di asp.net li visualizzi nuovamente con il valore inserito dall'utente.

Puoi verificarlo con un piccolo progetto di esempio:

aspx:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Codice:

void btnCrea_Click(object sender, EventArgs e) { for (int i = 0; i < 10; i++) { TextBox txt = new TextBox(); txt.ID = string.Format("txt_{0}", i); txt.Text = i.ToString(); ctrlContainer.Controls.Add(txt); } } void btnControlla_Click(object sender, EventArgs e) { btnControlla.Text = "Controllato" }

E' un esempio molto banale, ma quando premi il pulsante controlla vedrai che tutti i controlli creati non saranno visualizzati all'interno della pagina. La mia osservazione era semplicemente su questo punto

>2) Il comando findcontrol di fatto scannerizza tutti i controlli
>del form fino a quando non trova il controllo che cerchi, è un
>po' uno spreco di risorse eseguire 100 find controll quindi 100
>scansioni quando con una ottieni lo stesso risultato...

Vero, dipende sempre da quanti controlli crei e da come accedi agli stessi, se devi leggerli tutti o se fai un'accesso puntale ad alcuni. Però mi permetto di fare una modifica al tuo codice, perchè inerire dei try catch non è performante, scatenare un errore è un'operazione molto pesante. E' meglio verificare a priori la tipologia del controllo:

ControlCollection cc = Page.Form.Controls; foreach (Control c in cc) { if (c is CheckBox) { CheckBox chk = (CheckBox)c; //fai quello che vuoi } }
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

Anonimo Profilo | Senior Member

Riguardo al punto uno non avevo capito, riguardo al punto 2 direi che va bene l'is, non lo uso molto, ma è decisamente corretto in questo esempio.

bolla111 Profilo | Senior Member

ok...ho capito più o meno il discorso...
ora cmq ragionando meglio su ciò che dovevo fare ho capito che non ho bisogno di creare da codice questi controlli...
grazie delle risposte cmq...siete stati utili ugualmente...un domani mi ricorderò di questo thread...
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5