Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19

Discussione: masterpage e form

  1. #1

    masterpage e form

    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

  2. #2
    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ù

  3. #3
    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

  4. #4
    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

  5. #5
    ciao ovosodo ,
    in verità c'è un modo MOLTO più semplice:

    Codice PHP:
    request.form[CircolareTitolo.UniqueID
    questa proprietà ti restituisce proprio il name che gli verrà assegnato nell'HTML.


    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:
    Codice 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
    con l'istrzione
    Label lbl1 = (Label)Page.FindControl("<nomeLabel>");

    trovi solo la prima e la terza

  6. #6
    Originariamente inviato da Gluck74
    ciao riccardone,
    in verità quello che dici non è del tutto corretto.
    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.

    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

  7. #7
    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

  8. #8
    Originariamente inviato da Gluck74
    P.S.:
    scusa qua e scusa la e poi eccoti alle precisazioni

    Originariamente inviato da Gluck74
    dalla pagina di contenuto che eradita dalla MasterPage
    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 a
    codice:
    ContentPlaceHolder cph = Master.FindControl("nomedeltuoplaceholder") as ContentPlaceHolder;
    TextBox txt = cph.FindControl("TextBox1") as TextBox;
    Saluti a tutti
    Riccardo

  9. #9
    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

  10. #10
    [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

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.