Databinding sur 2 combox en WPF

Databinding sur 2 combox en WPF - C#/.NET managed - Programmation

Marsh Posté le 22-09-2010 à 09:50:24    

Bonjour à tous !
 
J'ai un problème de databinding dans mon application WPF.
 
Pour résumer, mon application se connecte à une base de données Oracle dont les tables qui m'intéressent sont :
- LIAISON_INF (LIAISON, ...)
- CHAUSSEE_INF (LIAISON_INF__LIAISON, SENS, ...)
 
LIAISON est donc clé primaire de LIAISON_INF et devient clé étrangère dans CHAUSSEE_INF. Dans cette table, la clé primaire est (LIAISON_INF__LIAISON, SENS).
 
 
LIAISON représente des autoroutes (par exemple A1, A6...) et SENS, le sens sur lequel on travaille (de 1 à 4). Mais toutes les liaisons n'ont pas 4 sens, donc je voudrais récupérer les sens qui correspondent à la liaison choisie.
 

Code :
  1. DataSet dt = Database.ExecSelect("select DISTINCT LIAISON from LIAISON_INF", "LIAISON_INF" );
  2. dt = Database.AddToDataset("select LIAISON_INF__LIAISON, SENS from CHAUSSEE_INF", "CHAUSSEE_INF", dt);
  3.                
  4. DataColumn colLiaison = dt.Tables["LIAISON_INF"].Columns["LIAISON"];
  5. DataColumn colChaussee = dt.Tables["CHAUSSEE_INF"].Columns["LIAISON_INF__LIAISON"];
  6. DataRelation relation = new DataRelation("LiaisonToChaussee", colLiaison, colChaussee);
  7. dt.Relations.Add(relation);
  8. lstLiaison.DataContext = dt.Tables["LIAISON_INF"].DefaultView;
  9.      
  10. //  FONTIONNE MAIS RENVOIE TOUTES LES VALEURS DE 'SENS'
  11. lstSens2.DataContext = dt.Tables["CHAUSSEE_INF"].DefaultView;


 
 
Je remplis mon DataSet, j'affiche tous les noms des liaisons dans ma combobox (lstLiaison) , jusque là pas de problème.
Pour afficher la liste des sens correspondants par contre ça coince... J'ai trouvé un début de solution expliquant qu'il faut utiliser une DataRelation, mais l'exemple était en Windows Form et ça n'a pas l'air de fonctionner exactement de la même façon en WPF...
 
Et faudrait pas que j'oublie mon XAML quand même...
 

Code :
  1. <ComboBox Height="23" HorizontalAlignment="Left" Margin="648,12,0,0" Name="lstLiaison" VerticalAlignment="Top" Width="120" 
  2.       ItemsSource="{Binding}"
  3.       DisplayMemberPath="LIAISON"
  4.       IsSynchronizedWithCurrentItem="True" />
  5. <ComboBox Height="23" HorizontalAlignment="Left" Margin="392,30,0,0" Name="lstSens2" VerticalAlignment="Top" Width="120"
  6.       ItemsSource="{Binding}"
  7.       DisplayMemberPath="SENS"
  8.       IsSynchronizedWithCurrentItem="True" />


 
Vous allez me dire "tu crées une relation mais tu ne l'utilises pas...", mais j'ai essayé de l'utiliser sans résultat convaincant...

Reply

Marsh Posté le 22-09-2010 à 09:50:24   

Reply

Marsh Posté le 22-09-2010 à 14:58:50    

J'ai fini par trouver une solution :)
 

Code :
  1. <ComboBox Height="23" Margin="0,12,210,0" Name="lstLiaison" VerticalAlignment="Top"
  2.                   ItemsSource="{Binding}"
  3.                   DisplayMemberPath="LIAISON"
  4.                   IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Left" Width="120" />
  5.        
  6.         <ComboBox Height="23" Margin="0,41,210,0" Name="lstSens" VerticalAlignment="Top"
  7.                   ItemsSource="{Binding LiaisonToChaussee}"
  8.                   DisplayMemberPath="SENS"
  9.                   IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Left" Width="120" />


 

Code :
  1. DataSet dt = Database.ExecSelect("select DISTINCT LIAISON from LIAISON_INF", "LIAISON_INF" );
  2.                 dt = Database.AddToDataset("select LIAISON_INF__LIAISON, SENS from CHAUSSEE_INF", "CHAUSSEE_INF", dt);
  3.                
  4.                 DataColumn colLiaison = dt.Tables["LIAISON_INF"].Columns["LIAISON"];
  5.                 DataColumn colChaussee = dt.Tables["CHAUSSEE_INF"].Columns["LIAISON_INF__LIAISON"];
  6.                 DataRelation relation = new DataRelation("LiaisonToChaussee", colLiaison, colChaussee);
  7.                 dt.Relations.Add(relation);
  8.                 DataContext = dt.Tables["LIAISON_INF"];

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed