Nidificati MasterPages e .FindControl
-
21-09-2019 - |
Domanda
In un sito, sto solo con un unico livello Masterpage e in una pagina utilizzando quel maestro, posso fare this.Master.FindControl ( "controlName") per accedere al controllo. Funziona bene.
Tuttavia, utilizzando lo stesso codice su un sito con due livelli masterpage. MainMaster e SpecificMaster che ha MainMaster come il suo Maestro.
Quindi, nella pagina che utilizza SpecificMaster, FindControl sta tornando nullo per l'oggetto. L'unica differenza che vedo è la nidificazione delle masterpages.
Quando ho impostato punto di interruzione e guardo page.Master, sta mostrando SpecificMaster e SpecificMaster sta mostrando MainMaster come il suo padrone in modo corretto, ma FindControl non riesce ancora.
Quando ho vista origine in IE, il controllo è correttamente chiamato, non munging NET in corso.
Ogni pensiero qui?
TIA!
Soluzione
Quando si nidificano pagine master, si otterrà un contenitore "Contenuto" in più è necessario guardare attraverso.
Di conseguenza, se si sta cercando di utilizzare FindControl da una data pagina figlio il solito approccio è qualcosa per l'effetto di:
Label myLabel = (Label)this.Master.FindControl("myLabel");
myLabel.Text = "Success!";
Dal momento che abbiamo una pagina master nidificate, con "myLabel" nel master bambino, questo controllo sarà contenuta all'interno di un controllo dei contenuti.
Quindi, questo cambia il codice:
ContentPlaceHolder ph = (ContentPlaceHolder)this.Master.Master.FindControl("yourContentPane");
Label myLabel = (Label)ph.FindControl("myLabel");
myLabel.Text = "Success!";
e VB.NET
Dim ph As ContentPlaceHolder = DirectCast(Me.Master.Master.FindControl("yourContentPane"), ContentPlaceHolder)
Dim myLabel As Label = DirectCast(ph.FindControl("myLabel"), Label)
myLabel.Text = "Success!"
Il contenuto della pagina figlio viene caricato nel primo controllo pagina master, che viene successivamente caricato nella pagina master nonni.
Altri suggerimenti
hai provato this.Master.Master.FindControl("controlname");
?
Si sta lavorando anche per cross-page postback:
ContentPlaceHolder ph = (ContentPlaceHolder) PreviousPage.Master.FindControl ( "ContentPlaceHolder");
stringa txt = ((TextBox) (ph.FindControl ( "UserTextBox"))) Testo;.
Di solito faccio questo:
(TextBox)this.Master.FindControl("ContentplaceHolder1").FindControl("TextBox1");
HyperLink hl = (HyperLink)Master.Master.FindControl("HyperLink3");
Questo è il modo più semplice per trovare i controlli dalle pagine master nidificate.
Il mio scenario è stato il seguente. Non sono sicuro se questa configurazione è quella giusta, ma mi ha permesso di avere impostazioni di pagina master-submaster, ed essere in grado di trovare il controllo.
MasterPage-> SubMasterPage -> pagina ASPX
MasterPage:
<asp:ContentPlaceHolder ID="MasterPageContentPlaceHolder" runat="server">
</asp:ContentPlaceHolder>
SubMasterPage:
<asp:Content ID="ModuleMainContent" ContentPlaceHolderID="MasterPageContentPlaceHolder" runat="server">
<asp:ContentPlaceHolder ID="MainContent" runat="server">
</asp:ContentPlaceHolder>
aspx.cs:
ContentPlaceHolder MainContent = (ContentPlaceHolder)this.Master.Master.FindControl("MasterPageContentPlaceHolder").FindControl("MainContent");
TextBox var_type = MainContent.FindControl("air") as TextBox;