Domanda sui repeater innestati

sabato 26 agosto 2006 - 00.24

Giovanni_3478 Profilo | Senior Member

Ho letto un tutorial sui repeater innestati
http://support.microsoft.com/default.aspx?scid=kb;EN-US;306154


prendendo il link (suggerito da freeteo) da un post di qualche settimana fa
http://www.dotnethell.it/forum/messages.aspx?ThreadID=8840


Sto cercando di applicarlo
ma non riesco a capire una parte di sintassi in C#.

Questa è una parte di codice:

<!-- start parent repeater -->
<asp:repeater id="parentRepeater" runat="server">
<itemtemplate>
<b><%# DataBinder.Eval(Container.DataItem,"au_id") %></b><br>

<!-- start child repeater -->
<asp:repeater id="childRepeater" datasource='<%# ((DataRowView)Container.DataItem)
.Row.GetChildRows("myrelation") %>' runat="server">

<itemtemplate>
<%# DataBinder.Eval(Container.DataItem, "[\"title_id\"]")%><br>
</itemtemplate>
</asp:repeater>
<!-- end child repeater -->

</itemtemplate>
</asp:repeater>
<!-- end parent repeater -->






Questa riga di codice
datasource='<%# ((DataRowView)Container.DataItem).Row.GetChildRows("myrelation")%>

e quest'altra
<%# DataBinder.Eval(Container.DataItem, "[\"title_id\"]")%>

in VB
come va scritta?

alx_81 Profilo | Guru

Ciao!
>
>Questa riga di codice
>datasource='<%# ((DataRowView)Container.DataItem).Row.GetChildRows("myrelation")%>

datasource='<%# DirectCast(Container.DataItem,DataRowView).Row.GetChildRows("myrelation")%>

>
>e quest'altra
> <%# DataBinder.Eval(Container.DataItem, "[\"title_id\"]")%>

<%# DataBinder.Eval(Container.DataItem, "title_id")%>

Alx81 =)

http://blogs.dotnethell.it/suxstellino

Giovanni_3478 Profilo | Senior Member

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

e date queste tabelle del db:
categories:categories_id, categories_image, parent_id, sort_order,data_added, last_modified;
categories_description: categories_id, language_id, categories_name;
(la relazione è stata fatta tra
categories_id della tabella categories e
categories_id della tabella categories_description.

mi restituisce quest'errore

'System.Data.DataRow' non contiene una proprietà con nome 'categories_name'

Anche sostituendo categories_name con il nome di una'altra colonna
il risultato non cambia.

1) In questa riga
<%# DirectCast(Container.DataItem,DataRowView).Row.GetChildRows("myrelation")%>
viene fatto un cast a DataRowView. Ma da quale tipo viene fatto il cast a DataRowView?
Dovrebbe castare da dataset a DataRowView. Giusto?

2) perchè viene fatto un cast? non posso usare direttamente il dataset istanziato denominato ds (è scritto nel codice)? Quindi
<asp:Repeater ID="Repeater2" runat="server" datasource='<%# dataset %>'>
anzichè
<asp:Repeater ID="Repeater2" runat="server" datasource='<%# DirectCast(Container.DataItem,DataRowView).Row.GetChildRows("myrelation")%>'> ?????

3)Container che classe è? Qual' è lo spazio dei nomi?

4) la relazione viene fatta a livello di codice.
Ma se viene fatta direttamente in un diagramma nel database non è la stessa cosa?

alx_81 Profilo | Guru

>mi restituisce quest'errore
>
>'System.Data.DataRow' non contiene una proprietà con nome 'categories_name'

non avevo indicato nella risposta le parentesi queadre per il campo di relazione.
[categories_name]
>
>Anche sostituendo categories_name con il nome di una'altra colonna
>il risultato non cambia.

ci vogliono le parentesi quadre

>
>1) In questa riga
><%# DirectCast(Container.DataItem,DataRowView).Row.GetChildRows("myrelation")%>
>viene fatto un cast a DataRowView. Ma da quale tipo viene fatto
>il cast a DataRowView?
>Dovrebbe castare da dataset a DataRowView. Giusto?

dalla riga del datatable padre.
DataTable Padre
DataRow1, --> cast a DataRowView
DataRow2, --> cast a DataRowView
....
Fine DataTable Padre

>
>2) perchè viene fatto un cast? non posso usare direttamente il
>dataset istanziato denominato ds (è scritto nel codice)? Quindi
><asp:Repeater ID="Repeater2" runat="server" datasource='<%#
>dataset %>'>
>anzichè
><asp:Repeater ID="Repeater2" runat="server" datasource='<%#
>DirectCast(Container.DataItem,DataRowView).Row.GetChildRows("myrelation")%>'>
>?????

In questo caso no, perchè tu puoi dare al padre il dataset. Ma ai repeater figli devi indicare la relazione di quella riga con l'eventuale altra tabella. Se volessi usare direttamente il datatable relativo alla seconda tabella, potresti farlo da codice:

Repeater2.DataSource = dt.Tables("categories_name")

In quel modo però i repeater sarebbero "slegati".. con la relazione tutto è più "automatico".

>3)Container che classe è? Qual' è lo spazio dei nomi?

System.ComponentModel.Container
E' una classe che consente di incapsulare un qualunque componente.
>
>4) la relazione viene fatta a livello di codice.
>Ma se viene fatta direttamente in un diagramma nel database non
>è la stessa cosa?

Ci sono due livelli ben distinti:
1) il data layer, nel nostro caso il sql server ad esempio
2) il dataset in memoria che ti crei.
Sono due ambienti distinti. Nel primo hai proprio il database fisico, nel secondo te ne crei una copia in locale, per cui hai bisogno di definirti localmente anche le tabelle e le relazioni.

Spero di esserti stato di aiuto..
Ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

Giovanni_3478 Profilo | Senior Member

Mi sei stato di grande aiuto

Per capire la sintassi:

1) Quando scrivo
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<b><%#DataBinder.Eval(Container.DataItem, "parent_id")%></b><br>

Il Container.DataItem contiene il dataset giusto?


2)
-------------------------------------------------------------------------------------------------------
>2) perchè viene fatto un cast? non posso usare direttamente il
>dataset istanziato denominato ds (è scritto nel codice)? Quindi
><asp:Repeater ID="Repeater2" runat="server" datasource='<%#
>dataset %>'>
>anzichè
><asp:Repeater ID="Repeater2" runat="server" datasource='<%#
>DirectCast(Container.DataItem,DataRowView).Row.GetChildRows("myrelation")%>'>
>?????
-------------------------------------------------------------------------------------------------------
In questo caso no, perchè tu puoi dare al padre il dataset. Ma ai repeater figli devi indicare la relazione di quella riga con l'eventuale altra tabella. Se volessi usare direttamente il datatable relativo alla seconda tabella, potresti farlo da codice:

Repeater2.DataSource = dt.Tables("categories_name")

In quel modo però i repeater sarebbero "slegati".. con la relazione tutto è più "automatico".
-------------------------------------------------------------------------------------------------------
Non può essere indicata la relazione di quella riga con l'eventuale altra tabella con il dataset?
Esempio per farmi capire: dataset.Row.GetChildRows("myrelation")
....invece di fare il cast
DirectCast(Container.DataItem,DataRowView).Row.GetChildRows("myrelation")
????

3) Scrivere "[categories_name]" anzichè "categories_name"
ha come differenza quella che con le parentesi quadre si intende un campo di una tabella che partecipa ad una relazione con un'altra tabella?

4) Scrivere databinder.Eval (classe + metodo)
e scrivere Eval (solometodo statico)
in che cosa differisce?
Ho fatto delle prove: eliminando DataBinder mi restituisce errore.

Domanda sul tutorial:
1) il risultato che io voglio ottenere è:

informatica :
Portatili e accessori
Palmari e accessori
Personal computer
Gps

Fotografia:
Fotocamere Digitali e Accessori
Memorie Fotocamere
Lettori Memorie Flash
Macchine fotografiche

Un menù cioè con categorie e sottocategorie.

Ora risolti i problemi di sintassi c'è un problema di logica.

Per le mie tabelle ho preso spunto da un database mysql
tabelle categories
http://img247.imageshack.us/my.php?image=dbcategoriesvr5.png
e tabella categories_description
http://img83.imageshack.us/my.php?image=dbcategoriesdescriptionkv9.png

Le tabelle relative al tutorial
http://support.microsoft.com/default.aspx?scid=kb;EN-US;306154
come sono strutturate?
Quali sono i campi?

alx_81 Profilo | Guru

>Mi sei stato di grande aiuto
>

figurati, è un piacere

>Per capire la sintassi:
>
>1) Quando scrivo
><asp:Repeater ID="Repeater1" runat="server">
> <ItemTemplate>
><b><%#DataBinder.Eval(Container.DataItem, "parent_id")%></b><br>
>
>Il Container.DataItem contiene il dataset giusto?

Contiene il datatable (Che è come una tabella di un db, considera il dataset come un database in locale) che hai indicato da codice:
Repeater1.DataSource = ds.Tables("categories")

>Non può essere indicata la relazione di quella riga con l'eventuale
>altra tabella con il dataset?
>Esempio per farmi capire: dataset.Row.GetChildRows("myrelation")
>....invece di fare il cast
>DirectCast(Container.DataItem,DataRowView).Row.GetChildRows("myrelation")
>????
>

No, il problema è che il concetto è proprio diverso..
Quando vai ad effettuare il bind del padre (Repeater1.DataSource = ds.Tables("categories")), siccome esiste una relazione con un'altra datatable, il figlio può usare come datasource proprio quella relazione.
Quest'ultimo vede come Container.DataItem un DataRowView (vista di una riga di un datatable, ovvero la riga corrente del repeater) e il cast è obbligato per poter puntare direttamente alla riga, tramite la proprietà Row, e per poi finire al metodo che torna la relazione.
Devi pensare di partire dalla riga corrente del padre, non dal dataset.

Padre
Riga1
Relazione su Riga1
Relazione su Riga1
Riga2
Relazione su Riga2
Riga3
Relazione su Riga3
Relazione su Riga3
Relazione su Riga3

>3) Scrivere "[categories_name]" anzichè "categories_name"
>ha come differenza quella che con le parentesi quadre si intende
>un campo di una tabella che partecipa ad una relazione con un'altra
>tabella?



>
>4) Scrivere databinder.Eval (classe + metodo)
>e scrivere Eval (solometodo statico)
>in che cosa differisce?
>Ho fatto delle prove: eliminando DataBinder mi restituisce errore.

DataBinder.Eval, valuta a runtime l'espressione di associazione dati per un oggetto.
Container.DataItem è la "riga", il secondo parametro, String, è la "colonna", o meglio il suo nome.
non capisco cosa intendi per classe + metodo. Container.DataItem è l'oggetto a cui associare il campo "categories_name" ad esempio.

>
>Domanda sul tutorial:
>1) il risultato che io voglio ottenere è:
>
>informatica :
>Portatili e accessori
>Palmari e accessori
>Personal computer
>Gps
>
>Fotografia:
>Fotocamere Digitali e Accessori
>Memorie Fotocamere
>Lettori Memorie Flash
>Macchine fotografiche
>
>Un menù cioè con categorie e sottocategorie.
>
>Ora risolti i problemi di sintassi c'è un problema di logica.
>
>Per le mie tabelle ho preso spunto da un database mysql
>tabelle categories
>http://img247.imageshack.us/my.php?image=dbcategoriesvr5.png
>e tabella categories_description
>http://img83.imageshack.us/my.php?image=dbcategoriesdescriptionkv9.png
>
>Le tabelle relative al tutorial
>http://support.microsoft.com/default.aspx?scid=kb;EN-US;306154
>come sono strutturate?
>Quali sono i campi?

Database Pubs di sql server 2000
eccoti gli script:

CREATE TABLE [dbo].[authors](
[au_id] [id] NOT NULL PRIMARY KEY,
[au_lname] [varchar](40),
[au_fname] [varchar](20),
[phone] [char](12) DEFAULT ('UNKNOWN'),
[address] [varchar](40),
[city] [varchar](20),
[state] [char](2),
[zip] [char](5),
[contract] [bit] NOT NULL,
GO
ALTER TABLE [dbo].[authors] WITH CHECK ADD CHECK (([au_id] like '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]'))
GO
ALTER TABLE [dbo].[authors] WITH CHECK ADD CHECK (([zip] like '[0-9][0-9][0-9][0-9][0-9]'))



CREATE TABLE [dbo].[titleauthor](
[au_id] [id] NOT NULL,
[title_id] [tid] NOT NULL,
[au_ord] [tinyint] NULL,
[royaltyper] [int] NULL,
CONSTRAINT [UPKCL_taind] PRIMARY KEY CLUSTERED
(
[au_id] ASC,
[title_id] ASC
) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[titleauthor] WITH CHECK ADD FOREIGN KEY([au_id])
REFERENCES [dbo].[authors] ([au_id])
GO
ALTER TABLE [dbo].[titleauthor] WITH CHECK ADD FOREIGN KEY([title_id])
REFERENCES [dbo].[titles] ([title_id])

Ciao!



Alx81 =)

http://blogs.dotnethell.it/suxstellino

Giovanni_3478 Profilo | Senior Member

Riguardo l' sql che hai scritto
ho dei problemi a comprendere la sintassi dei vincoli check

C'è un modo per eseguire questa sintassi con un copia e incolla?

ps. dove hai preso i dati relativi alle tabelle?

alx_81 Profilo | Guru

Eliminali pure.. in realtà, non sono necessari..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

Giovanni_3478 Profilo | Senior Member

Ho risolto.

Grazie mille
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5