21 messaggi dal 23 novembre 2006
Ciao a tutti, sarò preciso e breve:

datagrid1:
colonne| Famiglia

righe | CognomeFamiglia

Row details| nome Componente1
| nome Componente2
| nome Componente3

il datagrid 1 ha la colonna Famiglia in cui le righe rappresentano tutti i nuclei familiari tramite il cognome, al click sul cognome della famiglia appare il row details che dovrebbe riportare i nomi appartenenti alla famiglia selezionata.

Es. Famiglia: Verdi -- row details: Antonio verdi, Francesco Verdi ecc.

Ho creato un datatemplate in una risorsa in modo tale da poterla richiamre ovunque:

<Grid x:Name="LayoutRoot" Background="White">
<Grid.Resources>
<DataTemplate x:Key="DTDettaglio">
<StackPanel Orientation="Horizontal">
<!-- Questi sono i controlli visualizzati nel rowdetail -->
<TextBlock Text="Nome: "></TextBlock>
<TextBox FontSize="12"
Text="{Binding NOME, Mode=TwoWay}"> </TextBox>
<TextBlock Text="Cognome: "></
TextBlock>
<TextBox FontSize="12" Text="{Binding COGNOME, Mode=TwoWay}"></TextBox>
<TextBlock Text="Note: "></TextBlock>
<TextBox FontSize="12" Text="{Binding NOTE, Mode=TwoWay}"></TextBox>
</StackPanel>
</DataTemplate>
</Grid.Resources>

poi ho creato 2 datagrid con il riferimento al resource appena creato:

<data:DataGrid x:Name="grid1" AutoGenerateColumns="True"
RowDetailsVisibilityMode="VisibleWhenSelected"
RowDetailsTemplate="{StaticResource DTDettaglio}"
AreRowDetailsFrozen="True">

<data:DataGrid x:Name="grid2" AutoGenerateColumns="True"
RowDetailsVisibilityMode="VisibleWhenSelected"
RowDetailsTemplate="{StaticResource DTDettaglio}"
AreRowDetailsFrozen="True">

a questo punto setto, nel codice, l'origine dati ai controlli:

grid1.ItemsSource = listaFamiglie;
grid2.ItemsSource = listaComponentiFamiglie;

mando in esecuzione e i dati vengono visualizzati.
Dopo aver spiegato il necessario il problema è questo:

-La tabella "listaFamiglie" non ha il campo "NOME", "COGNOME", ma solo il campo "NOTE".
-La tabella "listaComponentiFamiglie" ha i campi : "NOME", "COGNOME", "NOTE".

nel row detail del grid 1 viene valorizzato soltanto il campo note relativo alla tabella "listaFamiglie", i campi nome e cognome no, come faccio a fargli capire che lui deve andare a leggere quei campi nella tabella listaComponentiFamiglie, mantenendo la relazione Famiglia-
>componenteFamiglia?

nel grid2 viene valorizzato correttamente perchè trova la corrispondenza dei campi nelle proprietà esposte.

In sostanza il rowdetail del grid2 è quello giusto, ma io voglio inserirlo nel grid 1, così scegliendo la famiglia, nel row detail c'è la lista dei componenti di quella famiglia.

Grazie per la pazienza, attendo risposte e sono certo che potremmo risolvere e propagare la soluzione a questo "intoppo" a molti altri utenti, una volta risolto.

Saluti Francesco.

Un sistema deve essere sempre concepito in modo da resistere alla peggiore combinazione possibile di circostanze.
Ciao Francesco,
se non ho capito male, potresti creare una nuova "listaFamiglie" facendo una select distint (LINQ) sul cognome di listaComponentiFamiglie. http://www.linqitalia.com/script/26/Rendere-Univoci-Elementi-Lista-Clausola-Distinct-LINQ.aspx
..se non ho capito male

Alessio Leoncini (SilverlightItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer @ 5DLabs.it
21 messaggi dal 23 novembre 2006
Ti ringrazio anticipatamente per la tempestività della risposta.

Seguendo in linea http://dotnetside.org/blogs/articoli/pages/Silverlight-2.0-e-l_2700_accesso-ai-dati.aspx puoi capire perfettamente tutti i passaggi che ho fatto.
Le query in LINQ vengono fatte nel servizio e consumate dal client silverlight da code behind.
Es.
public List<Famiglie> RecuperaFamiglie()
{
LINQSQLFamiglieDataContext db = new LINQSQLFamiglieDataContext();
var query = (from i in db.Famiglie
select i);
return query.ToList();
}

questa query restituisce la lista di tutte le famiglie di tipo List<Famiglie> che si riferisce alla tabella Famiglie in SQL.

Chiaramente ho l'altra query per recuperare la lista dei componenti della famiglia ed è di tipo List<ComponentiFamiglie>.

nella rowdetails del Grid1(il grid1 contiene la lista di tutte le famiglie), voglio visualizzare i componenti della famiglia selezionata, tutto quì. Non ci riesco, perchè il datatemplate specificato nel resource non trova le proprietà "NOME,COGNOME" nel caso è associato al grid1.Non le trova perchè l'itemsource del grid1 è impostato sul risultato ottenuto dalla query RecuperaFamiglie() che è di tipo List<Famiglie>, quindi non espone le prprietà nome e cognome semplicemente perchè nella tabella Famiglie non esistono, ma esistono in quella di ComponentiFamiglie. Come faccio a specificare che il rowdetail, del grid1, deve andarsi a prendere i campi (nome,cognome,note) relativi alla famiglia selezionata?

Un sistema deve essere sempre concepito in modo da resistere alla peggiore combinazione possibile di circostanze.
francescogt wrote:
questa query restituisce la lista di tutte le famiglie di tipo List<Famiglie> che si riferisce alla tabella Famiglie in SQL.
Chiaramente ho l'altra query per recuperare la lista dei componenti della famiglia ed è di tipo List<ComponentiFamiglie>.
L'oggetto ComponentiFamiglie ha una proprietà FamigliaID (ad esempio) corrispondente alla proprietà ID dell'oggetto Famiglie? Cioè, nel database c'è una relazione tra le due tabelle?

Alessio Leoncini (SilverlightItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer @ 5DLabs.it
21 messaggi dal 23 novembre 2006
Le tabella sono formate in questo modo:

Tabella Famiglie:
ID
NomeNucleo
Note


tabella ComponentiFamiglie:
ID
IDFAMIGLIE
NOME
COGNOME
NOTE

le due tabelle sono relazionate Famiglie.ID --> ComponentiFamiglie.IDFAMIGLIE

Un sistema deve essere sempre concepito in modo da resistere alla peggiore combinazione possibile di circostanze.
Stavo pensando che in effetti RowDetails è nato per migliorare la visualizzazione dei dati attraverso la possibilità "aprire/chiudere" una sorta di riga aggiuntiva. Comunque sia è nato per gestire quelle informazioni che sono già incluse nella collezione in binding, quindi penso che ci siano due modi semplici:
1) crei un nuovo oggetto "Famiglie" con proprietà "Nome", "Cognome" e una collezione List<ComponentiFamiglie> e nel DataTemplate aggiungi un ulteriore DataGrid in binding con tale proprietà;
2) Passi ad una gestione manuale della visualizzazione dei dati, abbandoni DataGrid a fronte di un ListBox, gestisci in manuale l'evento di selezione nel quale,noto IDFAMIGLIE, vai a recuperare i dati di "ComponentiFamiglie" attraverso una "query" LINQ su "listaComponentiFamiglie" per visualizzare un altro elemento grafico separato dalla ListBox.

Potresti anche estendere DataGrid con una tua personale implementazione, ma il controllo non è banale e forse fai prima con una delle due soluzioni.

Alessio Leoncini (SilverlightItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer @ 5DLabs.it
21 messaggi dal 23 novembre 2006
1) crei un nuovo oggetto "Famiglie" con proprietà "Nome", "Cognome" e una collezione List<ComponentiFamiglie> e nel DataTemplate aggiungi un ulteriore DataGrid in binding con tale proprietà;

E' stato il mio primo pensiero, ma se ho una tabella con molte più proprietà, devo crearmele manualmente nella nuova lista "famiglie". Cmq ho già intrapreso questa direzione, e mi rispecchio nella tua soluzione. Però mi viene da dire che nel gridview/detailsview si possono impostare origini di dati diverse,come in questo caso, recuperare valori collegati tramite ID in tabelle differenti: Famiglie --> ComponentiFamiglie. Strano che non l'hanno implementato anche in silverlgiht, anche perchè queste operazioni di visualizzazione di dettagli differenti all'insieme principale sono pane quotidiano.

2) Passi ad una gestione manuale della visualizzazione dei dati, abbandoni DataGrid a fronte di un ListBox, gestisci in manuale l'evento di selezione nel quale,noto IDFAMIGLIE, vai a recuperare i dati di "ComponentiFamiglie" attraverso una "query" LINQ su "listaComponentiFamiglie" per visualizzare un altro elemento grafico separato dalla ListBox.

La visualizzazione intuitiva e graficamente migliore, di cui ho bisogno, la ottengo con l'utilizzo del datagrid combinato al rowdetails.

-Potresti anche estendere DataGrid con una tua personale implementazione, ma il controllo non è banale e forse fai prima con una delle due soluzioni.

Dato che dovrò standardizzare l'associazione di origini diverse, visto l'enormità del caso(quello spiegato è la punta dell'iceberg), probabilmente, anche se non completamente, verrà da sè.
Ti ringrazio per il tempo dedicato. Probabilmente mi risentirai per un altro consulto.

Saluti
Francesco Dicorcia
Modificato da francescogt il 22 giugno 2009 20.04 -

Un sistema deve essere sempre concepito in modo da resistere alla peggiore combinazione possibile di circostanze.
francescogt wrote:
1) crei un nuovo oggetto "Famiglie" con proprietà "Nome", "Cognome" e una collezione List<ComponentiFamiglie> e nel DataTemplate aggiungi un ulteriore DataGrid in binding con tale proprietà;

E' stato il mio primo pensiero, ma se ho una tabella con molte più proprietà, devo crearmele manualmente nella nuova lista "famiglie". Cmq ho già intrapreso questa direzione, e mi rispecchio nella tua soluzione. Però mi viene da dire che nel gridview/detailsview si possono impostare origini di dati diverse,come in questo caso, recuperare valori collegati tramite ID in tabelle differenti: Famiglie --> ComponentiFamiglie. Strano che non l'hanno implementato anche in silverlgiht, anche perchè queste operazioni di
visualizzazione di dettagli differenti all'insieme principale sono pane quotidiano.
In realità non dovresti pensare a RowDetails come la vista "details" di un Master/Details (un gioco di parole  ) ma come una semplice visualizzazione "ottimizzata" dei dati.

Sono d'accordo con te che scenari Master/Details sono all'ordine del giorno, infatti nella versione 3.0 del plugin, con il controlli DataForm, il Binding element-to-element e con .NET Ria Services, queste attività saranno molto più veloci da sviluppare.

Comunque, buon proseguimento

Alessio Leoncini (SilverlightItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer @ 5DLabs.it

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
    In primo piano

    I più letti di oggi

    Media
    In evidenza
    MISC