Manupulation entre deux form (form1 et form2) [Résolu]

astvt 45 Messages postés dimanche 6 novembre 2005Date d'inscription 2 août 2018 Dernière intervention - 16 juil. 2018 à 14:49 - Dernière réponse : astvt 45 Messages postés dimanche 6 novembre 2005Date d'inscription 2 août 2018 Dernière intervention
- 2 août 2018 à 08:44
Bonjour,
J'ai une form1 qui contient un datagridview avec des informations qui viennent d'une base de données.
Dans cette datagridview il y a plusieurs lignes d'affichées suite à une recherche en fonction de certain critères de recherche.
Lorsque je fait un click sur une ligne pour la sélectionner, je vais rechercher des informations sur les données sélectionnées, dans la database. Ces nouvelles données sont affichées dans différentes zones de texte et liste de text dans ma seconde form Form2. Jusque la tout vas bien.
Maintenant sur ma form2 j'ai 4 boutons (1 bouton retour à la première ligne, 1 bouton reculer d'une ligne, 1 bouton avancer d'une ligne et 1 bouton aller à la dernière ligne.
Comment faire pour que chaque bouton agissent sur la sélection de ligne dans ma datagridview dans ma form1.
J'ai essayer d'utiliser un délégué mais je n'y arrive pas.
Pouvez vous m'aider sur mon problème? Merci d'avence pour votre aide.

--
Afficher la suite 

Votre réponse

32 réponses

Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 16 juil. 2018 à 16:54
0
Merci
Bonjour
un peu de lecture.

Je pense que la méthode des événements est la mieux adaptée à ton cas.
Commenter la réponse de Whismeril
astvt 45 Messages postés dimanche 6 novembre 2005Date d'inscription 2 août 2018 Dernière intervention - 17 juil. 2018 à 16:41
0
Merci
ASTVT
Bonjour, j'ai abandonné l'idée d'utiliser un délégué et j’essaie d'utiliser des méthode d'événements.
Le problème lorsque je veux récupérer quoi que ce soit de la datagridview de la form1 j'ai un message qui me dit que la form1 est null. C'est normale puisque pour essayée d’accéder à la form1 je fais form1 = new form1; dans la classe de ma form2.
Donc je reviens à ma question comment accéder depuis une form X à une form Y et vis versa. Car le fait de faire form1 = new form1 dans la classe form2 crée une nouvelle form1 qui est vide et qui, je le pense n'a rien à voire avec la form1 d'origine.
Merci d'éclairer ma lanterne.
--
Commenter la réponse de astvt
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 17 juil. 2018 à 16:52
0
Merci
Ho, je m’aperçois que le lien vers le tuto n’est pas dans mon premier message.

https://codes-sources.commentcamarche.net/faq/11107-interactions-entre-form-en-net-c-et-vb-net

Je ne sais pas ce qui c’est passé, oubli de ma part, bug?
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 17 juil. 2018 à 16:57
A la réflexion,
Je pense qu’en appliquant un binding sur ta form1, que tu passes en paramètres sur ta form2.
Avec les boutons, tu agis sur « le numéro » d’enregistrement et tout le monde s’actualise.
Commenter la réponse de Whismeril
astvt 45 Messages postés dimanche 6 novembre 2005Date d'inscription 2 août 2018 Dernière intervention - 18 juil. 2018 à 14:16
0
Merci
ASTVT
Bonjour, j'ai avec attention lu le code source "interactions entre form".
Dans ce tutoriel il est plus question de passer des données entre deux formulaires.
Ce que je cherche à faire depuis ma form2 et ses boutons avancés ou reculés, c'est de positionner dans ma form1 la ligne sélectionnée de la datagridview. soit reculer à la première ligne, soit reculer d'une ligne, soit d'avancer d'une ligne ou aller à la dernière ligne. Je ne veux pas changer les données affichées dans la datagridview. Dans cette datagridview je peux avoir une, dix cent ou mille lignes d'affichées en fonction de la recherche dans ma base de données. Une fois sélectionnée, la nouvelle ligne dans la datagridview, afficher dans ma form2 des informations sur les données correspondante à la ligne sélectionnée.
Je sais pas si le tutoriel peut m'aider et comment le mettre en œuvre.
Cordialement.
--
Commenter la réponse de astvt
astvt 45 Messages postés dimanche 6 novembre 2005Date d'inscription 2 août 2018 Dernière intervention - Modifié par NHenry le 19/07/2018 à 21:36
0
Merci
ASTVT
j'ai fais dans ma form2
namespace EITF2
{
    public partial class Article : Form
    {
        public Imprime Imprime { get; set; }
        public ImpresDonnées ImpresDonnées { get; set; }
        public int Index { get; private set; }
        /// définition pour la fenêtre listearticle.
        /// </summary>
        public ListeArticle liste;
        public int nligne;
        /// <summary>
        /// définition pour la datagridview
        /// </summary>
        private DataGridView dgv;
        private object AvanceReculeBindingSource;
        public DataGridView Dgv { get => dgv; set => dgv = value; }
dans mon bouton
         ----nligne;
         liste.Dgv.Rows[nligne].Selected = true;

dans ma form1
namespace EITF2
{
    public partial class ListeArticle : Form
    {
        /// <summary>
        /// définition pour la fenêtre article
        /// </summary>
        public Article article;
  public void Dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
                code...... traitement de la ligne sélectionnée 
                //affiche la fenêtre article. (form2)
                article.Show();
         }

création d'une classe
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EITF2
{
    class AvanceRecule:INotifyPropertyChanged
    {
        public string nligne
        {
            get { return nligne; }
            set
            {
                nligne = value;
                GenerereLaNotification(nligne);
            }
        }
        #region INotifyPropertyChanged Membres
        public event PropertyChangedEventHandler PropertyChanged;
        private void GenerereLaNotification(string nligne)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(nligne));
        }
        #endregion
    }
}

Voila ce que j'ai essayé et qui ne fonctionne pas

EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Commenter la réponse de astvt
astvt 45 Messages postés dimanche 6 novembre 2005Date d'inscription 2 août 2018 Dernière intervention - 18 juil. 2018 à 14:48
0
Merci
ASTVT
Dans le code de mon bouton dans fram2 je ce code d'erreur qui s'affiche au debuggage
liste.Dgv.Rows[nligne].Selected = true;
System.NullReferenceException : 'La référence d'objet n'est pas définie à une instance d'un objet.'

liste a été null.

--
Commenter la réponse de astvt
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 18 juil. 2018 à 17:47
0
Merci
j'ai avec attention lu le code source "interactions entre form".
Dans ce tutoriel il est plus question de passer des données entre deux formulaires.

Et c'est exactement ce que tu veux faire.

Dans le sens "form1" vers "form2" tu veux envoyer plus de détails sur un enregistrement.
Dans le sens "form2" vers "form1" tu veux envoyer une information de changement d'enregistrement.

Je vois 2 options.

Option 1, utilisation d'un BindingSource

(celle qui a ma préférence)

A la fin du tuto, je parle de ce contrôle, et je mets un lien vers un autre tuto dédié.
Supposons que le datagridview de la "form1" soit bindé via ce contrôle.
On passe en paramètre à "form2" le BindingSource, et dans ce formulaire, l'affichage des détails est lui aussi bindé.
Et dans les boutons, tu agis sur les méthode MoveQuelqueChose dudit BindingSource.

Option 2, utilisation d'évènements

Dans le sens "form1" vers "form2" tu passes par la méthode que tu veux, les détails à afficher.
Dans "form2", tu crées un évènement "Move", avec un paramètre (une énumération par exemple).
Tu abonnes une méthode de "form1" à cet évènement. Dans ladite méthode tu gères le changement d'enregistrement en fonction du paramètre.
Dans les boutons de "form2" tu déclenches l'évènement avec le bon paramètre.

Je n'ai pas lu ton code, en l'état c'est pénible, j'attends qu'un modérateur corrige ta coloration syntaxique.
Voir ici https://codes-sources.commentcamarche.net/forum/affich-10086941-amelioration-procedure-balises-de-code#11 si tu as des commentaires à faire sur ce "brouillon de tuto" n'hésite pas.
Commenter la réponse de Whismeril
0
Merci
ASTVT
Bonjour.
Pouvez-vous me donner un exemple pour l'option 2 "utilisation d'évènement".
J'ai beau lire et relire des tutoriels sur le sujet, je n'arrive pas à comprendre ce que je dois faire.
Pour passer des données de la form1 vers la forme2 pas de problème.
Par contre de la form2 vers la form1, là j'ai des problèmes.
Vous suggérer de créer un évènement avec paramètre puis d'abonner une méthode de form1 à cet évènement.
Pouvez-vous m'expliquer par un exemple comment faire. Si je clic sur un bouton de ma form2 pour avancer ou reculer d'une ligne de ma datagridview qui est affichée dans ma form1.
Merci pour votre aide.
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 24 juil. 2018 à 16:16
As tu téléchargé et essayé le projet Bidou?
Commenter la réponse de ASTVT
astvt 45 Messages postés dimanche 6 novembre 2005Date d'inscription 2 août 2018 Dernière intervention - 25 juil. 2018 à 10:33
0
Merci
Bonjour.
J'ai charger le projet "interface entre form en .net(c# et vb.net).
Ce que j'ai compris c'est qu'il est plus questions de passage de données par un binding entre les forms.
Ce que je cherche à faire c'est depuis ma form2 au travers de différents boutons, agir sur les lignes affichées dans la datagrid affichée dans form1. je veux seulement déplacer la ligne de sélection en cours soit de revenir à la première ligne, soit d'avancer ou de reculer d'une ligne soit aller à la dernière ligne et afficher dans ma form2 le résultat de la sélection.
Si je clic sur une ligne affichée dans la datagrid de la form1, la form2 affiche tous les détailles de la ligne sélectionnée. Dans le sens form1 vers form2 je n'ai pas de soucis pour afficher les résultats de la sélection dans la datagrid de la form1. Comme expliqué plus haut c'est dans le sens form2 vers form1 que je n'arrive pas manipuler la sélection dans la datagrid.
Si vous avez des exemples, je suis preneur.
Merci pour votre aide.

--
Commenter la réponse de astvt
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 25 juil. 2018 à 11:50
0
Merci
Dans le paragraphe 5.
Je marque que Bidou a déjà posté un exemple, alors que je ne vais pas réinventer la roue.
https://codes-sources.commentcamarche.net/source/26735-passage-de-parametres

Dans un sens, il se sert du passage de paramètre et dans l'autre, il génère un évènement
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 25 juil. 2018 à 11:52
là un tuto sur les délégués (utile pour les évènements)
https://fguillot.developpez.com/cours/dotnet/introduction-delegates-csharp/
Commenter la réponse de Whismeril
astvt 45 Messages postés dimanche 6 novembre 2005Date d'inscription 2 août 2018 Dernière intervention - Modifié par NHenry le 26/07/2018 à 19:34
0
Merci
Bonjour, je vous joins le code de ma form1 et form2.
J'ai essayé de créer un évènement dans form2 qui ne donne pas de problème au débuggage.
J'ai essayé de créer dans form1 un abonnement à l'évènement de form2 sans y parvenir.
Merci de me dire ou sa coince.
code form1
using System;
using System.Collections;
using System.Data.Common;
using System.Windows.Forms;

namespace EITF2
{
    public partial class ListeArticle : Form //(form1)
    {
        /// <summary>
        /// définition pour la fenêtre article //(form2)
        /// </summary>
        public Article article;
 //pour créer un évènement
        public EventHandler MoveLigne;

        /// <summary>
        /// initialisation de la fenêtre listearticles
        /// et de la datagridview
        /// </summary>
        public ListeArticle()
        {
            //initialisation de la fenêtre listearticle
            InitializeComponent();
            //active la fenêtre article
            article = new Article();
        }
  
        /// <summary>
        /// affichage dans la fenêtre article les détails après sélection d'une ligne dans la datagridview
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// 
        public void Dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //définition du fournisseur d'acces à la datatbase
   
  ...... //code supprimé
  
            //récupération du nombre de lignes d'article affichés
            Nbart = dgv.Rows.Count;
            //récupère le numéro de la ligne sélectionnée
            nligne = dgv.Rows[e.RowIndex].Index;
            //envoie le numéro de ligne à la fenêtre article
            article.nligne = nligne;
            //envoie le nombre de ligne à la fenêtre article
            article.nbart = Nbart;
            MessageBox.Show("Numéro de la ligne sélectionnée dans la datagridview " + nligne,"N°de la ligne sélectionnée",MessageBoxButtons.OK, MessageBoxIcon.Information);
            //vérifie si plus de un article affiché
            if (Nbart > 1)
                {
                    //rend actif le bouton retour au premier article.
                    article.button1.Enabled = true;
                    //rend actif le bouton recule d'un article.
                    article.button2.Enabled = true;
                    //rend actif le bouton avance d'un article.
                    article.button3.Enabled = true;
                    //rend actif le bouton avance au dernier article.
                    article.button4.Enabled = true;
                }
            //affiche la fenêtre article.
            article.Show();
            //ferme la lecture de la table elektor
            oRdr.Close();
            }
        }
    }
}


Code form2
using System;
using System.Windows.Forms;

namespace EITF2
{
    public partial class Article : Form //(form2)
    {
  /// <summary>
        /// définition pour la fenêtre listearticle //(form1).
        /// </summary>
        public ListeArticle liste;

        public int nligne;
        public int nbart;

        //délégué
        public delegate void MoveLigneEventHandler(object sender, MoveLigneEventArgs e);
        //event
        public event MoveLigneEventHandler MoveLigne;

        /// <summary>
        /// définition pour la datagridview de la fenêtre listearticle
        /// </summary>
        private DataGridView dgv;
        public DataGridView Dgv { get => dgv; set => dgv = value; }


        /// <summary>
        /// initialisation de la fenêtre article
        /// </summary>
        public Article()
        {
            //initialisation de la fenêtre article
            InitializeComponent();
        }
  //pour création d'un évènement
        protected virtual void OnMoveLigne(MoveLigneEventArgs e)
        {
            if (MoveLigne != null)
                MoveLigne(this, e);
        }
  
        /// <summary>
        /// bouton recule jusqu'au premier article
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void Button1_Click(object sender, EventArgs e)
        {
            //recule jusqu'au premier article
            MessageBox.Show("Recule jusqu'au premier article", "Bouton 1", MessageBoxButtons.OK, MessageBoxIcon.Information);
            MessageBox.Show("nligne = " + nligne, "bouton2", MessageBoxButtons.OK, MessageBoxIcon.Information);
            //envoie une commande à la datagridview de revenir à la ligne 0 dans la fenêtre listearticle
   
   //essais de création d'un évènement pour la fenêtre listearticle
            nligne = 0;
            MoveLigneEventArgs Numligne = new MoveLigneEventArgs(false, 0);
            OnMoveLigne(Numligne);
        }
  
        /// <summary>
        /// bouton recule d'un article
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button2_Click(object sender, EventArgs e)
        {
            //recule d'un article
            MessageBox.Show("Reclue d'un article", "bouton 2", MessageBoxButtons.OK, MessageBoxIcon.Information);
            MessageBox.Show("nligne = " + nligne, "bouton2", MessageBoxButtons.OK, MessageBoxIcon.Information);
            //-1 dans le numéro de la ligne sélectionnée
            --nligne;
            //envoie une commande à la datagridview de réculer d'une ligne dans la fenêtre listearticle
            //liste.Dgv.Rows[nligne].Selected = true;
   /***************************************************************/
   /* si je supprime le double slash devant la ligne ci-dessus,   */
   /* j'ai un message qui me dit que liste est null à l'execution */
   /* d'un clic sur le bouton2                                    */
   /***************************************************************/
        }
    }
 
 //ajout d'une class pour la création de l'évènement
    public class MoveLigneEventArgs : EventArgs
    {
        private int nligne;
        //constructeur
        public MoveLigneEventArgs(bool v, int nligne)
        {
            this.nligne = nligne;
        }
        //propriétés
        public int NumLigne
        {
            get { return nligne; }
        }
    }
}


EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Commenter la réponse de astvt
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 26 juil. 2018 à 19:20
0
Merci
Bonsoir

merci de faire un effort avec la coloration, je te remets le lien vers le petit tuto
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Je lirai ton code quand un modérateur aura corrigé ça.

qui ne donne pas de problème au débuggage.

Quel problème?
Y'a un message d'erreur?
Si oui à quelle ligne?
Commenter la réponse de Whismeril
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 26 juil. 2018 à 20:34
0
Merci
Merci à Nhenri d'avoir corrigé ta coloration.


Commençons par dés généralités sur ton code.
  • Conserver les noms par défaut des contrôles, n'est pas judicieux.

Dans 6 mois, ou 1 an, quand tu reviendras maintenir ce code button1 ne sera pas très parlant.
Quelques caractères pour le type de contrôle et 1 ou 2 mot pour l'utilité est une bonne pratique butMoveNext là c'est explicite.
  • Les champs public c'est très très déconseillé.

    {
  /// <summary>
        /// définition pour la fenêtre listearticle //(form1).
        /// </summary>
        public ListeArticle liste;//ici par exemple

        public int nligne;//et là 
        public int nbart;// et là encore


Il faut utiliser des propriétés à la place, comme tu as fait là
        /// <summary>
        /// définition pour la datagridview de la fenêtre listearticle
        /// </summary>
        private DataGridView dgv;
        public DataGridView Dgv { get => dgv; set => dgv = value; }


Et d'ailleurs, dans le tuto, j'ai volontairement exclu cette méthode, cela étant considéré comme une mauvaise pratique.
Il est plus dans les règles de l'art de passer les données en paramètres au constructeur ou une méthode.
La raison est assez simple, c'est le meilleur moyen de ne pas oublier une valeur importante, le code ne compile même pas s'il manque un paramètre.

Ici
            //envoie le numéro de ligne à la fenêtre article
            article.nligne = nligne;
            //envoie le nombre de ligne à la fenêtre article
            article.nbart = Nbart;

tu n'as pas assigné article.liste donc forcément il vaut null, mais ça compile, puisqu'il n'y a pas d'erreur de syntaxe.


Dans ListeArticle, article n'a pas à être publiés du tout (même en propriété), par contre, si tu veux que l'événement soit reçu, il faut l'abonner.
        public ListeArticle()
        {
            //initialisation de la fenêtre listearticle
            InitializeComponent();
            //active la fenêtre article
            article = new Article();
            article. MoveLigne += .....// quand tu taperas += Visual Studio va te proposer d'écrire tout seul la suite et la méthode associée, pour valider tape Tab 2 fois
        }


Dans la méthode abonnée, il va falloir que tu renvoies toutes les infos utiles à l'autre form et que tu forces son rafraichissement.

Je pense toujours que c'est bien plus simple à gérer avec le binding.
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 26 juil. 2018 à 21:45
Commenter la réponse de Whismeril
astvt 45 Messages postés dimanche 6 novembre 2005Date d'inscription 2 août 2018 Dernière intervention - 28 juil. 2018 à 12:03
0
Merci
Bonjour. Voici les modifications apportées au code de la form2:
 public partial class Article : Form
    {
        public Imprime Imprime { get; set; }
        public ImpresDonnées ImpresDonnées { get; set; }
        /// définition pour la fenêtre listearticle.
        /// </summary>
        public ListeArticle liste;

        private int nligne;
        public int Nligne { get => nligne; set => nligne = value; }

        private int nbart;
        public int Nbart { get => nbart; set => nbart = value; }

        //délégué
        public delegate void MoveLigneEventHandler(object sender, MoveLigneEventArgs nligne);
        //event
        public event MoveLigneEventHandler MoveLigne;

        /// <summary>
        /// définition pour la datagridview
        /// </summary>
        private DataGridView dgv;
        public DataGridView Dgv { get => dgv; set => dgv = value; }


        /// <summary>
        /// initialisation de la fenêtre article
        /// </summary>
        public Article()
        {
            //initialisation de la fenêtre article
            InitializeComponent();

        }

        //pour la création de l'évènement
        protected virtual void OnMoveLigne(MoveLigneEventArgs nligne)
        {
            if (MoveLigne != null)
                MoveLigne(this, nligne);
        }
         public void Button1_Click(object sender, EventArgs e)
        {
            //recule jusqu'au premier article
            MessageBox.Show("Recule jusqu'au premier article", "Bouton 1", MessageBoxButtons.OK, MessageBoxIcon.Information);
            MessageBox.Show("nligne = " + Nligne, "bouton2", MessageBoxButtons.OK, MessageBoxIcon.Information);
            //envoie une commande à la datagridview de revenir à la ligne 0 dans la fenêtre listearticle
            this.nligne = 0;
            MoveLigneEventArgs nligne = new MoveLigneEventArgs(false, 0);
            OnMoveLigne(nligne);
        }
        /// <summary>
        /// bouton recule d'un article
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button2_Click(object sender, EventArgs e)
        {
            //recule d'un article
            MessageBox.Show("Reclue d'un article", "bouton 2", MessageBoxButtons.OK, MessageBoxIcon.Information);
            MessageBox.Show("nligne = " + Nligne, "bouton2", MessageBoxButtons.OK, MessageBoxIcon.Information);
            //-1 dans le numéro de la ligne sélectionnée
            --this.nligne;
            MoveLigneEventArgs nligne = new MoveLigneEventArgs(false, 0);
            //envoie une commande à la datagridview de réculer d'une ligne dans la fenêtre listearticle
            OnMoveLigne(nligne);
        }
    public class MoveLigneEventArgs : EventArgs
    {
        private int nligne;
        //constructeur
        public MoveLigneEventArgs(bool v, int nligne)
        {
            this.nligne = Nligne;
        }
        //propriétés
        public int Nligne
        {
            get { return nligne; }
            set { this.nligne = value; }
        }
    }
--


Modification pour la form1
        /// <summary>
        /// Définition pour l'abonnement à moveligne
        /// </summary>
        public Article.MoveLigneEventHandler Article_MoveLigne { get; private set; }
        public ListeArticle()
        {
            //initialisation de la fenêtre listearticle
            InitializeComponent();
            //vérification si la fenêtre article. est active ou non
            article = new Article();
            //abonne listearticle à l'évènement moveligne
            article.MoveLigne += Article_MoveLigne1;
private void Article_MoveLigne1(object sender, MoveLigneEventArgs nligne)
        {
            Dgv.Rows[nligne.Nligne].Selected = true;
            article.Refresh();
            this.Refresh();
        }


Lorsque je clique sur le bouton1 de la form2, la ligne de sélection de la datagrid de la form1 se déplace bien sur la première ligne. Si je clique sur le bouton 2 de la form2, la ligne de sélection de la datagrid de la form1 se déplace aussi sur la première ligne.
Il y a un problème avec la définition suivante:
MoveLigneEventArgs nligne = new MoveLigneEventArgs(false, 0);
La valeur de nligne est remise à zéro.
Question 1 comment faire pour éviter cette définition qui remet à zéro la valeur de nligne?
Question 2 comment faire dans la form1 après le déplacement de la ligne de sélection sur la nouvelle sélection, pour simuler un clic de la fonction:
public void Dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
Merci de votre aide.
Commenter la réponse de astvt
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - Modifié par Whismeril le 28/07/2018 à 13:01
0
Merci
Tu n'as pas regardé le source que j'ai fait rien que pour toi il semble.


Pourquoi Liste est il toujours un champ public?

Pourquoi OnMove est virtuelle?

Fait attention avec tes noms de variable dans la même form
            this.nligne = 0;//là c'est un int
            MoveLigneEventArgs nligne = new MoveLigneEventArgs(false, 0); // et là c'est un eventArg.... danger
            OnMoveLigne(nligne);


pour ton problème à proprement parler,
            --this.nligne;//ici tu décomptes une ligne
            MoveLigneEventArgs nligne = new MoveLigneEventArgs(false, 0);// et là tu forces à 0


Peut-être qu'avec des noms de variables, différents et explicites, tu n'aurais pas fait cette erreur...
D'ailleurs même pas besoin de variable
            //envoie une commande à la datagridview de réculer d'une ligne dans la fenêtre listearticle
            OnMoveLigne(new MoveLigneEventArgs(false, --this.nligne););


Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 28 juil. 2018 à 13:02
Au fait, merci pour la coloration, là on peut travailler.
Commenter la réponse de Whismeril
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 28 juil. 2018 à 23:53
0
Merci
J'ai pensé à un truc pour simplifier un peu ton code.
Puisque la portée de nligne s'étend sur toute ta form, tu peux très bien te passer du paramètre de OnMoveLigne

        //pour la création de l'évènement
        protected virtual void OnMoveLigne()
        {
            if (MoveLigne != null)
                {
                     MoveLigne(this, new MoveLigneEventArgs(false, this.nligne));
                }
        }


Et dans chaque bouton
//retour à 0
            this.nligne = 0;
            OnMoveLigne();

//ligne précédente
            this.nligne--;
            OnMoveLigne();
Commenter la réponse de Whismeril
astvt 45 Messages postés dimanche 6 novembre 2005Date d'inscription 2 août 2018 Dernière intervention - 29 juil. 2018 à 19:09
0
Merci
Bonjour.J'ai rectifié tout les problèmes . Maintenant, lorsque je clique sur mes boutons de ma form2, je déplace bien lz ligne de sélection de la première à la dernière ligne en passant par avance ou reculer d'une ligne dans la datagrille de la form1.
Il me reste un problème avec le déclenchement de la sélection de la ligne. Je m'explique, une fois la ligne avancée, reculée, déplacée à la première ligne ou à la dernière ligne, je voudrais déclencher ma fonction:
public void Dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
en faite, simuler un click de la souris sur la ligne de sélection en cours.
Quand je clique réellement avec la souris sur le ligne sélectionnée dans la datagrille de la form1, j'appelle la fonction:
public void Dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
avec laquelle, je remplis les champs de la form2. En bref je voudrais simuler un clic de la souris sur la ligne de sélection de la datagrille de la form1.
private void Article_MoveLigne1(object sender, MoveLigneEventArgs nligne)
        {
            //assagne la nouvelle valeur de ligne de sélection
            Dgv.Rows[nligne.Nligne].Selected = true;
            //rafraichie la fenêtre listearticle
            this.Refresh();
            //appel la fonction dgv_cellcontentclick
            Dgv_CellContentClick(sender, e);
        }

losque j'exécute le code ci-dessus, je vais bien dans la fonction
public void Dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
mais j'ai une erreur dans:
//récupération du numéro d'article dans la ligne sélectionnée
Donnee = Dgv.Rows[e.RowIndex].Cells[5].Value.ToString();
Erreur de type null, [e.RowIndex] lève une exception comme quoi "e" est vide.
Si j'arrivais à simuler un clic de la souris sur la ligne sélectionnée, je pense que je pourrais déclencher la fonction Dgv_CellContentClick.
Si vous avez une solution pour mon problème, je vous en remercie d'avance pour toute l'aide que vous m'avez déjà apporté.
--
Commenter la réponse de astvt
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 29 juil. 2018 à 20:43
0
Merci
Je t'avais déjà dit que la mise à jour ne serait pas simple....

Il ne faut pas que tu repasses par Dgv_CellContentClick
D'abord, parce que dans cette méthode tu affiches l'autre form, or elle est déjà affichée.
Et ensuite
private void Article_MoveLigne1(object sender, MoveLigneEventArgs nligne)
        {
            //assagne la nouvelle valeur de ligne de sélection
            Dgv.Rows[nligne.Nligne].Selected = true;
            //rafraichie la fenêtre listearticle
            this.Refresh();
            //appel la fonction dgv_cellcontentclick
            Dgv_CellContentClick(sender, e);//d'où il sort ce e?
        }




Je pense que le mieux est de créer une méthode que tu appellerais de Dgv_CellContentClick et de Article_MoveLigne1 dans laquelle tu mettrais à jour les infos.

Un truc du genre
MettreAJour(int NumeroLigne)
{
            //envoie le numéro de ligne à la fenêtre article
            article.nligne = NumeroLigne;
            //envoie le nombre de ligne à la fenêtre article
            article.nbart = dgv.Rows.Count;

}


Que tu appellerais depuis Dgv_CellContentClick
MettreAJour(e.RowIndex);

Ha oui ça
 nligne = dgv.Rows[e.RowIndex].Index;
c'est comme "monter en haut", tu te sers du numéro de la ligne sélectionnée, pour la sélectionner et prendre son numéro.

Et dans Article_MoveLigne1
private void Article_MoveLigne1(object sender, MoveLigneEventArgs nligne)
        {
            //assagne la nouvelle valeur de ligne de sélection
            Dgv.Rows[nligne.Nligne].Selected = true;
            //rafraichie la fenêtre listearticle
            this.Refresh();
            //appel la fonction dgv_cellcontentclick
            MettreAJour(nligne);
        }

Commenter la réponse de Whismeril
astvt 45 Messages postés dimanche 6 novembre 2005Date d'inscription 2 août 2018 Dernière intervention - 30 juil. 2018 à 17:29
0
Merci
Bonjour.
Si vous le voulez bien, je peux vous envoyer mon projet. Comme cela vous pourrez vous rendre contre de ce que souhaite faire.

--
Commenter la réponse de astvt
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 30 juil. 2018 à 18:36
0
Merci
As tu essayé ce que je t'ai mis au-dessus?
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.