Intercettare la creazione di una row di un repeater

mercoledì 22 giugno 2011 - 15.59

birraafiumi Profilo | Newbie


Informazione.
Programmo con Asp.net e vb.net.
Qualcuno sa se c'è ed eventualmente qual'è l'evento dell'oggetto repeater che si scatena alla creazione di ogni record?
Mi spiego meglio.
Io popolo il mio repeater con un comando sql che estrae 20 record.
Vorrei poter intercettare la creazione di ognuno (un pò com sugli eventi tipo fetchdata delle vecchie grid) dei recoerd, di

modo da poter inizializzare un campo del repeater stesso a mio piacimento:

Esempio: Se sul primo record il campo "tipo_utente" è = "C", dovrò inizializzare un dropdownlist, sempre all'interno del

repeater, posizionandolo sulla voce "Clienti".

Esiste un evento che posso intercettare e su cui posso modificare il contenuto dei campi del repeater stesso?

Se poi aveste un esempio mi salvereste la vita.

Ciao e grazie.

Gluck74 Profilo | Guru

Ti faccio un semplice esempio. Nel mio caso ho un datasource che prende i dati degli impiegati da NorthWind (che non sto a metterti).

OnItemDataBound="Repeater1_ItemDataBound": devi gestire l'evento ItemDataBound che viene lanciato per ogni "riga/record" che sta per essere "fatchato"
e.Item: è il controllo di tipo RepeaterItem, che espone sia i dati, sia tutti i controlli della singola riga del repeater
e.Item.DataItem: è il dato che identifica la singola riga; nel mio caso essendo i dati presi da un datatable, ogni riga è una DataRowView e relativa Row (ma potrebbe essere una classe nel caso Data Entity)

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="ObjectDataSource1" OnItemDataBound="Repeater1_ItemDataBound"> <ItemTemplate> <p> <%# string.Concat(Eval("LastName"), " ", Eval("FirstName"))%><br /> <asp:Image ID="imgImpiegato" runat="server" Visible="false" /> </p> </ItemTemplate> </asp:Repeater>

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { DataRow impiegato = ((DataRowView)e.Item.DataItem).Row as DataRow; if (impiegato["PhotoPath"] != null && !string.IsNullOrEmpty(impiegato["PhotoPath"].ToString())) { Image img = e.Item.FindControl("imgImpiegato") as Image; if (img != null) { img.ImageUrl = impiegato["PhotoPath"].ToString(); img.Visible = true; } } }

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

birraafiumi Profilo | Newbie

Grazie per la risposta.

ho ancora qualche dubbio.
Questa è la mia situazione (molto schematizzata):

PAGINA ASPX:

<asp:Repeater ID="RepeaterDip" runat="server" OnItemDataBound="RepeaterDip_ItemDataBound">
<HeaderTemplate>
<div id="Lista">
</HeaderTemplate>

<ItemTemplate>
<div class="PIPPO">
<asp:Label ID="Label3" runat="server" Text="Codice:"></asp:Label>
<%# Eval("PIPPO")%>
</div>

<div class="PLUTO">
<asp:Label ID="Label5" runat="server" Text="Cognome e nome:"></asp:Label>
<%# Eval("PLUTO")%>
</div>


<div class="Evento1">
<asp:Label ID="Label1" runat="server" Text="Evento 1"></asp:Label>
<asp:DropDownList ID="DropDownList2" runat="server"
DataSourceID="SqlDataSourceEvento" DataTextField="Evento"
DataValueField="TipoEvento">
</asp:DropDownList>
<asp:Label ID="Label2" runat="server" Text="Inizio"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

<asp:Label ID="Label15" runat="server" Text="Fine"></asp:Label>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>

</div>


</ItemTemplate>



<FooterTemplate>
</div>
</FooterTemplate>

</asp:Repeater>



VB.NET

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
lStr2 = "SELECT Pippo, Pluto "
lStr2 = lStr2 + "FROM Tab1 INNER JOIN Tab2 ON Tab1.CODICE = Tab2.Codice "
lStr2 = lStr2 + "WHERE ([Azienda]= '" + lblCodiceAzienda.Text + "') "

Dim StrConnection As String = WebConfigurationManager.ConnectionStrings("DatiEbaConnectionString").ConnectionString
Dim lConnection As New SqlConnection(StrConnection)

Dim comm As New SqlCommand(lStr2, lConnection)

lConnection.Open()

Dim Rs As SqlDataReader = comm.ExecuteReader()

RepeaterDip.DataSource = Rs
RepeaterDip.DataBind()

End Sub

Protected Sub RepeaterDip_ItemDataBound(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles RepeaterDip.ItemDataBound
Dim DataR As DataRow
DataR = e.Item.DataItem
Dim DDLApp As DropDownList
DDLApp = e.Item.FindControl("DropDownList2")
Select Case (DataR("Pippo"))
Case 2

DDLApp.DataValueField = 2

Case Else
DDLApp.DataValueField = 1
End Select


End Sub

Praticamente devo, riga per riga, in base al contenuto di Pippo, attribuire un valore diverso alla dropdownlist.
Però non funziona.

Gluck74 Profilo | Guru

Innanzi tutto un po di pulizia: tutte quelle label, se non le devi modificare da codice, non ti servono a niente.

<asp:Repeater ID="RepeaterDip" runat="server" OnItemDataBound="RepeaterDip_ItemDataBound"> <HeaderTemplate> <div id="Lista"> </HeaderTemplate> <ItemTemplate> <div class="PIPPO"> Codice:&nbsp;<%# Eval("PIPPO")%> </div> <div class="PLUTO"> Cognome e nome:&nbsp;<%# Eval("PLUTO")%> </div> <div class="Evento1"> Evento 1 <asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="SqlDataSourceEvento" DataTextField="Evento" DataValueField="TipoEvento"> </asp:DropDownList> Inizio <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> Fine <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox> </div> </ItemTemplate> <FooterTemplate> </div> </FooterTemplate> </asp:Repeater>

Inoltre, il codice potrebbe anche andare bene, ma:
DataR("Pippo") contiene un numero? fai il cast giusto nel Select Case
DataValueField vuole una stinga che indica la colonna dalla quale prendere i valori
Dim DataR As DataRow DataR = e.Item.DataItem.Row Dim DDLApp As DropDownList DDLApp = e.Item.FindControl("DropDownList2") Select Case (CType(DataR("Pippo"),int)) Case 2 DDLApp.DataValueField = "nome colonna 2" Case Else DDLApp.DataValueField = "nome colonna 1" End Select DDLApp.DataBind

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

birraafiumi Profilo | Newbie

Però sulla riga di codice
DataR = e.Item.DataItem.Row
si pianta.

Variabile oggetto o variabile del blocco With non impostata.

Non riesco ad inizializzare il mio DataR...

Gluck74 Profilo | Guru

dipende da che dati sono agganciati al controllo tramita la proprietà dasasource.
Se hai una datatable, allora la proprietà Dataitem del repeater ti mette a disposizione una proprietà (row) per accedere alla datarow corrente.

Ora non sono sicurissimo che in VB si acceda alla stessa maniera, metti un breackpoint sulla riga e controlla cosa ti espone il Dataitem.

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.

birraafiumi Profilo | Newbie

il controllo è popolato così:

...
Dim Rs As SqlDataReader = comm.ExecuteReader()

RepeaterDip.DataSource = Rs
RepeaterDip.DataBind()


Purtroppo non ne vengo a capo.
Non capisco se sbaglio a dichiarare

Dim DataR As DataRow


o a inizializzarlo

DataR = e.Item.DataItem



Ho messo un breackpoint sulla riga e ma il Dataitem mi espone solo metodi...

Gluck74 Profilo | Guru

No infatti, utilizzando un datareader non puoi avere dei DataRow accedibili.
Altre a non poter accedere ai dati nell'evento ItemDataBound, ti sconsiglio di utilizzare un sqldatareader perché
è un oggetto collegato, quindi lascia la connessione al database aperto.

Piuttosto utilizza un datatable.


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

birraafiumi Profilo | Newbie

Adesso per popolare il repeater uso un DataTable ma l'errore persiste

723x388 98Kb



Consigli?

birraafiumi Profilo | Newbie

Ti dirò di più.
I dati li ho in pancia ma non riesco in nessun modo a estrapolarli.
Guarda l'immagine allegata...


1160x701 180Kb



birraafiumi Profilo | Newbie

Risolto:
Dim DataR As System.Data.DataRowView
DataR = e.Item.DataItem

Dim aaa As Object

aaa = DataR.Row.Item("DenTipoEvento1")


Il problema è che il dropdownlist non mi tiene i valori.
Anche forzandogli una cosa del tipo
DDLApp.DataValueField = "2"
Il dropdownlist mi mostra sempre il contenuto del primo elemento.
Per capirci:

Protected Sub RepeaterDip_ItemDataBound(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles RepeaterDip.ItemDataBound

Dim DataR As System.Data.DataRowView

DataR = e.Item.DataItem
If IsNothing(DataR) Then Exit Sub

Dim DDLApp As DropDownList
DDLApp = e.Item.FindControl("ddlevento1")

DDLApp.DataValueField = "2" 'DataR.Row.Item("DenTipoEvento1")

DDLApp.DataBind()

End Sub


Il contenuto di dropdownlist DDLApp, anzichè essere "Pluto" (l'elemento con value "2") continua a essere "Pippo" (l'elemento con value "1")
Anche non forzando il .DataBind alla fine il problema resta.


Gluck74 Profilo | Guru

per quanto riguarda l'errore che avevi in foto, in effetti mancava il cast.
Se guardi nel post che ti avevo mandato all'inizio c'era il cast (in C#)

>DataRow impiegato = ((DataRowView)e.Item.DataItem).Row as DataRow;

Poi ce lo siamo persi.....

Per quanto riguarda il DDL:
scusa ma non avevo capito, tu vuoi solo "posizionare" la DDL su uno dei valori che "contiene già"
devi usare la "SelectedValue", non la DataValueField

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

birraafiumi Profilo | Newbie

Sei stato gentilissimo. Ora questa parte sembra funzionare.
L'ultima parte l'ho inviata in un altro post.

Ce ne fosse di gente così disponibile.
Ti devo una birra....

Gluck74 Profilo | Guru

wow, non rifiuto mai una bella birra ghiacciata!!!

ha ha ha
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