Partage
  • Partager sur Facebook
  • Partager sur Twitter

Bind une list dans <DataGridComboBoxColumn> WPF

    1 juin 2021 à 11:40:34

    Bonjour à tous :D,

    J'aurais besoin d'un petit coup de main sur un soucis en c# que je n'arrive pas à résoudre... :colere:

    En gros mon objectif et d'afficher une combobox dans chaque ligne d'une datagrid, donc jusque là sa fonctionne. Par contre, impossible d'y afficher les valeurs. J'ai un peu chercher sur le net, mais j'ai pas réussi à vraiment comprendre le sens de cette erreur, c'est qu'il ne trouve pas la propriété 'Libelle_unite' dans mon instance de 'Produit' ? 


    En gros, j'ai cette erreur : System.Windows.Data Error: 40 : BindingExpression path error: 'UnitesList' property not found on 'object' ''Produit' (HashCode=46341445)'. BindingExpression:Path=UnitesList; DataItem='Produit' (HashCode=46341445); target element is 'ComboBox' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')

    Mon code xaml donne ceci :
    <DataGridComboBoxColumn DisplayMemberPath="Libelle_unite">
        <DataGridComboBoxColumn.EditingElementStyle>
            <Style TargetType="ComboBox">
                             <Setter Property="ItemsSource" Value="{Binding UnitesList}" />
            </Style>
                        
        </DataGridComboBoxColumn.EditingElementStyle>
    </DataGridComboBoxColumn>
    Quand au code en c# :
    public partial class MainWindow : Window
        {
            private List<Unite> _unitesList = Unites.GetUnites();
    
            public List<Unite> UnitesList
            {
                get
                {
                    return _unitesList;
                }
                set
                {
                    _unitesList = value;
                }
            }
    
            public MainWindow()
            {
                this.WindowState = System.Windows.WindowState.Maximized;
                InitializeComponent();
                DataContext = this;
            }
    }

     Le code source de ma classe produit :

        public class Produit : CRUD{
    
            public string MyProperty { get; set; }
    
    
            public int Id_produit { set; get; }
            public string Nom { set; get; }
            public string Reference { set; get; }
            public string Marque { set; get; }
            public double Quantite { set; get; }
            public double Seuil_alerte { set; get; }
            public string Unite { set; get; }
    
            public void Create()
            {
                sqlRequest = "INSERT INTO Produit (nom, reference, marque, quantite, seuil_alerte, unite) VALUES ('"  + this.Nom + "', '" + this.Reference + "', '" + this.Marque + "' , '" + this.Quantite + "' , '" +this.Seuil_alerte + "' , '" +this.Unite + "')";
    
                this.Do();
            }
            public void Update()
            {
    
                SqlConnection connection = new SqlConnection(conexionString);
                int unite = 0;
    
                try
                {
                    connection.Open();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return;
                }
    
                SqlCommand command = connection.CreateCommand();
                command.CommandText = "SELECT id_unite FROM Unite WHERE libelle_unite = '" + this.Unite + "'";
                SqlDataReader dataReader = command.ExecuteReader();
    
    
                while (dataReader.Read())
                {
                    unite = (int)dataReader["id_unite"];
                }
    
                connection.Close();
    
                sqlRequest = "UPDATE Produit " +
                    "SET nom = '" + this.Nom + "',  reference = '" + this.Reference + "', marque = '" + this.Marque + "', " +
                    "quantite = '" + this.Quantite + "', seuil_alerte = '" + this.Seuil_alerte + "', unite = '" + unite + "' " +
                    "WHERE id_produit = " + this.Id_produit;
    
                this.Do();
            }
            public void Delete()
            {
                sqlRequest = "DELETE FROM Produit WHERE id_produit = " + this.Id_produit;
                this.Do();
            }
    
        }
    Merci d'avance à tout ceux qui pourront me proposer des solutions :D

    -
    Edité par RehArk 1 juin 2021 à 11:52:16

    • Partager sur Facebook
    • Partager sur Twitter

    Créer une procédure qui s'appelle elle même, procédurception !

      1 juin 2021 à 11:50:03

      Code source de la classe "Produit", SVP.
      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        1 juin 2021 à 11:53:15

        voila ^^ j'avais pas pensé à tout mettre :o:-°

        Edit :

        Je viens de voir un truc qui n'est pas normal, normalement ma combobox n'est pas sensé avoir besoin de produit... est ce que c'est parce que ma datagrid utilise des "Produit"s comme 'itemsSource', comme ceci ? :

        List<Produit> produitsList = Produits.GetProduits(ComboBoxCategories.SelectedItem as string);
        ProduitGrid.ItemsSource = produitsList;

         Re édit : 

        Du coup, j'ai compris mon erreur, c'est que en gros il recherche ma liste d'"unité de mesure" dans mon produit... Mais c'est pas ce que je veux, je veux qu'il me prennent une nouvelle List, donc ma liste d'unité, et qu'il me construise une combo box avec ça... J'ai un peu cherché un système qui me permettrai de récupérer ma MainWindow.UniteList, mais j'ai pas les bon thermes je pense car je n'ai rien trouvé qui fonction avec les templates x(.

        -
        Edité par RehArk 1 juin 2021 à 13:40:37

        • Partager sur Facebook
        • Partager sur Twitter

        Créer une procédure qui s'appelle elle même, procédurception !

          1 juin 2021 à 13:33:56

          On va passer sur la couche Data (CRUD) complètement bancale et obsolète (pourquoi ces DataReader vieux du siècle dernier ?, pourquoi pas un ORM ou tout du moins des DataAdapter ?).

          >normalement ma combobox n'est pas sensé avoir besoin de produit

          Peut-être, mais c'est bien ce que vous lui envoyez dans les dents en ligne 2 de votre dernier code.

          -
          Edité par bacelar 1 juin 2021 à 14:09:25

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            1 juin 2021 à 13:51:15

            ">normalement ma combobox n'est pas sensé avoir besoin de produit

            Peut-être, mais c'est bien ce que vous lui envoyez dans les dans en ligne 2 de votre dernier code."


            Comment je peut faire du coup pour lui dire de prendre mon "UniteList" qui est dans ma Class MainWindows ? Ca à un nom particulier ?
            • Partager sur Facebook
            • Partager sur Twitter

            Créer une procédure qui s'appelle elle même, procédurception !

              1 juin 2021 à 14:11:45

              Je ne connais pas assez WPF pour être plus directif.

              En espérant qu'un "spécialiste" WPF passe par là. :-°

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                2 juin 2021 à 14:03:21

                J'ai partiellement réussi, mais j'ai un dernier petit problème x( En gros ma combobox ne s'affiche pas tant que je ne clique pas dessus x( Quelqu'un à une idée de pourquoi ? La fonction loaded semble se réexécuter à chaque fois que je clique sur ma combobox, c'est normal ?

                Mon XAML donne ceci :

                <DataGridTemplateColumn Header = "unité">
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <ComboBox Loaded="Unite_Loaded" DisplayMemberPath="Libelle_unite"></ComboBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>

                Et ma fonction appeler au chargement : 

                private void Unite_Loaded(object sender, RoutedEventArgs e)
                
                    var cb = sender as ComboBox;
                    cb.ItemsSource = UnitesList;
                
                }


                Merci pour votre aide

                • Partager sur Facebook
                • Partager sur Twitter

                Créer une procédure qui s'appelle elle même, procédurception !

                Bind une list dans <DataGridComboBoxColumn> WPF

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown