none
récupérer une image de Sql server dans un ListView RRS feed

  • Question

  • Bonjour, 
    Bonjour,je suis débutant en wpf et je suis sur un petit projet qui me pose énormément de problème.Le but est de d'enregistrer le nom(varchar) ,l'âge(int),l'image((varbinary) du fruit d'un arbre dans une base de données Sql Server Pour l'enregistrement j'ai réussi à le faire mais le problème se trouve au niveau dans la récupération des données dans un ListView. Mise à part les autres données seule l'image ne s'affiche pas dans la ListView. 

    Mon programme se présente ainsi :

    XAML

    <ListView x:Name="listDonne" HorizontalAlignment="Left" Height="246" Margin="20,371,0,0" VerticalAlignment="Top" Width="358" Cursor="Hand"> 
    <ListView.View> 
    <GridView> 
    
    <GridViewColumn Header="ID"> 
    <GridViewColumn.CellTemplate> 
    <DataTemplate> 
    <TextBlock Text="{Binding ID}" Margin="30,0,0,0" HorizontalAlignment="Stretch"/> 
    </DataTemplate> 
    </GridViewColumn.CellTemplate> 
    </GridViewColumn> 
    
    <GridViewColumn Header="NOM"> 
    <GridViewColumn.CellTemplate> 
    <DataTemplate> 
    <TextBlock Text="{Binding Nom}" Margin="30,0,0,0" HorizontalAlignment="Stretch"/> 
    </DataTemplate> 
    </GridViewColumn.CellTemplate> 
    </GridViewColumn> 
    ................ 
    
    <GridViewColumn Header="FRUIT"> 
    <GridViewColumn.CellTemplate> 
    <DataTemplate> 
    <Image Source="{Binding image}"/> 
    </DataTemplate> 
    </GridViewColumn.CellTemplate> 
    </GridViewColumn> 
    ................. 
    
    </GridView> 
    
    
    
    </ListView.View> 
    </ListView> 

    CLASS

    public class Arbre 
    { 
    public int ID { get; set; } 
    public string Nom { get; set; } 
    public int Age { get; set; } 
    public BitmapImage image { get; set; } 
    public string Desc { get; set; } 
    public string Comes { get; set; } 
    
    } 

    CODE BEHIND

    public partial class TestWindow1 : Window 
    { 
    OpenFileDialog fd = new OpenFileDialog(); 
    List<Arbre> arbre = new List<Arbre>(); 
    Convertisseur cnt = new Convertisseur(); 
    public TestWindow1() 
    { 
    InitializeComponent(); 
    LordData(); 
    } 
    
    //recuperation des données 
    void LordData() 
    { 
    
    try 
    { 
    using (SqlConnection cnx = new SqlConnection(Properties.Settings.Default.ChaineDeConnxion)) 
    { 
    cnx.Open(); 
    byte[] im = null; 
    ListViewItem list = new ListViewItem(); 
    using (SqlCommand cmd = new SqlCommand("select *from Arbres", cnx)) 
    { 
    SqlDataReader rd = cmd.ExecuteReader(); 
    
    while (rd.Read()) 
    { 
    
    arbre.Add(new Arbre() { ID = Convert.ToInt32(rd[0]), Nom = rd[1].ToString(), Age = Convert.ToInt32(rd[2]), image =new BitmapImage(new Uri( Convert.ToString(rd[3]))), Desc = rd[4].ToString(), Comes = rd[5].ToString() }); 
    
    } 
    
    //remplissage de ma ListView 
    listDonne.ItemsSource = arbre; 
    rd.Close(); 
    } 
    
    cnx.Close(); 
    } 
    } 
    catch (Exception ex) 
    { 
    
    MessageBox.Show(ex.Message); 
    } 
    
    } 
    


    mercredi 11 décembre 2013 14:20

Réponses

  • Bonjour,

    désolé pour le derangement pour actualiser la ListView il fallait exécuter la méthode  Refresh() des Items juste après la methode LordData() comme suis :

    ......................
    
                           cmd.Parameters.AddWithValue("@comes", textComest.Text);
                            cmd.ExecuteNonQuery();
    
                            
                        }
    
                        LordData();
                        listDonne.Items.Refresh();
                        MessageBox.Show("Arbre enregistré avec succès");
                      
                        cnx.Close();
                       
                    }
                }
                catch (Exception ex)
                {
    
                    MessageBox.Show(ex.Message);
                }
    
    ......................
    Merci pour votre temps accordé!


    forum ms89



    • Proposé comme réponse Claver amon vendredi 13 décembre 2013 14:28
    • Modifié Claver amon vendredi 13 décembre 2013 14:29
    • Marqué comme réponse Aurel Bera vendredi 13 décembre 2013 14:45
    vendredi 13 décembre 2013 14:27

Toutes les réponses

  • Bonjour,

    Avez-vous essayé dans un premier temps d'afficher une image par programmation dans un champ image hors d'une DataGrid ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    jeudi 12 décembre 2013 01:02
    Modérateur
  • Bonjour merci à vous.

    j'ai déjà afficher une image depuis une base de données dans un PictureBox  en Winform.j'ai essayer la même methode en wpf mais dans une ListView mais ça ne marche pas.


    forum ms89

    jeudi 12 décembre 2013 09:53
  • Bonjour merci à vous.

    j'ai déjà afficher une image depuis une base de données dans un PictureBox  en Winform.j'ai essayer la même methode en wpf mais dans une ListView mais ça ne marche pas.


    forum ms89

    jeudi 12 décembre 2013 09:58
  • Bonjour,

    j'ai réussi à afficher les images dans le ListView 

    voici le code source pour ceux voudraient bien s'inspirer

       //recuperation des données
            void LordData()
            {
    
                try
                {
                    using (SqlConnection cnx = new SqlConnection(Properties.Settings.Default.ChaineDeConnxion))
                    {
                        cnx.Open();
                        
                        
                        using (SqlCommand cmd = new SqlCommand("select *from Arbres", cnx))
                        {
                            SqlDataReader rd = cmd.ExecuteReader();
                            
                            while (rd.Read())
                            {
    
                                byte[] im = (byte[])(rd[3]);
                                var memoFichier = new MemoryStream(im);
                                var bitmapImg = new BitmapImage();
                                bitmapImg.BeginInit();
                                bitmapImg.StreamSource = memoFichier;
                                bitmapImg.EndInit();
                                arbre.Add(new Arbre() { ID = Convert.ToInt32(rd[0]), Nom = rd[1].ToString(), Age = Convert.ToInt32(rd[2]), image =bitmapImg, Desc = rd[4].ToString(), Comes = rd[5].ToString() });
                                
                            }
                            listDonne.ItemsSource = arbre;
                          
                            rd.Close();
                        }
    
                        cnx.Close();
                    }
                }
                catch (Exception ex)
                {
    
                    MessageBox.Show(ex.Message);
                }
                
            }
    

    Mais j'ai un autre problème 

    j'aimerai pouvoir réactualiser ma ListView juste après chaque nouvel enregistrement.

    pour cela s'execute ma fonction LordData() juste après la procedure d'insertion des données mais les items de la ListView restent les même que lors du demarrage.je ne comprend pas.

    une solution de votre part pourrait m'aider.Merci d'avance


    forum ms89

    jeudi 12 décembre 2013 12:11
  • Bonjour,

    Lorsque vous changez le contenu de la propriété "image" de votre classe Arbre, le moteur de DataBinding n'est pas au courant... Vous devez donc implémenter l'interface INotifyPropertyChanged et déclencher l'événement PropertyChanged pour signaler que la propriété a changé de valeur (je vous conseille de le faire pour toutes les autres propriétés) :

    public class Arbre : INotifyPropertyChanged
    {
        private BitmapImage _image;
    
        public BitmapImage image
        {
            get
            {
                return this._image;
            }
    
            set
            {
                if (this._image != value)
                {
                    this._image = value;
    
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("image"));
                    }
                }
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    } 

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    vendredi 13 décembre 2013 01:41
    Modérateur
  • Bonjour,j'ai essayé votre méthode mais l’apli cesse de fonctionner dès que j'appuis sur le ScrollBar de la ListView

    voici comment j'ai procedé

    Ma classe Arbre

     /// <summary>
        /// Classe de proprietés arbre
        /// </summary>
        public class Arbre : INotifyPropertyChanged
        {
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            private int _iD;
    
            public int ID
            {
                get { return _iD; }
    
                set
                {
                    if (this._iD!=value)
                    {
                        _iD = value;
    
                        if (this.PropertyChanged!=null)
                        {
                            this.PropertyChanged(this, new PropertyChangedEventArgs("ID"));
                        }
                    }
                   
                
                }
            }
    
    
            private string _nom;
    
            public string Nom
            {
                get { return _nom; }
                set 
                {
                    if (this._nom!=value)
                    {
                        _nom = value;
    
                        if (this.PropertyChanged!=null)
                        {
                            this.PropertyChanged(this, new PropertyChangedEventArgs("Nom"));
                        }
                    }
                   
                }
            }
    
    
            private int _age;
    
            public int Age
            {
                get { return _age; }
    
                set 
                {
                    if (this._age!=value)
                    {
                        _age = value;
    
                        if (this.PropertyChanged!=null)
                        {
                            this.PropertyChanged(this, new PropertyChangedEventArgs("Age"));
                        }
                    }
                   
                }
            }
    
            
    
            private BitmapImage _image;
    
            public BitmapImage image
            {
                get { return this._image; }
    
    
                set
                {
    
                    if (this._image != value)
                    {
                        this._image = value;
    
                        if (this.PropertyChanged != null)
                        {
                            this.PropertyChanged(this, new PropertyChangedEventArgs("image"));
                        }
                    }
    
                }
    
    
            }
    
    
            private string _desc;
    
            public string Desc
            {
                get { return _desc; }
    
                set
                {
                    if (this._desc!=value)
                    {
                        _desc = value;
    
                        if (this.PropertyChanged!=null)
                        {
                            this.PropertyChanged(this,new PropertyChangedEventArgs("Desc"));
                        }
                    }
                   
                }
            }
    
            private string _comes;
    
            public string Comes
            {
                get { return _comes; }
    
                set 
                {
                    if (this._comes != value)
                    {
                        _comes = value;
    
                        if (this.PropertyChanged!=null)
                        {
                            this.PropertyChanged(this, new PropertyChangedEventArgs("Comes"));
                        }
                    }
                }
            }
        }

    La methode LordData()

    //recuperation des données void LordData() { try { using (SqlConnection cnx = new SqlConnection(Properties.Settings.Default.ChaineDeConnxion)) { cnx.Open(); using (SqlCommand cmd = new SqlCommand("select *from Arbres", cnx)) { SqlDataReader rd = cmd.ExecuteReader(); while (rd.Read()) { byte[] im = (byte[])(rd[3]); var memoFichier = new MemoryStream(im); var bitmapImg = new BitmapImage(); bitmapImg.BeginInit(); bitmapImg.StreamSource = memoFichier; bitmapImg.EndInit(); arbre.Add(new Arbre() { ID = Convert.ToInt32(rd[0]), Nom = rd[1].ToString(), Age = Convert.ToInt32(rd[2]), image =bitmapImg, Desc = rd[4].ToString(), Comes = rd[5].ToString() }); }

    //ListDonne est le Name de ma ListView listDonne.ItemsSource = arbre; rd.Close(); } cnx.Close(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }

    Code d'insertion

      //sauvegarde des données
            private void btnAjout_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    using (SqlConnection cnx=new SqlConnection(Properties.Settings.Default.ChaineDeConnxion))
                    {
                        cnx.Open();
    
                        using (SqlCommand cmd = new SqlCommand("insert into Arbres(Nom,Age,Fruit,Descript,Comestible) values(@nom,@age,@image,@desc,@comes)", cnx))
                        {
                            byte[] img;
                            
                       
    
                            img = cnt.TableauDeByte(fd.FileName)      /*File.ReadAllBytes(fd.FileName)*/;
    
                            cmd.Parameters.AddWithValue("@nom", textNom.Text);
                            cmd.Parameters.AddWithValue("@age", int.Parse(textAge.Text));
                            cmd.Parameters.AddWithValue("@image", img);
                            cmd.Parameters.AddWithValue("@desc", textDesc.Text);
                            cmd.Parameters.AddWithValue("@comes", textComest.Text);
                            cmd.ExecuteNonQuery();
    
                            
                        }
                        LordData();
                        MessageBox.Show("Arbre enregistré avec succès");
                      
                        cnx.Close();
                       
                    }
                }
                catch (Exception ex)
                {
    
                    MessageBox.Show(ex.Message);
                }
             
            }



    forum ms89


    • Modifié Claver amon vendredi 13 décembre 2013 09:40
    vendredi 13 décembre 2013 09:38
  • Bonjour,

    désolé pour le derangement pour actualiser la ListView il fallait exécuter la méthode  Refresh() des Items juste après la methode LordData() comme suis :

    ......................
    
                           cmd.Parameters.AddWithValue("@comes", textComest.Text);
                            cmd.ExecuteNonQuery();
    
                            
                        }
    
                        LordData();
                        listDonne.Items.Refresh();
                        MessageBox.Show("Arbre enregistré avec succès");
                      
                        cnx.Close();
                       
                    }
                }
                catch (Exception ex)
                {
    
                    MessageBox.Show(ex.Message);
                }
    
    ......................
    Merci pour votre temps accordé!


    forum ms89



    • Proposé comme réponse Claver amon vendredi 13 décembre 2013 14:28
    • Modifié Claver amon vendredi 13 décembre 2013 14:29
    • Marqué comme réponse Aurel Bera vendredi 13 décembre 2013 14:45
    vendredi 13 décembre 2013 14:27