Scegliere un tema in runtime da un controllo dropdownlist: come?

sabato 12 agosto 2006 - 01.13

Giovanni_3478 Profilo | Senior Member

Ciao

Ho un problema.

Ho creato 2 temi "default theme" e "natura"

Ho inserito nella aspx un dropdownlist con 2 item
per dare la possibilità di scegliere il tema:
<asp:DropDownList ID="DropDownList1" AutoPostBack="true" runat="server">
<asp:ListItem Value="natura" ></asp:ListItem>
<asp:ListItem value="default theme" Selected="True"></asp:ListItem>
</asp:DropDownList>

Nel code behind vorrei fare in modo che in runtime,
venga cambiato tema
a seconda del valore scelto nel dropdownlist.

Nel code behind ho scritto
(sapendo che il tema di una pagina aspx viene caricato all'evento preinit):
Protected Sub Page_preinit(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.PreInit
If DropDownList1.SelectedValue = "default theme" Then

' Me.Theme = "default theme"
end if

..ma questo codice mi restituisce un errore:
"Riferimento a un oggetto non impostato su un'istanza di oggetto".

Ipotizzo che nell'evento preinit l'istanza DropDownlList1 "non esiste".

Come posso procedere?

freeteo Profilo | Guru

ciao,
nel preinit non hai accesso ai controlli della pagina perhce deve ancora crearli.
Percio' devi appoggiarti ad 1a variabile sessione, prova a guardare questo articolo che fa proprio quello che vuoi fare tu: http://dotnethell.it/tips/ChangeRuntimeThemes.aspx
ciao.

Matteo Raumer
MCAD ... .net addicted :-)
http://blogs.dotnethell.it/freeteo

Giovanni_3478 Profilo | Senior Member

Ciao

Ho preso spunto dal tuo link (e ho letto informazioni sull'utilizzo della variabile di sessione sul mio libro) e ho ottenuto il risultato voluto in questo modo:

Protected Sub Page_load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim strFromDropDownMenu As String
strFromDropDownMenu = DropDownList1.SelectedValue
Session("strFromDropDownMenu") = strFromDropDownMenu


End Sub

Protected Sub Page_preinit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit

Me.Theme = Session("strFromDropDownMenu")
End Sub

mi chiedo:
1) per quale motivo viene scritto Session("strFromDropDownMenu") in VB e in C# Session["strFromDropDownMenu"]?
perchè la proprietà session (proprietà della classe page) è un array?
Le parentesi stanno ad indicare che ci troviamo in presenza di un array?
La domanda è banale ma non ho libri su VB.net.
2) come hai cercato il link che mi hai postato?
Con google, con il motore di ricerca di questo sito o con la msdn di Visual Studio 2005?
--------------------------------------------------------------------------------------------------------------

Sul mio libro "programmare asp.net 2.0" di Dino Esposito
il problema è stato risolto in altro modo: con il request.form
(metodo che non ho capito, ma solo intuito, altrimenti non avrei inserito il post).

Ti posto quello che c'è scritto (in C#):

public partial class TestThemes : System.Web.UI.Page
{
protected void Page_Load (object sender, EventArgs e)
{
if (!IsPostBack) {
ThemeList.DataSource=GetAvalaibleThemes();
ThemeList.Databind();
}
}
}

voi Page_PreInit (object sender, EventArgs e)
{
string theme ="";
if (Page.Request.Form.Count > 0)
theme = (Page.Request["ThemeList"].ToString();)
if (theme == "None")
theme ="";
this.theme = theme;
}

protected StringCollection GetAvalaibleThemes()
{
string path = Request.PhysiacalApplicationPath + @"App_Themes";
DirectoryInfo dir = new DirectoryInfo(path);
StringCollection themes=new StringCollection();
foreach (DirectoryInfo di in dir.GetDirectories())
themes.Add(di.Name);

return themes;
}

}
dal libro.....
Il controllo elenco a discesa (il dropdownlist) enumera i temi dell'applicazione installati e permette di scegliere quello da applicare. Il tema selezionato viene quindi applicato nell'evento PreInit e viene immediatamente riflesso. Nell'evento PreInit, nessun ViewState è stato ancora ripristinato; pertanto Request.form è il solo modo sicuro per accedere al valore postato, come il tema selezionato.


Dato questo codice:
<asp:DropDownList ID="DropDownList1" AutoPostBack="true" runat="server">
<asp:ListItem Value="natura" ></asp:ListItem>
<asp:ListItem value="default theme" Selected="True"></asp:ListItem>
</asp:DropDownList>

3) in che modo è possibile nell'evento PreInit prelevare i dati del controllo
mediante l'utilizzo del Request.Form?

Ho provato a scrivere nel code-behind
Me.Theme = Me.Request.Form.Item(1).ToString
ma dal DropDownList non preleva nessun valore.
Come procedere?

freeteo Profilo | Guru

>mi chiedo:
>1) per quale motivo viene scritto Session("strFromDropDownMenu")
>in VB e in C# Session["strFromDropDownMenu"]?
sintassi diversa, l'oggetto è lo stesso...in c# le parrentesi indicano 1 metodo, in vb hanno servono anche x accedere ad 1 insieme

>perchè la proprietà session (proprietà della classe page) è un
>array?

>Le parentesi stanno ad indicare che ci troviamo in presenza di
>un array?
>La domanda è banale ma non ho libri su VB.net.
>2) come hai cercato il link che mi hai postato?
>Con google, con il motore di ricerca di questo sito o con la
>msdn di Visual Studio 2005?
Il link lo sapevo perche la tip l'ho scritta io tempo fa!
Cmq basta cercare nel sito (in alto c'e' il pulsante "lente") o cmq andarsi a vedere i tips/articoli sfogliando le categorie.


>--------------------------------------------------------------------------------------------------------------
>
>Sul mio libro "programmare asp.net 2.0" di Dino Esposito
>il problema è stato risolto in altro modo: con il request.form
>(metodo che non ho capito, ma solo intuito, altrimenti non avrei
>inserito il post).
ok infatti la mia era 1a strada, sicuramente ce ne saranno di migliori...vista poi la fonte (Microsoft ufficiale)


>Ti posto quello che c'è scritto (in C#):
>
>public partial class TestThemes : System.Web.UI.Page
>{
> protected void Page_Load (object sender, EventArgs e)
> {
> if (!IsPostBack) {
> ThemeList.DataSource=GetAvalaibleThemes();
> ThemeList.Databind();
> }
> }
>}
>
>voi Page_PreInit (object sender, EventArgs e)
>{
> string theme ="";
> if (Page.Request.Form.Count > 0)
> theme = (Page.Request["ThemeList"].ToString();)
> if (theme == "None")
> theme ="";
> this.theme = theme;
>}
>
>protected StringCollection GetAvalaibleThemes()
>{
>string path = Request.PhysiacalApplicationPath + @"App_Themes";
> DirectoryInfo dir = new DirectoryInfo(path);
> StringCollection themes=new StringCollection();
> foreach (DirectoryInfo di in dir.GetDirectories())
> themes.Add(di.Name);
>
> return themes;
>}
>
>}
>dal libro.....
>Il controllo elenco a discesa (il dropdownlist) enumera i temi
>dell'applicazione installati e permette di scegliere quello da
>applicare. Il tema selezionato viene quindi applicato nell'evento
>PreInit e viene immediatamente riflesso. Nell'evento PreInit,
>nessun ViewState è stato ancora ripristinato; pertanto Request.form
>è il solo modo sicuro per accedere al valore postato, come il
>tema selezionato.
>
>
>Dato questo codice:
><asp:DropDownList ID="DropDownList1" AutoPostBack="true" runat="server">
><asp:ListItem Value="natura" ></asp:ListItem>
><asp:ListItem value="default theme" Selected="True"></asp:ListItem>
></asp:DropDownList>


>3) in che modo è possibile nell'evento PreInit prelevare i dati
>del controllo
>mediante l'utilizzo del Request.Form?
>
>Ho provato a scrivere nel code-behind
>Me.Theme = Me.Request.Form.Item(1).ToString
>ma dal DropDownList non preleva nessun valore.
>Come procedere?
facciamo prima se tu provia controllare l'insieme Page.Request e vedi tutte levariabili, basta che metti 1 breakpoint e lanci l'applicativo in debug.Appena si ferma scrivi la variabile nella finestra "watch" e da li puoi sfogliare tutte le sue proprieta'.
Ti accorgerai che ci saranno tutti controlli tuoi che sono stati messi nella pagina.
All'insieme cmq ti conviene accedere per nome e non per indice cosi' diventa piu facile per te e non incorri in errori...
ciao.

Matteo Raumer
MCAD ... .net addicted :-)
http://blogs.dotnethell.it/freeteo

Giovanni_3478 Profilo | Senior Member

Scrivendo
Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
If IsPostBack Then
Me.Theme = Page.Request.Form.Item("DropDownList1").ToString
End If
End Sub
mi dà un errore:
Riferimento a un oggetto non impostato su un'istanza di oggetto.

Ho provato a sfogliare le variabili di page, di page.request, e di page.request.form
dalla finestra watch
ma non ho trovato la voce relativa all'item del dropdownlist1 (l'id del controllo dropdownlist).

Evidentemente nell'evento preinit "non vede nulla..."

Provo ad usare il procedimento usato nel mio libro.
Ti chiedo però lumi sulla sintassi in c# della terza parte del codice: l'ho tramutata in VB
Questa è in c#
protected StringCollection GetAvalaibleThemes()
{
string path = Request.PhysiacalApplicationPath + @"App_Themes";
DirectoryInfo dir = new DirectoryInfo(path);
StringCollection themes=new StringCollection();
foreach (DirectoryInfo di in dir.GetDirectories())
themes.Add(di.Name);

return themes;
}


Questa è in VB
Protected Function GetAvalaibleThemes() As StringCollection

Dim path As String = Request.PhysiacalApplicationPath + @App_Themes
Dim dir = New IO.DirectoryInfo(path)

Dim themes = New StringCollection()

For Each di As IO.DirectoryInfo In dir.GetDirectories()
themes.Add(di.Name)
Next di

Return themes
End Function

Questo è un override del metodo GetAvalaibleThemes() della classe StringCollection?
La chiocciolina me porta come errore, come mai?
path me lo porta come errore, come mai?

freeteo Profilo | Guru

ciao,
il preinit viene lanciato anche la prima volta quando chiami la pagina, devi controllare il fatto che non sia nullo l'oggetto (o che IsPostback = false) cosa che invece quando fai il postback della pagina non succede (ma l'evento preinit viene scatenato lo stesso perche fa parte del ciclo di vita della pagina, in qualsiasi stato siamo)

Cmq stai facendo errori troppo grossolani che indicano che non hai la conoscenza minima per programmare in c# o vb .net, per asp.net.

Percui questo è il mio consiglio:
- devi deciderti con i linguaggi, ci sono delle cose di c# che per vb non vanno bene e viceversa, scegline uno, il piu' vicino alle tue conscenze passate magari
- studia bene il libro che hai, soprattutto cerca di capire bene prima di provare
- integra il libro con quello che trovi online nei vari tutorial online, magari parti da qualcuno di questi:
http://www.microsoft.com/italy/msdn/risorsemsdn/sviluppoweb/default.mspx
http://www.asp.net/quickstart/aspnet/Default.aspx
http://www.asp.net/learn/default.aspx?tabid=63

ciao.

Matteo Raumer
MCAD ... .net addicted :-)
http://blogs.dotnethell.it/freeteo

Giovanni_3478 Profilo | Senior Member

..il linguaggio l'ho già usato ed è VisualBasic;

...leggo e applico in modo da poter tornare sull'argomento

Il fatto è che nel mio libro su Asp.net (ma su tutti è vosì) la maggior parte degli esempi è in C#

...per questo cercavo di convertire la funzione sopra da c# a VB

Giovanni_3478 Profilo | Senior Member

Evito di aprire un altro post

Ho riscontrato un problema in cui si incappa da questa situazione:

ho una pagina master admin.master.vb con questo codice:

Protected Sub menu_main_MenuItemClick(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MenuEventArgs) Handles menu_main.MenuItemClick
Dim strMenu As String
If e.Item.Value = "default theme" Then
strMenu = menu_main.SelectedItem.Text
Session("strMenu") = strMenu
ElseIf e.Item.Value = "natura" Then
strMenu = menu_main.SelectedItem.Text
Session("strMenu") = strMenu
End If
End Sub




e una pagina default.aspx.vb (che eredita la pagina master di sopra) con questo codice:

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
Me.Theme = Session("strMenu")
End Sub


all' evento clic su un campo del menù viene scelto un tema;
con l'evento prerender viene caricato il tema dalla variabile session.

Per cambiare tema alla pagina con l'evento menu_main_MenuItemClick procedo così:
apro la pagina;
clicco sul campo del menù con cui avviene la scelta del tema;
la pagina va in postback;
l'evento prerender carica non il tema scelto ma
quello che era salvato precedentemente al clic nel menu;
viene eseguito il codice del'evento menu_main_MenuItemClick di cui sopra
che scrive nella variabile session il tema scelto;
DEVO AGGIORNARE la pagina;
l'evento prerender carica il tema scelto.


In pratica per far caricare il tema scelto devo innescare l'evento menu_main_MenuItemClick,
poi c'è il postback
e poi devo aggiornare la pagina.

Io vorrei che il tema venisse caricato al postback che segue l'evento menu_main_MenuItemClick (senza aggiornare la pagina successivamente).

Cosa ho sbagliato nel codice?

Giovanni_3478 Profilo | Senior Member

up

Giovanni_3478 Profilo | Senior Member

up

freeteo Profilo | Guru

ciao,
e fare 1altra strada ovvero usare querystring?
li lo puoi avere sempre senza problemi, qualcosa del tipo:

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

fai 1a pagina nuova e incolla il codice, con 2 temi "red" e "blue" nell'applicazione sfrutta il redirect della stessa e quindi riesci a cambiarlo senza problemi....
se ti puo' essere utile c'e' anche questa possibilita'...
ciao.

Matteo Raumer
MCAD ... .net addicted :-)
http://blogs.dotnethell.it/freeteo
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