Visibilità ContentPlaceHolder

giovedì 18 novembre 2010 - 12.13
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Visual Studio 2008  |  Visual Studio Express

alexmed Profilo | Guru

Ciao a tutti
Il problema è questo
Ho un sito che fà capo ad una MasterPage suddivisa in vari ContentPlaceHolder
Se nella pagina Default.aspx inserisco in un ContentPlaceHolder un DropDownList che preleva i dati tramite un ObjectDataSource inserito un'altro ContentPlaceHolder mi da errore dicendo:

"DataSourceID di 'ddlF' deve essere l'ID di un controllo di tipo IDataSource. Impossibile trovare un controllo con ID 'ObjectDataSource1'

Come si risolve?

Grazie

alexmed

andrestu Profilo | Expert

prova a valorizzare dinamicamente da codice la proprietà DataSourceID cercando all'interno del ContentPlaceHolder il relativo controllo e quindi il suo ID...


Andrea Restucci - Web Programmer
www.andrearestucci.name
Download and try my FREE custom controls !!!

alexmed Profilo | Guru



Ciao e grazie

Ci stò provando ma non avendo ancora chiaro come procede la compilazione della pagina non nè vengo fuori.
Anche perchè la cosa è abbastanza complessa e provo a spiegartela:
Come detto la pagina è composta da 3 CPH
Uno mi racchiude il corpo centrale della pagina gli altri due i menù di navigazione laterali (tutti e due, uno sopra l'altro, a destra di quello centrale)
In quello centrale vado a mettere un DataList con il relativo ObjectDataSource che preleva i dati mediante una Funzione che prevede due ControlParameter rappresentati da due DropDownList (che a loro volta vengono popolati mediande due ObjectDataSource) posizionati in uno dei due CPH laterali.
I due ObjectDataSource che popolano le DropDownList a cascata (il secondo si popola in base al valore del primo) sono posizionati sempre nel CPH delle DropDownList.
Quello che non capisco è che se metto tutto nello stesso CPH funziona perfettamente.

Da codice invece procedo così:
Creo il primo ObjectDataSource;
Lo associo al primo DropDownList (ddlF);
Creo il ControlParameter che preleva il SelectedValue del DropDownList (ddlF) e che devo passare al secondo ObjectDataSource (nessun errore);
Creo il secondo ObjectDataSource;
Aggiungo il SelectParameter (ddlF.SelectedValue) nessun errore;
Quando associo l'ObjectDataSource al secondo DropDownList al DataBind() mi dice:
"Impossibile trovare il controllo 'ddlF' in ControlParameter 'folderPath'."

Ma come non lo trovi???? Ho appena valorizzato il parametro con quel controllo!!!!!!

Ho provato a mettere tutto il codice nel Page_Init, _PreInit, _PreLoad, _Load ... ma niente.

...



alexmed

andrestu Profilo | Expert

premetto che non ho mai lavorato con gli objectdatasource ma il meccanismo non dev'essere tanto diverso dal sqldatasource e comunque non riusciresti a mandarmi i file della struttura della pagina così è un casino ad interpretarla....


Andrea Restucci - Web Programmer
www.andrearestucci.name
Download and try my FREE custom controls !!!

alexmed Profilo | Guru

Dopo mille e mille prove senza esito ho deciso di cambiare il Layuot della pagina.
Ma a breve ci ritorno sopra e posterò il codice.
A presto.
alexmed

sankyu Profilo | Senior Member

se sono tutti nella masterpage dovresti poter accedere a tutti i controlli contentplaceholder come figli della master
e dopo che hai il controllo cerchi con find control
esempio al volo
ContentPlaceHolder placeholder = ((MyMasterPage)this.Master).FindControl("ContentPlaceHolder") as ContentPlaceHolder;
var obj = placeholder.findcontrol("ObjectDataSource") as objectdatasource;

ora che hai obj ne fai quello che vuoi nel contentplaceholder che ti pare


Consulente e Sviluppatore .net in ambito finanziario
Dai un occhio al mio blog potrebbe tornarti utile
http://dotnetmemo.blogspot.com

alexmed Profilo | Guru

Ciao sankyu e grazie
Purtroppo non sono nella MP e non posso neanche metterli perchè dovendo prendere per gli ODS i valori dei parametri da due DDL dovrei inserire anche quelli.
Ma a quel punto sarebbe più incasinato (credo) gestirli per tutte le altre pagine, dove non mi servono.
Per ora comunque mi sembra di aver capito che dipende da "come" è strutturata la pagina.
Mi spiego con un esempio
In una struttura come questa

<div id="content">
<asp:ContentPlaceHolder ID="ContentPlaceHolderContent" runat="server">
</asp:ContentPlaceHolder>
</div>
<div id="nav">
<asp:ContentPlaceHolder ID="ContentPlaceHolderNav" runat="server">
</asp:ContentPlaceHolder>
</div>

In cui Nav rappresenta la parte a destra (se prendiamo questo sito, la parte dove compare il tuo nome utente con i My Thread), ho notato che prima viene elaborato il ContentPlaceHolderContent poi il ContentPlaceHolderNav. Quindi se nel primo hai dei controlli che devono prendere valori dal secondo sei fregato.
Questa tesi devo comunque approfondirla.







alexmed

sankyu Profilo | Senior Member

scusa non sono stato chiaro io!
Tutti i content place holder sono in una master page giusto??
essendo i content nella stessa master page puoi accederci come ti ho scritto

se sono in master page diverse non so dato che non ci ho mai provato

Consulente e Sviluppatore .net in ambito finanziario
Dai un occhio al mio blog potrebbe tornarti utile
http://dotnetmemo.blogspot.com

alexmed Profilo | Guru

Ciao
Si i CPH sono tutti nell'unica MasterPage.
Ho provato ma niente ... sempre il solito errore

Questo è il codice che ho usato:

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

ed ho provato a metterlo in _PreInit, _Init, _PreLoad, _Load, _PreRender sia della Page che del DataList

Questa invece è la struttura della pagina Master:

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

Nel ContentPlaceHolderContent vado a mettere il DataList e nel ContentPlaceHolderNavigation metto il DropDownList e gli ODS.

...

alexmed

alexmed Profilo | Guru

Ciao
Penso di aver risolto almeno in parte (era più semplice del previsto, ma quando non si sanno le cose diventa tutto complicato) dicendo all'ODS che l'ID del controllo che deve cercare non è "ddF" ma è "ctl00$ContentPlaceHolderNavigation$ddlF".
A questo punto la mia tesi prende più forma: i CPH vengono elaborati uno dopo l'altro in base a come è strutturata la MasterPage; quindi visto che ContentPlaceHolderNavigation viene dopo ContentPlaceHolderContent al primo Load della pagina non viene passato nessun parametro in quanto la ddlF non è stata ancora popolata.
Non mi resta che popolarla prima che venga elaborato l'ODS che ha bisogno del parametro.
Adesso ci provo ...

Ciao
alexmed
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5