Mar.22

TP 7 : Les boutons de navigation et les ComboBoxs.

Objectif

L’objectif de ce TP est de s’habituer à utiliser les opérations de la mise à jour sur une table, et aussi l’utilisation des Combobox et les Menus.

Questions

Partie serveur :

  1. Créer la base TP7.
  2. Dans la base TP7, crée les tables : academie, delegation, lycee.

Partie client :

  1. Créer un menu qui facilite l’utilisation de l’application.
  2. Créer l’interface suivante :
  3. Écrire les code des boutons Ajouter, Modifier, Supprimer et Vider.
  4. Écrire les code des boutons de navigation des boutons Suivant, Précédent, Premier et Dernier.
  5. Créer l’interface suivante :
  6. L’académie de la délégation est choisie dans une liste déroulante.
  7. Écrire les code des boutons Ajouter, Modifier, Supprimer et Vider.
  8. Écrire les code des boutons de navigation des boutons Suivant, Précédent, Premier et Dernier.
  9. Créer l’interface suivante :
  10. L’académie et la délégation du lycée sont choisies dans des listes déroulantes.
  11. Écrire les code des boutons Ajouter, Modifier, Supprimer et Vider.
  12. Créer l’interface suivante :
  13. Le lycée du professeur est choisi dans une liste déroulante ; de même l’état civil est choisi dans une liste préremplie avec les valeurs : célibataire, marié, divorcé et veuf.
  14. Si la valeur célibataire est sélectionnée, la zone de texte pour la saisie du nombre d’enfants doit être désactivée.
  15. Écrire les code des boutons Ajouter, Modifier, Supprimer et Vider.
  16. Écrire les code des boutons de navigation des boutons Suivant, Précédent, Premier et Dernier.

Correction

La classe academie :

namespace TP7_Gestion_Etablissement
{
    public partial class Academie : Form
    {
        SqlConnection conn = new SqlConnection("server = DESKTOP-EIALG0J\\SQLEXPRESS; database = education; integrated security = SSPI");
        SqlDataReader dr;
        SqlCommand cmd;
        BindingSource source = new BindingSource();
        public Academie()
        {
            InitializeComponent();
        }

        private void Vider_Click(object sender, EventArgs e)
        {
            idC.Text = "";
            nomC.Text = "";

        }

        private void Supprmier_Click(object sender, EventArgs e)
        {
            int id = int.Parse(idC.Text);

            try
            {
                cmd = new SqlCommand("delete from academie where ldAcademie =" + id + "", conn);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
                listeAcademies();
                MessageBox.Show("La suppression a été effectuée avec succè");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void Ajouter_Click(object sender, EventArgs e)
        {
            int id = int.Parse(idC.Text);
            String nomAcad = nomC.Text;

            try
            {
                SqlCommand cmd = new SqlCommand("INSERT INTO academie VALUES(" + id + " , '" + nomAcad + "')", conn);
                conn.Open();
                cmd.ExecuteNonQuery(); // Exécution de la requête SQL   
                MessageBox.Show("L'insertion a été effectuée avec succè");
                conn.Close();

                listeAcademies();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }
        }
        private void listeAcademies()
        {

            try
            {
                cmd = new SqlCommand("select ldAcademie as 'Id Academie'  , nomAcademie as 'Nom Academie' from academie", conn);
                conn.Open();
                dr = cmd.ExecuteReader();
                source.DataSource = dr;
                dv.DataSource = source;
                dr.Close();

                conn.Close();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }

        }

        private void Modifier_Click(object sender, EventArgs e)
        {
            int id = int.Parse(idC.Text);
            String nomAcad = nomC.Text;

            try
            {
                SqlCommand cmd = new SqlCommand("update academie set nomAcademie = '" + nomAcad + "' where ldAcademie =" + id + "", conn);
                conn.Open();
                cmd.ExecuteNonQuery(); // Exécution de la requête SQL   
                MessageBox.Show("La modification a été effectuée avec succè");
                conn.Close();
                listeAcademies();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }
        }
        private void navigation()
        {

            try
            {
                cmd = new SqlCommand("select ldAcademie as 'Id Academie'  , nomAcademie as 'Nom Academie' from academie", conn);
                conn.Open();
                dr = cmd.ExecuteReader();
                source.DataSource = dr;
                idC.DataBindings.Add(new Binding("text", source, "Id Academie"));
                nomC.DataBindings.Add(new Binding("text", source, "Nom Academie"));

                indexLabel.Text = (source.Position + 1).ToString();
                totalLabel.Text = source.Count.ToString();
                dv.DataSource = source;
                dr.Close();

                conn.Close();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }
        }

        private void Academie_Load(object sender, EventArgs e)
        {
            navigation();
            idC.Text = "";
            nomC.Text = "";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            source.MoveFirst();
            indexLabel.Text = (source.Position + 1).ToString();
            totalLabel.Text = source.Count.ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            source.MovePrevious();
            indexLabel.Text = (source.Position + 1).ToString();
            totalLabel.Text = source.Count.ToString();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            source.MoveNext();
            indexLabel.Text = (source.Position + 1).ToString();
            totalLabel.Text = source.Count.ToString();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            source.MoveLast();
            indexLabel.Text = (source.Position + 1).ToString();
            totalLabel.Text = source.Count.ToString();
        }
    }
}

La classe delegation :

 
namespace TP7_Gestion_Etablissement
{
    public partial class Delegation : Form
    {
        SqlConnection conn = new SqlConnection("server = DESKTOP-EIALG0J\\SQLEXPRESS; database = education; integrated security = SSPI");
        SqlDataReader dr;
        SqlCommand cmd;
        BindingSource source = new BindingSource();
        public Delegation()
        {
            InitializeComponent();
        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void nomC_TextChanged(object sender, EventArgs e)
        {

        }
        private void nomAcademies()
        {
           
            try
            {
                cmd = new SqlCommand("select nomAcademie from academie ", conn);
                conn.Open();
                dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        listeAcad.Items.Add(dr["nomAcademie"]);
                    }
                }
                listeAcad.SelectedIndex = 0;
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            
        }

        private void Delegation_Load(object sender, EventArgs e)
        {
            nomAcademies();
            navigation();
        }

        private void Vider_Click(object sender, EventArgs e)
        {
            idC.Text = "";
            nomC.Text = "";
            listeAcad.SelectedIndex = 0;
        }
        private int getIdAcademie(String nomAcad)
        {

            cmd = new SqlCommand("select ldAcademie from academie where nomAcademie = '" + nomAcad + "'", conn);
            conn.Open();
            int i = (int)cmd.ExecuteScalar();
            conn.Close();
            return i;
        }

        private void Ajouter_Click(object sender, EventArgs e)
        {
            int id = int.Parse(idC.Text);
            String nomDele = nomC.Text;
            String nomAcademie = listeAcad.Text;
            int idAcad = getIdAcademie(nomAcademie);
            try
            {
                SqlCommand cmd = new SqlCommand("INSERT INTO delegation VALUES(" + id + " , '" + nomDele + "','" + idAcad + "')", conn);
                conn.Open();
                cmd.ExecuteNonQuery(); // Exécution de la requête SQL   
                MessageBox.Show("L'insertion a été effectuée avec succè");
                conn.Close();
                listeDelegations();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }
        }
        private void listeDelegations()
        {

            try
            {
                cmd = new SqlCommand("select ldDelegation as 'Id Delegation'  , nomDelegation as 'Nom Delegation', nomAcademie as 'Nom Academie' from delegation, academie where academie.ldAcademie=delegation.ldAcademie ", conn);
                conn.Open();
                dr = cmd.ExecuteReader();
                source.DataSource = dr;
                dv.DataSource = source;
                dr.Close();
                conn.Close();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }

        }

        private void Modifier_Click(object sender, EventArgs e)
        {
            int id = int.Parse(idC.Text);
            String nomDele = nomC.Text;
            String nomAcademie = listeAcad.Text;
            int idAcad = getIdAcademie(nomAcademie);
            try
            {
                SqlCommand cmd = new SqlCommand("update delegation set nomDelegation = '" + nomDele + "', ldAcademie='" + idAcad + "'  where ldDelegation =" + id + "", conn);
                conn.Open();
                cmd.ExecuteNonQuery(); // Exécution de la requête SQL   
                MessageBox.Show("La modification a été effectuée avec succè");
                conn.Close();
                listeDelegations();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }
        }

        private void Supprmier_Click(object sender, EventArgs e)
        {
            int id = int.Parse(idC.Text);

            try
            {
                cmd = new SqlCommand("delete from delegation where ldDelegation =" + id + "", conn);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
                listeDelegations();
                MessageBox.Show("La suppression a été effectuée avec succè");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void navigation()
        {

            try
            {
                cmd = new SqlCommand("select ldDelegation as 'Id Delegation'  , nomDelegation as 'Nom Delegation', nomAcademie as 'Nom Academie' from delegation, academie where academie.ldAcademie=delegation.ldAcademie ", conn);
                conn.Open();
                dr = cmd.ExecuteReader();
                source.DataSource = dr;
                idC.DataBindings.Add(new Binding("text", source, "Id Delegation"));
                nomC.DataBindings.Add(new Binding("text", source, "Nom Delegation"));

                listeAcad.DataBindings.Add(new Binding("SelectedItem", source, "Nom Academie"));
                
                indexLabel.Text = (source.Position + 1).ToString();
                totalLabel.Text = source.Count.ToString();
                dv.DataSource = source;
                dr.Close();

                conn.Close();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            source.MoveFirst();
            indexLabel.Text = (source.Position + 1).ToString();
            totalLabel.Text = source.Count.ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            source.MovePrevious();
            indexLabel.Text = (source.Position + 1).ToString();
            totalLabel.Text = source.Count.ToString();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            source.MoveNext();
            indexLabel.Text = (source.Position + 1).ToString();
            totalLabel.Text = source.Count.ToString();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            source.MoveLast();
            indexLabel.Text = (source.Position + 1).ToString();
            totalLabel.Text = source.Count.ToString();
        }

        private void listeAcad_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

    }

}

La classe lycee :

 
namespace TP7_Gestion_Etablissement
{
    public partial class Lycee : Form
    {
        SqlConnection conn = new SqlConnection("server = DESKTOP-EIALG0J\\SQLEXPRESS; database = education; integrated security = SSPI");
        SqlDataReader dr;
        SqlCommand cmd;
        BindingSource source = new BindingSource();
        public Lycee()
        {
            InitializeComponent();
        }
        private void nomAcademies()
        {

            try
            {
                cmd = new SqlCommand("select nomAcademie from academie ", conn);
                conn.Open();
                dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        listeAcad.Items.Add(dr["nomAcademie"]);
                    }
                }
                listeAcad.SelectedIndex = -1;
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
        private void button1_Click(object sender, EventArgs e)
        {
            int id = int.Parse(idB.Text);
            String nomLycee = nomB.Text;
            String villeLycee = villeB.Text;
            String nomDelegation = listeDele.Text;
            int idDele = getIdDelegation(nomDelegation);
            try
            {
                SqlCommand cmd = new SqlCommand("INSERT INTO lycee VALUES(" + id + " , '" + nomLycee + "','" + villeLycee + "','" + idDele + "')", conn);
                conn.Open();
                cmd.ExecuteNonQuery(); // Exécution de la requête SQL   
                MessageBox.Show("L'insertion a été effectuée avec succè");
                conn.Close();
                
                listeLycees();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            int id = int.Parse(idB.Text);
            String nomLycee = nomB.Text;
            String villeLycee = villeB.Text;
            String nomDelegation = listeDele.Text;
            int idDele = getIdDelegation(nomDelegation);
            try
            {
                SqlCommand cmd = new SqlCommand("update lycee set nomLycee = '" + nomLycee + "', villeLycee='" + villeLycee + "', ldDelegation='" + idDele + "' where idLycee =" + id + "", conn);
                conn.Open();
                cmd.ExecuteNonQuery(); // Exécution de la requête SQL   
                MessageBox.Show("La modification a été effectuée avec succè");
                conn.Close();
                listeLycees();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            int id = int.Parse(idB.Text);
           
            try
            {
                cmd = new SqlCommand("delete from lycee where idLycee =" + id + "", conn);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
                listeLycees();
                MessageBox.Show("La suppression a été effectuée avec succè");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        private void button4_Click(object sender, EventArgs e)
        {
            idB.Text = "";
            nomB.Text = "";
            villeB.Text = "";
            listeAcad.SelectedIndex = -1;
            listeDele.SelectedIndex = -1;
            listeAcad.Items.Clear();
            listeDele.Items.Clear();
        }

        private void listeLycees() {

            try
            {
                cmd = new SqlCommand("select idLycee as 'Id du lycee'  , nomLycee as 'Nom du lycee', villeLycee as 'Ville du lycee', nomDelegation as 'Delegation', nomAcademie as 'Academie' from lycee, academie, delegation where delegation.ldDelegation=lycee.ldDelegation and delegation.ldAcademie=academie.ldAcademie", conn);
                conn.Open();
                dr = cmd.ExecuteReader();   
                source.DataSource = dr;
                dv.DataSource = source;
                dr.Close();

                conn.Close();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }

        }


        private void Lycee_Load(object sender, EventArgs e)
        {
            nomAcademies();
            listeLycees();
            
        }

        private int getIdAcademie(String nomAcad)
        {
            
            cmd = new SqlCommand("select ldAcademie from academie where nomAcademie = '" + nomAcad + "'", conn);
            conn.Open();
            int i = (int)cmd.ExecuteScalar();
            conn.Close();
            return i;
        }
        private int getIdDelegation(String nomDele)
        {
            cmd = new SqlCommand("select ldDelegation from delegation where nomDelegation = '" + nomDele + "'", conn);
            conn.Open();
            int i = (int)cmd.ExecuteScalar();
            conn.Close();
            return i;
        }
        private void listeAcad_SelectedIndexChanged(object sender, EventArgs e)
        {
            listeDele.Items.Clear();
            String nomAcademie = listeAcad.Text;
            if (listeAcad.SelectedIndex != -1){
            int idAcad = getIdAcademie(nomAcademie);
            try
            {
                cmd = new SqlCommand("select nomDelegation from delegation where ldAcademie='" + idAcad + "' ", conn);
                conn.Open();
                dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        listeDele.Items.Add(dr["nomDelegation"]);
                    }
                }
                listeDele.SelectedIndex = 0;
                dr.Close();
                conn.Close();
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

La classe professeur :

 
namespace TP7_Gestion_Etablissement
{
    public partial class Professeur : Form
    {
        SqlConnection conn = new SqlConnection("server = DESKTOP-EIALG0J\\SQLEXPRESS; database = education; integrated security = SSPI");
        SqlDataReader dr;
        SqlCommand cmd;
        BindingSource source = new BindingSource();
        public Professeur()
        {
            InitializeComponent();
        }

        private void Professeur_Load(object sender, EventArgs e)
        {
            
            remplirComboLycee();
            navigation();
            EtatC.Items.Add("célibataire");
            EtatC.Items.Add("marié");
            EtatC.Items.Add("divorcé");
            EtatC.Items.Add("veuf");
            EtatC.SelectedIndex = -1;
            listeLyceeCombo.SelectedIndex = -1;
            idC.Text = "";
            nomC.Text = "";
            emailC.Text = "";
            nbrC.Text = "";

        }

        private void remplirComboLycee()
        {
            try
            {
                cmd = new SqlCommand("select * from lycee", conn);
                conn.Open();
                dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        listeLyceeCombo.Items.Add(dr["nomLycee"]);
                    }
                }
                listeLyceeCombo.SelectedIndex = -1;
                conn.Close();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }

        }
        private void listeProfesseurs()
        {

            try
            {
                cmd = new SqlCommand("select ldProfesseur as 'ld Professeur', nomProfesseur as 'Nom Professeur', Email, EtatCivil as 'Etat Civil', nbrEnfants as 'Nombre Enfants', nomLycee as 'Lycee'  from professeur, lycee where professeur.idLycee=lycee.idLycee", conn);
                conn.Open();
                dr = cmd.ExecuteReader();
                source.DataSource = dr;
                dv.DataSource = source;
                dr.Close();

                conn.Close();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }

        }

        private void EtatC_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (EtatC.Text == "célibataire")
            {
                nbrC.Text = "";
                nbrC.Enabled = false;
            }
            else {
                nbrC.Enabled = true;
            }
        }
        private void navigation()
        {

            try
            {
                cmd = new SqlCommand("select ldProfesseur as 'ld Professeur', nomProfesseur as 'Nom Professeur', Email, EtatCivil as 'Etat Civil', nbrEnfants as 'Nombre Enfants', nomLycee as 'Lycee'  from professeur, lycee where professeur.idLycee=lycee.idLycee", conn);
                conn.Open();
                dr = cmd.ExecuteReader();
                source.DataSource = dr;
                idC.DataBindings.Add(new Binding("text", source, "ld Professeur"));
                nomC.DataBindings.Add(new Binding("text", source, "Nom Professeur"));
                emailC.DataBindings.Add(new Binding("text", source, "Email"));             
                nbrC.DataBindings.Add(new Binding("text", source, "Nombre Enfants"));

                EtatC.DataBindings.Add(new Binding("SelectedItem", source, "Etat Civil"));
                listeLyceeCombo.DataBindings.Add(new Binding("SelectedItem", source, "Lycee"));

                indexLabel.Text = (source.Position + 1).ToString();
                totalLabel.Text = source.Count.ToString();
                dv.DataSource = source;
                dr.Close();

                conn.Close();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }

        }
       
        private void button1_Click_1(object sender, EventArgs e)
        {

            source.MoveFirst();
            indexLabel.Text = (source.Position + 1).ToString();
            totalLabel.Text = source.Count.ToString();
        }

        private void button2_Click_1(object sender, EventArgs e)
        {
            source.MovePrevious();
            indexLabel.Text = (source.Position + 1).ToString();
            totalLabel.Text = source.Count.ToString();
        }

        private void button3_Click_1(object sender, EventArgs e)
        {
            source.MoveNext();
            indexLabel.Text = (source.Position + 1).ToString();
            totalLabel.Text = source.Count.ToString();
        }

        private void button4_Click_1(object sender, EventArgs e)
        {
            source.MoveLast();
            indexLabel.Text = (source.Position + 1).ToString();
            totalLabel.Text = source.Count.ToString();
        }

        private void Vider_Click(object sender, EventArgs e)
        {
            EtatC.SelectedIndex = -1;
            listeLyceeCombo.SelectedIndex = -1;
            idC.Text = "";
            nomC.Text = "";
            emailC.Text = "";
            nbrC.Text = "";
           
        }
        private int getIdLyceen(String nomLycee)
        {
            cmd = new SqlCommand("select idLycee from lycee where nomLycee = '" + nomLycee + "'", conn);
            conn.Open();
            int i = (int)cmd.ExecuteScalar();
            conn.Close();
            return i;
        }
        private void Ajouter_Click(object sender, EventArgs e)
        {
            int id = int.Parse(idC.Text);
            String nom = nomC.Text;
            String email = emailC.Text;
            String etat = EtatC.Text;
            int idLycee = getIdLyceen(listeLyceeCombo.Text);
            try
            {
                SqlCommand cmd = new SqlCommand("INSERT INTO professeur VALUES(" + id + " , '" + nom + "','" + email + "','" + etat + "'," + (nbrC.Text == "" ? "NULL" : "'" + nbrC.Text + "'") + ",'" + idLycee + "')", conn);
                conn.Open();
                cmd.ExecuteNonQuery(); // Exécution de la requête SQL   
                MessageBox.Show("L'insertion a été effectuée avec succè");
                conn.Close();
                listeProfesseurs();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }
        }

        private void Supprmier_Click(object sender, EventArgs e)
        {
            int id = int.Parse(idC.Text);

            try
            {
                cmd = new SqlCommand("delete from professeur where ldProfesseur =" + id + "", conn);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
                listeProfesseurs();
                MessageBox.Show("La suppression a été effectuée avec succè");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void Modifier_Click(object sender, EventArgs e)
        {
            int id = int.Parse(idC.Text);
            String nom = nomC.Text;
            String email = emailC.Text;
            String etat = EtatC.Text;
            int idLycee = getIdLyceen(listeLyceeCombo.Text); ;
            try
            {
                SqlCommand cmd = new SqlCommand("update professeur set nomProfesseur = '" + nom + "', Email='" + email + "', EtatCivil='" + etat + "', nbrEnfants=" + (nbrC.Text == "" ? "NULL" : "'" + nbrC.Text + "'") + ", idLycee='" + idLycee + "' where ldProfesseur =" + id + "", conn);
                conn.Open();
                cmd.ExecuteNonQuery(); // Exécution de la requête SQL   
                MessageBox.Show("La modification a été effectuée avec succè");
                conn.Close();
                listeProfesseurs();
            }
            catch (Exception ex)
            {
                // Affiche des erreurs
                MessageBox.Show(ex.Message);
            }
        }

    }
}

TP
Share this Story:
  • facebook
  • twitter
  • gplus

About Hassan EL Bahi

Assistant Professor at Cadi ayyad University.

Leave a comment

Comment