I in Repeater

lunedì 09 maggio 2011 - 16.44

maxcondor Profilo | Newbie

Salve, ragazzi, utilizzando il controllo Repeater visualizzo dei dai prelevati da un db sql
..... <asp:Repeater ID="Repeater1" runat="server" DataSourceID="DSNews"> <ItemTemplate> <div class="fotoNews"><img src="public/FotoNews/<%# Eval("Foto")%>" alt="" /></div> <div class="contenutoNews"> <div class="titoloNews"><%# Eval("Titolo")%></div> <div class="testoNews"><%# Eval("Testo")%></div> </div> </ItemTemplate> </asp:Repeater> ......
Così visualizzo le mie belle news, però può capitare di non volere inserire una foto relativa ad una news, pertanto in asp classico utilizzavo un condizione if in Vb
<% if rs("fotoNews") <>"" then %> <div class="fotoNews"><img src="public/FotoNews/<%=rs("fotoNews")%> " alt="" /></div> <%end if%>
In asp.net e utlizzando c# ho provato a scrivere una cosa del genere ma ovviamente non funziona perché penso che bisogna agire nella pagina del code-behind.
<%if(Eval("Foto") <>"" ){ %> <div class="fotoNews"><img src="public/FotoNews/<%# Eval("Foto")%>" alt="" /></div> <% }%>
Mi date una mano a capire dove sbaglio? Grazie

Gluck74 Profilo | Guru

Ciao,
si, ti confermo che devi utilizzare gli eventi nel codeBehind.
Io ti consiglio le seguenti modifiche:

1 - Trasforma il tag img in asp:img nel seguente modo:
<asp:Image runat="server" ID="imgNews" ImageUrl="~/Images/noImage.gif" Visible="false" alt="" />
2 - aggiungi al tag repeater la seguente proprietà:
onitemdatabound="Repeater1_ItemDataBound"
3 - nel code behind, aggiungi la seguente procedura:
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { RepeaterItem item = e.Item; if (item.ItemType == ListItemType.Item) { DataRowView dr = (DataRowView)item.DataItem; if (dr["Email"] != null && !string.IsNullOrEmpty(dr["Email"].ToString())) { Image imgNews = e.Item.FindControl("imgNews") as Image; if (imgNews != null) { imgNews.ImageUrl = dr["Email"].ToString(); imgNews.Visible = true; } } } }


ciao ciao

P.S.: in C# il "diverso" non è "<>" ma "!="

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

alexmed Profilo | Guru

Ciao
Ma così:

<asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("Immagine") %>' Width="150px" Visible='<%# Eval("Immagine").ToString.Length > 0 %>' />

Potrebbe andar bene?


alexmed

Gluck74 Profilo | Guru

si, è la stessa cosa.
Nel modo che hai scritto tu è più semplice e veloce, però hai meno controllo. Agendo sul code behind hai più controllo su eventuali errori.

infatti ti devo fare una correzione:
correggi l'istruzione sulla proprietà visible in questo modo (le parentesi su ToString):
Visible='<%# Eval("Immagine").ToString().Length > 0 %>'

Inoltre, cosa succede se il campo "Immagine" ha valori NULL??? succede che hai un errore in runtime. Allora dovresti trasformare in questo modo:
Visible='<%# isVisible(Eval("Email")) %>'
dove isVisible è una funzione nel codebehind:
protected bool isVisible(object email) { if (!string.IsNullOrEmpty(email as string)) return true; return false; }

Questo è un metodo un pochetto "asp like"; visto che comunque devi scrivere nel codebehind, io preferisco la gestione degli eventi, anche se c'è da scrivere qualcosina in più.

Ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

maxcondor Profilo | Newbie

Tra poco testo la tua soluzione:
Mi puoi spiegare meglio la tua soluzione, compresa la procedura da scrivere nella pagina di codice? Ho capito ovviamente il senso, ma essendo ai primi passi di asp.net... "penso" ancora al modo di operare con asp

onitemdatabound="Repeater1_ItemDataBound" ???


Grazie

maxcondor Profilo | Newbie

Allora sto testando la soluzione proposta, avrei delle cose da chiedere:
1) il codice va inserito nella public partial class _Default : System.Web.UI.Page ?
2) se lo inserisco in questa posizione DataRowView mi viene segnalato come errore (Impossibile trovare il tipo o il nome dello spazio dei nomi 'DataRowView'; probabilmente manca una direttiva using o un riferimento a un assembly)

Gluck74 Profilo | Guru

è un po il modo di vedere le cose con il framework .net
In ASP eravamo abituali a scrivere parte del codice insieme ai tag HTML, pioché le pagine asp erano interpretate e producevano direttamente il risultato.
Si potevano fare degli accorgimenti più o meno compplicati per cercare di separare il più possibile il codice di programmazione dalla pagina vera e propria, ma sempre pagine interpretate erano.

Con l'avvento del .net, la cosa è cambiata molto. Le pagine aspx sono veri e propri pezzi di codice compilati ed eseguiti, e la pagina aspx viene creata in maniere totalmente diversa. Questo ci porta a poter sviluppare in un ambinete realemente ad oggetti ed orientato agli eventi (come la classica programmazione windows).

La pagina dunque è un vero e proprio oggetto con dei comportamenti, ed ha una sua "vita".
Idem per i controlli.
In questo caso, abbiamo all'interno della pagina, un oggetto (il repeater) che ha dei comportamenti particolari, e per l'appunto il "databound".
Ovvero viene rilasciato un evento ogni volta che una riga di dati viene "utilizzata" per creare il risultato. Per ogni riga di dato viene ripetuto il codice dentro <itemtemplate> (in asp lo facevamo a mano con il foreach e i tag <%= %>).
In asp.net in effetti c'è ancora la possibilità di utilizzare i marcatori dentro il codice aspx ( eval("..") o Bind("..") ), ma per cose semplici. In verità è sempre la fase di "bind" dei dati che sta lavorando.
Ogni volta che l'evento viene lanciato, viene eseguito il pezzo di codice (la function) specificato nella proprietà che abbiamo aggiunto al repeater.
Té capì????

Riferimenti:
http://msdn.microsoft.com/en-us/library/ms178472.aspx
http://msdn.microsoft.com/en-us/library/aa719775(VS.71).aspx
http://support.microsoft.com/kb/307860


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

maxcondor Profilo | Newbie

Grazie dei preziosi consigli Gluck74, però come riportato nella mia ultima risposta il codice mi genera un errore

Gluck74 Profilo | Guru

Scusa, stavo rispondendo mentre hai scritto il post, che quindi non avevo letto.

>Allora sto testando la soluzione proposta, avrei delle cose da
>chiedere:
>1) il codice va inserito nella public partial class _Default
>: System.Web.UI.Page ?
Si esatto. Per ogni pagina aspx (in questo caso Default.aspx), esiste la relativa pagina di "code behind" che si chiama Default.aspx.cs (nel caso di C#)

>2) se lo inserisco in questa posizione DataRowView mi viene segnalato
>come errore (Impossibile trovare il tipo o il nome dello spazio
>dei nomi 'DataRowView'; probabilmente manca una direttiva using
>o un riferimento a un assembly)
In cima alla pagina vedi una serie di "using ..."
aggiungi
using System.Data;

Ciao buon lavoro

>
>


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

maxcondor Profilo | Newbie

Tutto funziona!!! Piano piano sto cercando di entrare nel mondo asp.net...
ho dovuto solamente fare una correzione:
imgNews.ImageUrl ="~/public/FotoNews/" + dr["Foto"].ToString();
ho aggiunto il percorso alla foto!.
Mi consigli un buon libro per iniziare con asp.net 4.0?
Grazie ancora per l'aiuto

Gluck74 Profilo | Guru

sinceramente, io sono ancora sul 3.5!!!!!!!!!!!!!!!!!

be, sicuramente il nostro caro Dino Esposito avrà dato del suo meglio per il nuovo libro che ha scritto:
http://www.amazon.it/Programming-Microsoft-ASP-NET-Dino-Esposito/dp/0735643385/ref=sr_1_cc_2?ie=UTF8&qid=1305036582&sr=1-2-catcorr

Comunque, per esperienze precedenti, sono di buona qualità anche questi:
http://www.amazon.it/ASP-NET-4-0-VB-Linguaggi-programmazione/dp/8820345536/ref=sr_1_1?ie=UTF8&qid=1305036582&sr=1-1
http://www.amazon.it/Beginning-ASP-NET-4-C-2010/dp/1430226080/ref=sr_1_10?ie=UTF8&qid=1305036924&sr=8-10
entrambi in versione beginning e Pro.

ciao ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5