Newsgroup: it.comp.www.asp
Titolo: [ASP.NET] repeater annidiati e dataset con relazione, che macello!

Ok, ora che la moderazione è tornata a funzionare son invogliato a postare
:-P
Ieri, continuando lo sviluppo della mia web app., mi sono trovato innanzi
alla necessità di avere dei repeater annidiati, nulla di male, letto MSDN di
qua e di la, usato google e sono arrivato ad avere il mio bel template
gerarchico (per la cronaca un menù dinamico, collegato alla gestione della
aree che ho spiegato il topic precedente).
Il problema nasce però dal fatto che questo menù, deve variare in base a
diversi parametri, non è un menù calcolato all'avvio della mia
web_application.
Quindi la situazione è questa:
ho due datatable in relazione tra loro, infilati in un dataset
le due tabelle corrispondo ai gruppi delle varie aree (Linguaggi, Servizi,
etc...) e alle aree ad essi collegate.
Potete vedere come è ora qui (non cliccate sui link tanto non portano da
nessuna parte) a sinistra
http://inwork.redangel.it/
Così come è ora, vengono visualizzate tutte le voci presenti nel dataset nel
modo corretto, il punto è che ad esempio io vorrei poter visualizzare solo
quelli del gruppo3 (e questo riesco a farlo bindando al posto del dataset il
dataview della tabella padre con il rowfilter impostato ad esempio
="IDGruppo=3" ) ma che siano ad esempio solo linkpubblici (ogni area ha una
proprietà che dice se è un'area pubblica o meno)
Ci ho provato in tutti i modi ma non c'è stato verso di bindare il mio
datareader padre ad una fonte dati filtrata
Non c'è un metodo che mi sfugge, che fa si che dopo aver impostato un filtro
ai vari defaultview delle tabelle, utilizzi i valori filtrati invece che le
tabelle intere?
Un po' di codice (numero le righe in caso si incasini il messaggio):
nel file .asax:
01<div id="menugen">
02 <asp:Repeater ID="repeaterTitSezioni" Runat="server"
nableViewState="False">
03  <ItemTemplate><div class="tmnu"><%#DataBinder.Eval(Container.DataItem,
"NomeGruppo")%></div>
04   <asp:Repeater ID="repeaterVociMenu" Runat="server"
EnableViewState="False"
DataSource='<%#Container.DataItem.Row.GetChildRows("relazione")%>'>
05    <ItemTemplate><div class="mnu1"
onmouseover="javascript:overMenu(this);"
onmouseout="javascript:outMenu(this);"><a
href="<%#Container.DataItem("url")%>"><%#Container.DataItem("voce")%></a></d
iv>
06    </ItemTemplate>
07   </asp:Repeater>
08  </ItemTemplate>
09 </asp:Repeater>
10 </div>
nel codebehind:
01Sub CaricaMenu()
02   Dim numLinks As Integer
03   Dim ds As New DataSet
04   Dim dt1, dt2 As DataTable
05   Dim valori(3) As Object
06
07   dt1 = AreeSito.dtGruppi.Copy
08
09   dt2 = New DataTable("menu")
10   dt2.Columns.Add("IDGruppo", GetType(Integer))
11   dt2.Columns.Add("voce", GetType(String))
12   dt2.Columns.Add("url", GetType(String))
13   dt2.Columns.Add("isPublic", GetType(Boolean))
14   For numLinks = 1 To AreeSito.collAreeSito.Count
15      valori(0) = CType(AreeSito.collAreeSito(numLinks),
cAreeSito.structAreaSito).IDGruppoArea
16      valori(1) = CType(AreeSito.collAreeSito(numLinks),
cAreeSito.structAreaSito).NomeArea
17      valori(2) = CType(AreeSito.collAreeSito(numLinks),
cAreeSito.structAreaSito).LinkArea
18      valori(3) = CType(AreeSito.collAreeSito(numLinks),
cAreeSito.structAreaSito).bLinkAreaPubblico
19      dt2.Rows.Add(valori)
20   Next
21
22   dt1.GetChanges(DataRowState.Modified)
23   ds.Tables.Add(dt1)
24   ds.Tables.Add(dt2)
25   ds.Relations.Add("relazione", ds.Tables(0).Columns("IDGruppo"),
ds.Tables(1).Columns("IDGruppo"))
26
27   repeaterTitSezioni.DataSource = ds
28   repeaterTitSezioni.DataBind()
29
30   ds = Nothing
31   dt1 = Nothing
32   dt2 = Nothing
33End Sub
Il codice mostrato è quello che funziona perfettamente ma che non filtra
nulla
ho provato agendo su ds.Tables(0).DefaultView.RowFilter e
Tables(1).DefaultView.RowFilter ma posso bindare solo un dataview (speravo
si potesse bindare il datamanager del dataset ma non riesco)
qualcuno sa come fare?
Alla fine mi conviene costruirmi l'HTML senza usare il repeater mi sa....
solo che volevo dividere il codice dalla sua rappresentazione e il repeater
me lo consentirebbe :/
ciao
-- 
Fabio Angela (aka Red Angel)
cerchi consigli per un hosting? 
http://hosting.redangel.it
http://www.redangel.it
 - il portale sulla programmazione


Moderatore di it.comp.www.asp - Microsoft .NET MVP
http://www.aspitalia.com/
 Enjoy the .NET community!
http://www.dev2dev.it/
 La rete ha connesso nuove particelle!
http://www.extensible.it/
 XML and beyond

 dovrebbe bastare.
fosse cosě semplice... :-)
come dicevo ho diversi filtri da dover applicare a diverse tabelle tra loro
in relazione, ma non ho trovato nessun modo per avere una dataview come si
deve che prenda in considerazione le rowfilter applicate alle tabelle in
relazione con loro, perchč io dovrei in poche parole sommare i filtri di due
dataview.
Tutto sarebbe perfetto se si potesse fare come dici tu indicando magari come
filtro della dataview anche il nome della tabella (in poche parole farla
diventare una query SQL classica), perň il metodo DefaultView che tu mi
suggerisci, nei DataSet non esiste! :(
Esiste solo il DefaultViewManager, che perň purtroppo non č bindabile (o per
lo meno io non sono riuscito a bindarlo)
Ripeto quel che voglio tentare:
date due tabelle "dt1" e "dt2" in relazione tra loro con la relazione
"dt1dt2relation", poter porre un rowfilter su dt1 e dt2 e avere i risultati
di questi due filtri applicati al bind che voglio ottenere
Ci ho provato piů o meno in tutti i modi che mi sono saltati in testa ma non
ci sono riuscito, a questo punto mi vien da pensare che non esista nessun
metodo che faccia quel che cerco io e che quindi stia a me fare
l'overloading sugli ItemBind e applicare i filtri manualmente (sicuramente
una cosa molto scomoda)
A dire il vero mi basterebbe anche solo un metodo che, data una dataview, mi
restituisca una datatable con i valori filtrati, perň anche questo metodo
non l'ho trovato.
Non ho tutta questa esperienza con 
ADO.NET
 per poter escludere l'esistenza
di qualche metodo utile per ottenere quel che cerco, se qualcuno conosce una
via semplice (altrimenti mi metto l'anima in pace e mi faccio una mia classe
che permetta questo)


 classe che permetta questo)
la via semplice (e la migliore) è sempre la stessa: filtra i dati
all'origine, ad esempio nella SP.
estrai solo i dati che ti servono e non consumi tempo a filtrare 
q.sa
 che
avresti già potuto fare a monte.
mi pare di capire che sia un'estrazione in real time da db, senza Cache di
mezzo, dunque non è un grosso problema.
altrimenti credo che ti tocchi filtrare e poi ricreare manualmente le
relazioni.


 relazioni.
Si sono d'accordo, purtroppo pero` non e` come pensi e i dati non arrivano
da una DB o da un file XML ma da un oggetto in memoria popolato all'avvio
dell'Application.
Non mi resta che filtrare a mano
Ma possibile che non esista neppure una funzione che data una DataView
restituisca una DataTable contenente solamente i record filtrati?
Sarebbe di grande aiuto
ciao!
-- 
Fabio Angela (aka Red Angel)
cerchi consigli per un hosting? 
http://hosting.redangel.it
http://www.redangel.it
 - il portale sulla programmazione
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it