ciao,
ho un form, cliccando sul bottone di submit richiamo una variabile con il request.form e la stampo.
funziona perfettamente, ma se lo stesso dientico form lo inserico in una pagina che ha una masterpage non funziona più, come mai???
grazie
gio
ciao,
ho un form, cliccando sul bottone di submit richiamo una variabile con il request.form e la stampo.
funziona perfettamente, ma se lo stesso dientico form lo inserico in una pagina che ha una masterpage non funziona più, come mai???
grazie
gio
be... così senza codice... non ho capito un gran che...
che variabile è dal request.form?.
il tab <form> è nella pagina di content o nella master?
dicci qualcosa in più
ciao,
ho risolto.
in sostanza, una textbox in una pagina che è stata realizzata all'interno di una master, cambia nome:
il campo di testo
<input name="CircolareTitolo" type="text" id="ctl00_ContentPlaceHolder1_CircolareTitolo" style="width:268px;" />
se la pagina ha una masterpage diventerà
<input name="ctl00$ContentPlaceHolder1$CircolareTitolo" type="text" id="ctl00_ContentPlaceHolder1_CircolareTitolo" style="width:268px;" />
a questo punto basta guardare il codice della pagina HTML eseguita, guardare il nome che gli viene riassegnato e usarlo come nome nel request.form
nel codebehind per accedere ad un controllo presente sulla pagina puoi fare a meno di utilizzare request.form e accedervi invece direttamente con il nome del controllo. In ogni caso, se proprio devi ritrovare un controllo all'interno dell'insieme di tutti i controlli presenti sulla pagina puoi utilizzare la funzione findcontrol("nomedeltuocontrollo")
es.
TextBox txt = Page.FindControl("CircolareTitolo") as TextBox;
Saluti a tutti
Riccardo
ciao ovosodo ,
in verità c'è un modo MOLTO più semplice:
questa proprietà ti restituisce proprio il name che gli verrà assegnato nell'HTML.Codice PHP:request.form[CircolareTitolo.UniqueID]
ciao riccardone,
in verità quello che dici non è del tutto corretto.
Questo funziona se il controllo che cerchi è direttamente figlio della pagina, od è figlio di controlli semplici.
Infatti alcuni controlli come gridview, formview, ed altri (tutti quelli che implementano l'interfaccia INamingContainer), non permettono di trovare un controllo al loro interno, se non con la funzione ereditata, che però va chiamata direttamente dal controllo:
gridview1.findcontrol("myLabel")
infatti se hai una pagina di questo tipo:
con l'istrzioneCodice PHP:<form>
<asp:Label runat="server" ID="lblPagina"></asp:Label>
<asp:GridView runat="server" ID="grd">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Label runat="server" ID="lblGriglia"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:Panel runat="server" ID="pnl">
<asp:Label runat="server" ID="lblPannello"></asp:Label>
</asp:Panel>
</form>
Label lbl1 = (Label)Page.FindControl("<nomeLabel>");
trovi solo la prima e la terza
Quello che ho detto è corretto ed è in riferimento a quanto richiesto da chi ha iniziato il post. La textbox non appare essere contenuta in nessun container sulla pagina come ad es. formview o altri. Quindi il giudizio sulla correttezza o meno era evitabile.Originariamente inviato da Gluck74
ciao riccardone,
in verità quello che dici non è del tutto corretto.
Se tu vuoi arricchire la discussione con una delle sacrosante verità che si possono dire sull'argomento e cioè che la pagina è un container di controlli e a loro volta i controlli possono essere container di altri controlli ed espongono il metodo findcontrol, fai pure. Una web form eredita findcontrol dalla classe base Page mentre un controllo lo eredita dalla classe base Control. L'interfaccia da te citata serve per identificare univocamente il controllo all'interno della pagina potendolo così definire come container di altri controlli.
Saluti a tutti
Riccardo
ciao riccardone
non volevo assolutamente scaturare la tua ira e tantomeno sminuire la tua risposta. semplicemente volevo dare una precisazione.
scusa se ti ho turbato ma non era la mia intenzione.
ciao
UP:
P.S.: da quanto ha scritto ovosodo, la pagina che contiene la label, è figlia di una masterpage, infatti il controllo ha ID: ctl00_ContentPlaceHolder1_CircolareTitolo
si da il caso che implicitamente il controllo sta dentro un ContentPlaceHolder, che guardacaso implementa INamingContainer.
Infatti, dalla pagina di contenuto che eradita dalla MasterPage, l'istruzione
TextBox txtCircolareTitolo = Page.FindControl("CircolareTitolo") as TextBox;
che cerca la label all'interno del suo content, NON funziona.
funziona invece chiamare direttamente il controllo:
string uID = CircolareTitolo.UniqueID
Ciao di nuovo
scusa qua e scusa la e poi eccoti alle precisazioniOriginariamente inviato da Gluck74
P.S.:
la content page non (è corretto dire che) eredita dalla master page. A runtime vengono fuse insieme. La gerarchia dei controlli però cambia. E così, per tirare fuori un controllo presente nella content page si è costretti a fare riferimento al contentplaceholder che lo contiene. Questo inghippo mi era sfuggito inizialmente quindi chiedo venia. Neanche dalla tua risposta si capiva granchè di questo problema che in effetti affligge tutte le content page. Per tirare fuori un controllo presente sulla content page utilizzando FindControl si può scrivere qualcosa di simile aOriginariamente inviato da Gluck74
dalla pagina di contenuto che eradita dalla MasterPage
codice:ContentPlaceHolder cph = Master.FindControl("nomedeltuoplaceholder") as ContentPlaceHolder; TextBox txt = cph.FindControl("TextBox1") as TextBox;
Saluti a tutti
Riccardo
ciao,
saltando tutte le inutili polemiche e facendo un sunto, vorrei spiegare a ovosodo la differenza tra reperire il dato con:
request.form[CircolareTitolo.UniqueID]
oppure usando le varie page, master, findcontrol, e tutto quello che si è detto:
in pratica ottieni lo stesso risultato facendo:
string valore = request.form[CircolareTitolo.UniqueID]
string valore = CircolareTitolo.text
se invece, il tuo controllo "CircolareTitolo" nella pagina, è contenuto all'interno di un ulteriore controllo che funge da contenitore, ovvero implementa la classe INamingContainer
(te ne accorgi perché non hai più la possibilità di scrivere "CircolareTitolo.text" nemmeno con l'autocomplete di visualstidio), allora devi "cercarlo" in questo modo:
TextBox txtC = (TextBox)<controlloContenitore>.FindControl("Circo lareTitolo");
ma che succede se è annidato dentro un contenitore che a sua volta sta dentro un altro???
o un contenitore complesso(esempio dei gridview, formview, dataList, ecc ecc)???
succede che non lo trovi !!!
allora, come dice in un post il grande maesto Francesco Balena, e come dice Microsoft in un articolo MSDN paragrafo "Locating a Control Inside a Hierarchy of Naming Containers",
bisogna usare una funzioncina carina da mettere nel codice della pagina (anche master eventualmente).
altri accrochi sono inutili e fuorvianti.
ciao ovosodo
[QUOTE]Originariamente inviato da Gluck74
se invece, il tuo controllo "CircolareTitolo" nella pagina, è contenuto all'interno di un ulteriore controllo che funge da contenitore, ovvero implementa la classe INamingContainer
(te ne accorgi perché non hai più la possibilità di scrivere "CircolareTitolo.text" nemmeno con l'autocomplete di visualstidio), allora devi "cercarlo" in questo modo:
[QUOTE]
Ci sono container che "nascondono" i controlli contenuti come ad esempio il repeater, datalist, gridview e altri che pur essendo container non nascondono e lasciano accesso diretto ai controlli contenuti come ad esempio il Panel (fra parentesi poi, tutti i controlli che derivano da Control espongono FindControl, anche la textbox). Quindi dire che per accedere ad un container è necessario..
"
allora devi "cercarlo" in questo modo:
TextBox txtC = (TextBox)<controlloContenitore>.FindControl("Circo lareTitolo");
"
è incorretto. Ci sono casi in cui si deve fare così e altri casi dove non serve.
Saluti a tutti
Riccardo