Recuperer la valeur d'une cellule de Datagrid et la mettre dans un comboBox [Résolu]

Signaler
Messages postés
62
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
27 avril 2021
-
Messages postés
62
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
27 avril 2021
-
Bonjour j'ai une question je veux être capable de recuperer la valeur de la colonne Id de ma datagrid pour la mettre dans un combobox j'ai essayé de faire un biding et ça n'a pas marché y a t-il une façon de le faire voila une partie de mon code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using BLL;


namespace UIL
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        int recup;
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this; 
            Film.ChargerListeEtudiant();
            dgFilm.ItemsSource = Film.films;
            cbolds.ItemsSource = Film.Lid;
        }

        private void LigneDG_dblClick(object sender, MouseButtonEventArgs e)
        {

        }

        private void Loaded_Cbolds(object sender, RoutedEventArgs e)
        {
            
        }
    }
}






<Window x:Class="UIL.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:labTiers"
        mc:Ignorable="d"
        Title="MainWindow" Height="780" Width="875">
    <Grid Height="559" VerticalAlignment="Top">
        <DataGrid HorizontalAlignment="Left" Height="149" Margin="45,21,0,0" VerticalAlignment="Top" Width="428"
                  Name="dgFilm" 
                  AutoGenerateColumns="False" RowBackground="Khaki" 
                  AlternatingRowBackground="Lavender" MouseDoubleClick="LigneDG_dblClick"
                                                                                  >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Id" Width="2*" Binding="{Binding Id}"/>
                <DataGridTextColumn Header="Titre" Width="12*" Binding="{Binding Titre}"/>
               
                <DataGridTextColumn Header="Année" Width="2*" Binding="{Binding Annee}"/>
                <DataGridTextColumn Header="Pays" Width="2*" Binding="{Binding Pays}"/>
            </DataGrid.Columns>


        </DataGrid>

        <Label Content="Label" HorizontalAlignment="Left" Height="24" Margin="145,0,0,0" VerticalAlignment="Center" Width="73"/>
        <ComboBox HorizontalAlignment="Left" Margin="460,196,0,337" Width="179" x:Name="cbolds" ItemsSource="{Binding LesIds}" DisplayMemberPath="Id" Loaded="Loaded_Cbolds"/>
        <Label Content="Titre:" HorizontalAlignment="Left" Height="28" Margin="21,258,0,0" VerticalAlignment="Top" Width="48"/>
        <TextBox HorizontalAlignment="Left" Height="28" Margin="69,258,0,0" Text="TextBox" TextWrapping="Wrap" VerticalAlignment="Top" Width="185"/>
        <Label Content="Pays" HorizontalAlignment="Left" Height="24" Margin="311,259,0,0" VerticalAlignment="Top" Width="72"/>
        <TextBox HorizontalAlignment="Left" Height="26" Margin="400,260,0,0" Text="TextBox" TextWrapping="Wrap" VerticalAlignment="Top" Width="96"/>
        <Label Content="Année" HorizontalAlignment="Left" Height="26" Margin="550,259,0,0" VerticalAlignment="Top" Width="58"/>
        <TextBox HorizontalAlignment="Left" Height="24" Margin="630,260,0,0" Text="TextBox" TextWrapping="Wrap" VerticalAlignment="Top" Width="128"/>
        <Label Content="Veuillez sélectionner un pays:" HorizontalAlignment="Left" Height="28" Margin="32,316,0,0" VerticalAlignment="Top" Width="164"/>
        <ComboBox HorizontalAlignment="Left" Height="28" Margin="216,321,0,0" VerticalAlignment="Top" Width="138"/>
        <Label Content="Veuillez sélectionner une année:" HorizontalAlignment="Left" Margin="471,318,0,0" VerticalAlignment="Top"/>
        <ComboBox HorizontalAlignment="Left" Height="24" Margin="666,318,0,0" VerticalAlignment="Top" Width="73"/>
        <Label Content="Id" HorizontalAlignment="Left" Margin="32,390,0,0" VerticalAlignment="Top"/>
        <Label Content="Titre" HorizontalAlignment="Left" Margin="124,390,0,0" VerticalAlignment="Top"/>
        <Label Content="Année" HorizontalAlignment="Left" Margin="216,390,0,0" VerticalAlignment="Top"/>
        <ListBox HorizontalAlignment="Left" Height="74" Margin="29,439,0,0" VerticalAlignment="Top" Width="227"/>
        <ListBox HorizontalAlignment="Left" Height="74" Margin="471,439,0,0" VerticalAlignment="Top" Width="287"/>
        <Label Content="Id" HorizontalAlignment="Left" Margin="471,390,0,0" VerticalAlignment="Top"/>
        <Label Content="Titre" HorizontalAlignment="Left" Margin="583,390,0,0" VerticalAlignment="Top"/>
        <Label Content="Pays" HorizontalAlignment="Left" Margin="720,390,0,0" VerticalAlignment="Top"/>
        <Label Content="Veuillez selectionner l'identifiant:" HorizontalAlignment="Left" Margin="235,196,0,0" VerticalAlignment="Top" Width="184"/>

    </Grid>
</Window>


5 réponses

Messages postés
15880
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 avril 2021
698
Bonjour

la programmation c'est d'abord une logique, et qui dit logique dit cohérence.
Et là tu voies, ça manque de cohérence.

Ça commence par l'appel à
Film.ChargerListeEtudiant();
qui manifestement sert à charger une liste de films. Bon ça ne va rien changer à ton problème, mais si dès le départ les méthodes ne font pas ce que leur nom dit, on commence déjà à s'embrouiller.

Là où le manque que cohérence fait que ça merdouille c'est ce qui suit:

Cette ligne
DataContext = this;
veut dire que le xaml va chercher les sources de son binding dans ce code behind, or
  • y'a rien à binder dans ce code behind (on binde sur des propriétés et y'en a pas)
  • 2 lignes plus loin, tu fusilles tout en affectant les itemssources des 2 controles.


Et aussi, cette ligne
<ComboBox HorizontalAlignment="Left" Margin="460,196,0,337" Width="179" x:Name="cbolds" ItemsSource="{Binding LesIds}" DisplayMemberPath="Id" Loaded="Loaded_Cbolds"/>
dit que ce combobox doit aller chercher ses items dans la collection de
this
qui s'appelle LesIds
Et cette ligne
cbolds.ItemsSource = Film.Lid;
dit que ce même comboxbox doit aller chercher ses items dans une collection de Film qui s'appelle Lid


Comme tu n'as pas montré le code de Film, je fais des plans sur la comète.

Une option est de dire que le datacontext, c'est Film.

        public MainWindow()
        {
            InitializeComponent();
            Film.ChargerListeEtudiant();
            DataContext = Film;
        }


        <DataGrid HorizontalAlignment="Left" Height="149" Margin="45,21,0,0" VerticalAlignment="Top" Width="428"
                  Name="dgFilm" 
                  AutoGenerateColumns="False" RowBackground="Khaki" 
                  AlternatingRowBackground="Lavender" MouseDoubleClick="LigneDG_dblClick"
                  ItemsSource="{Binding films}"
                                                                                  >


et
<ComboBox HorizontalAlignment="Left" Margin="460,196,0,337" Width="179" x:Name="cbolds" ItemsSource="{Binding films}" DisplayMemberPath="Id" Loaded="Loaded_Cbolds"/>


Et pas besoin de Lid.
Messages postés
62
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
27 avril 2021

Voici le code de film

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MySql.Data.MySqlClient;
using System.ComponentModel;
using System.Collections.ObjectModel;
using DAL;


namespace BLL
{
   public class Film: INotifyPropertyChanged
    {
        public static ObservableCollection<Film> films = new ObservableCollection<Film>();
        public static ObservableCollection<Film> Lid = new ObservableCollection<Film>();

        public static void ChargerListeEtudiant()
        {
            //Appel de la fonction dans AccessDB pour la connection à la DB
            var listeFilms = new ObservableCollection<Film>();
            DataTable dt = AccessDB.ConnecterBD();

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                var etu = new Film
                {
                    Id = Int32.Parse(dt.Rows[i]["ID"].ToString()),
                    Titre = dt.Rows[i]["Titre"].ToString(),
                    Annee = Int32.Parse(dt.Rows[i]["Annee"].ToString()),
                    Pays = dt.Rows[i]["Pays"] as Pays,
                    
                };

                listeFilms.Add(etu);
            }

            films = listeFilms;
        }
        private List<int> lesIds;
        public List<int> LesIds
        {
            get
            {
                return lesIds;
            }

            set
            {
                if (this.lesIds != value)
                {
                    this.lesIds = value;
                    this.NotifyPropertyChanged("LesIds");
                }
            }
        }



        public static void ChargerId()
        {
            //Appel de la fonction dans AccessDB pour la connection à la DB
            var listeId = new ObservableCollection<Film>();
            DataTable dt = AccessDB.ConnecterBD();

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                var etu = new Film
                {
                    Id = Int32.Parse(dt.Rows[i]["ID"].ToString()),
                   

                };

                listeId.Add(etu);
            }

           Lid = listeId;
        }


        public void NotifyPropertyChanged(string propName)
        {
            if (this.PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
            }
        }
        private int id;

        public int Id
        {
            get
            {
                return id;
            }

            set
            {
                if (this.id != value)
                {
                    this.id = value;
                    this.NotifyPropertyChanged("Id");
                }
            }
        }

        private string titre;
        public string Titre
        {
            get
            {
                return titre;
            }

            set
            {
                if (this.titre != value)
                {
                    this.titre = value;
                    this.NotifyPropertyChanged("Titre");
                }
            }
        }
        private int annee;

        public int Annee
        {
            get
            {
                return annee;
            }

            set
            {
                if (this.annee != value)
                {
                    this.annee = value;
                    this.NotifyPropertyChanged("Annee");
                }
            }
        }
        private Pays pays;
        

        public Pays Pays
        {
            get
            {
                return pays;
            }

            set
            {
                if (this.pays != value)
                {
                    this.pays = value;
                    this.NotifyPropertyChanged("Pays");
                }
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;
    }
}



Messages postés
62
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
27 avril 2021

Parce que en fait j'ai fait un premier binding pour tous les champs de ma datagrid et là je veux faire juste pour l'id et mettre cela dans le combobox
Messages postés
15880
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 avril 2021
698
oui et as tu essayé ce que je t'ai proposé?
Messages postés
62
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
27 avril 2021

Quand je fais j'ai une erreur qui dit Film est un type qui n'est pas valide dans le contexte donné
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using BLL;


namespace UIL
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        
        public MainWindow()
        {
            InitializeComponent();
           
          
            Film.ChargerListeEtudiant();
            DataContext = Film;
            // dgFilm.ItemsSource = Film.films;

        }

        private void LigneDG_dblClick(object sender, MouseButtonEventArgs e)
        {
            txt_Titre.Text = (dgFilm.SelectedItem as Film).Id.ToString();

        }

        private void Loaded_Cbolds(object sender, RoutedEventArgs e)
        {
            
        }
    }
}


Messages postés
15880
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 avril 2021
698
Ha oui, ce sont des collections statique, mais film ne l'est pas.

Alors comme ça
        public MainWindow()
        {
            InitializeComponent();
           
          
            Film.ChargerListeEtudiant();
            DataContext = this;

        }

       public films {get {return Film.fimls;}}




Messages postés
62
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
27 avril 2021

cette ligne de code est à mettre dans le mainwindow ou dans la classe film
Messages postés
15880
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 avril 2021
698
Tout ce bout de code va dans la fenêtre
Messages postés
62
Date d'inscription
vendredi 19 mars 2021
Statut
Membre
Dernière intervention
27 avril 2021

d'accord merci