Conteggio elementi dentro un panel

giovedì 26 febbraio 2015 - 10.46
Tag Elenco Tags  C#  |  .NET 4.0  |  Windows 7

paolo973 Profilo | Senior Member

Ciao a tutti,

<asp:Panel ID="Panel1" runat="server" Width="100%"></asp:Panel>

aggiungo in un panel un numero variabile di checkbox, usando queste linee di codice
e fin quì funziona:

for (...)
{
CheckBox cb = new CheckBox();
cb.ID = "cb" + i.ToString();
cb.Checked = true;
cb.ToolTip = "cb" + i.ToString();;
Panel1.Controls.Add(cb);
}

dopo, quando però desidero sapere quanti elementi ci stanno in Panel1,

LabelOut.Text = Panel1.Controls.Count.ToString();

mi ritorna sempre 0.

Cosa mi sfugge?

sboss83 Profilo | Newbie

Scusa ma la richiesto di conteggio dei controlli dove la metti ?
Con il tuo codice io li recupero in maniera corretta.


Stefano

paolo973 Profilo | Senior Member

in un button

sboss83 Profilo | Newbie

Chiedo scusa ma mi sono espresso male.
Volvo capire a che punto vengono generati i controlli e in funzione di quello ipotizzare che tu leggessi il numero dei controlli prima che questi vengano generati ( da qui il risultato 0)
Stefano

paolo973 Profilo | Senior Member

il panel1 lo riempio con un button1

il conteggio lo eseguo con il button2

spero di avere capito

sboss83 Profilo | Newbie

Scusa la banalità della risposta, ma non puoi contare i controlli subito dopo averli creati ?

Se schiacci un altro bottone per il conteggio, i controlli non verranno ricreati quindi in effetti, di controlli, ce ne saranno 0.
Stefano

andrestu Profilo | Expert

si infatti con questa logica avrai sempre zero perchè quando fai il postback i controlli non vengono ricreati e se continui a vederli potrebbe essere che utilizzi panel differenti ...
bisogna capire meglio cosa devi fare

Andrea Restucci - Web Developer

paolo973 Profilo | Senior Member

ok ora li conta ma conta tutto, come è giusto che sia.

Nel Panel oltre ad oggetti di tipo CheckBox ci stanno
anche textbox e image.

come posso contare ed individuare solo oggetti CheckBox ?

con questo codice:

foreach (CheckBox c in Panel1.Controls)
if (c.Checked)
{
...
}


ottengo questo errore:

Impossibile eseguire il cast di oggetti di tipo 'System.Web.UI.WebControls.Image' sul tipo 'System.Web.UI.WebControls.CheckBox'.

andrestu Profilo | Expert

int totale = Panel1.Controls.Cast<Control>().Where(C => C is CheckBox).Count();

paolo973 Profilo | Senior Member

ok

ma ora sovviene un dubbio, scusa ma sono di coccio:

ho il panel1 vuoto

con il button1, al suo click, riempio il panel1 con vari label, image e checkbox.

con button2 , ad un suo click, posso contare ad esempio quanti checkbox ci stanno dentro panel1 che è stato precedentemente riempito dal click su button1?

andrestu Profilo | Expert

allora considera che i controlli ad ogni postback devono essere creati, invece le proprietà dei controlli le puoi valorizzare anche solo al primo postback che tanto ci pensa il viewstate a mantenerle, senti spiegami meglio cosa devi fare così riesco a darti qualche suggerimento...

se vuoi implementare una pagina dove inserisci dei controlli dinamici al buttonclick allora devi crearti una logica personalizzata

domanda : questi controlli che crei dinamicamente devono essere controlli aspnet oppure anche solo semplice render html?

se sono controlli aspnet (cioè tag con impostato runat="server") e devono mantenere i valori delle proprietà bisogna inserirli o nell'evento Init o Load (pernso anche Load va bene) quindi prima di tali eventi tu devi avere già impostato il numero e il tipo di controlli da inserire

l'evento buttonclick viene chiamato dopo l'evento Load, potresti anche inserirli subito dopo questo evento (LoadComplete evento pagina) però non sono sicuro che in tal caso i controlli inseriti mantengono correttamente il viewstate (cioè i valori delle proprietà che cambiano)

ad esempio potresti crearti in Session degli oggetti specifici che mantengono il numero e tipo di controlli creati dinamicamente e leggere nell'evento LoadComplete questi dati e creare i controlli da inserire nella pagina

se però hai il problema che poi non ti mantengono correttamente il viewstate devi anticipare questo caricamento all'avento Load, e in tal caso non potrai più usare il buttonclick per inviare i dati ma dovrai usare metodi alternativi

https://msdn.microsoft.com/en-us/library/ms178472(v=vs.100).aspx




Andrea Restucci - Web Developer
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