none
Evenement et UserControl RRS feed

  • Question

  • Bonjour à tous,

    Mon Form principal contient plusieurs User Conrols dont un qui est un formulaire de login. Je souhaite récupérer l’identité de la personne qui se connecte. L’identification est traitée dans le UserControl login. Pour récupérer l’identité de la personne, j’ai créé un délégué et un événement dans le UserControl login auquel le Form principal est abonné. Donc si la personne est identifié, le Form est averti et récupère les coordonnées.

    Lorsque j’appelle cet événement dans mon UserControl login, il me renvoi le message d’erreur suivant = « La référence d'objet n'est pas définie à une instance d'un objet.» . Je ne comprends pas pourquoi mon Event est null? Lorsque je me connecte il me retourne bien 1 employé.

    Auriez-vous une idée ? Merci

    Voici mon code :

    Mon Form Principal

        public partial class MainRibbonForm : Form
        {
            UserControl uc = null;
            LoginUC lu = new LoginUC();
    
            public MainRibbonForm()
            {
                // Connection TO DB
    
                InitializeComponent();
                initialize();
                lu.OnConnect += new LoginUC.connecte(identification);
                loadViews();
            }
    
            private void initialize()
            {
                CaisseTab.Visible = false;
                ComptaTab.Visible = false;
                AdminTab.Visible = false;
                StockTab.Visible = false;
            }
    
            private void loadViews()
            {
                uc = new LoginUC();
                displayUserControl(uc);
            }
    
            private void displayUserControl(UserControl uc)
            {
                UCPanel.Controls.Clear();
                UCPanel.Controls.Add(uc);
                uc.Anchor = AnchorStyles.None;
                uc.Dock = DockStyle.Fill;
            }
    
            public void identification()
            {
                statutLab.Text = lu.Employee.nom;
            }
    
        }

    Mon UserControl login

        public partial class LoginUC : UserControl
        {
            public delegate void connecte();
            public event connecte OnConnect;
    
            List<EmployeeDTO> listEmployee = new List<EmployeeDTO>();
    
            private EmployeeDTO employee;
    
            public EmployeeDTO Employee
            {
                get { return employee; }
                set { employee = value; }
            }
    
    
            public LoginUC()
            {
                InitializeComponent();
                initialize();
                loadViews();
            }
    
            private void initialize()
            {
            }
    
            private void loadViews()
            {
    
            }
    
    
            public virtual void ConnexionBTN_Click(object sender, EventArgs e)
            {
                listEmployee = EmployeeModel.identifyEmployee(UserNameTB.Text, PasswordTB.Text);
                if (listEmployee.Count() > 0)
                {
                    MessageBox.Show("Ok Connecté");
                    foreach (EmployeeDTO emp in listEmployee)
                    {
                        employee = emp;
                    }
                    OnConnect();
                }
                else
                {
                    MessageBox.Show("Pas Connecté");
                }
    
            }
        }


    • Modifié paintbox00 lundi 18 février 2013 16:34
    lundi 18 février 2013 14:38

Réponses

  • Bonjour,

    1) êtes-vous sûrs qu'il s'agisse de votre event qui est null ? Avez-vous exécuté pas-à-pas le code de connexion pour vérifier quelle variable ou propriété serait null ?

    2) Pour exécuter un évènement par sécurité il est toujours conseillé de passer par une variable intermédiaire et de tester son état null :

    var myEvent = OnConnect;
    if(myEvent!=null){
     myEvent();
    }

    Souvent on place ce code dans une méthode que l'on appelle à chaque besoin.

    Cordialement,


    Yan Grenier

    • Marqué comme réponse paintbox00 mardi 19 février 2013 13:09
    mardi 19 février 2013 08:21
  • Je viens de tilter le problème :)

    Vous avez votre champ "lu" qui est initialisé à la création de la classe. Dans votre constructeur vous branchez votre event, puis vous appelez LoadViews qui instancie un nouveau contrôle dans "uc" cette fois. Et c'est "uc" qui est ajouté à votre form principal. Hors "uc" n'a pas d'évent branché donc null.

    Soit vous affectez "lu" à "uc", soit vous branchez votre event sur "uc", mais dans votre cas je soupçonne qu'il s'agisse de la première solution.


    Yan Grenier


    mardi 19 février 2013 08:46
  • C'est exacte, je n'avais pas fait attention à cela. J'ai plusieurs UserControl dans mon Form.

    Merci pour votre aide ! Cela fonctionne !

    Voici le code exacte si cela peut aider quelqu'un :

     public partial class MainRibbonForm : Form
        {
            UserControl uc = null;
            LoginUC lu = new LoginUC();
    
            public MainRibbonForm()
            {
                // Connection TO DB
                AdvensysFactoryLibrary.Factory.CONNECTION_STRING = @"Data Source=dimitri-PC\SQLEXPRESS;Initial Catalog=Resto; Integrated Security=True";
    
                InitializeComponent();
                initialize();
                loadViews();
            }
    
            private void initialize()
            {
                CaisseTab.Visible = false;
                ComptaTab.Visible = false;
                AdminTab.Visible = false;
                StockTab.Visible = false;
            }
    
            private void loadViews()
            {
                lu.ConnectEvent += new connecteDelegate(identification);
                displayUserControl(lu);
            }
    
            private void displayUserControl(UserControl uc)
            {
                UCPanel.Controls.Clear();
                UCPanel.Controls.Add(uc);
                uc.Anchor = AnchorStyles.None;
                uc.Dock = DockStyle.Fill;
            }
    
            public void identification(EmployeeDTO E)
            {
                statutLab.Text = E.nom+ " "+E.prenom;
                CaisseTab.Visible = true;
                this.Refresh();
            }
        }
    Encore un grand merci !

    • Marqué comme réponse paintbox00 mardi 19 février 2013 13:09
    mardi 19 février 2013 13:09

Toutes les réponses

  • Bonjour

    Sur quel ligne de code vous obtenez cette exception ? vous pouvez décrire les propriétés de la classe Employe


    Tawory SOLUTIONS www.tawory.com www.adidov.com said@tawory.com

    lundi 18 février 2013 16:50
  • Bonjour,

    merci pour votre aide.

    L'erreur apparaît ici 

    public virtual void ConnexionBTN_Click(object sender, EventArgs e)
            {
                listEmployee = EmployeeModel.identifyEmployee(UserNameTB.Text, PasswordTB.Text);
                if (listEmployee.Count() > 0)
                {
                    MessageBox.Show("Ok Connecté");
                    foreach (EmployeeDTO emp in listEmployee)
                    {
                        employee = emp;
                    }
                    OnConnect();
                }
                else
                {
                    MessageBox.Show("Pas Connecté");
                }
    
            }

    lorsque j'appelle l'event OnConnect();

    La Class Employe est :

    public class EmployeeDTO
        {
            public int idEmployee { get; set; }
            public string nom { get; set; }
            public string prenom { get; set; }
            public int idFonction { get; set; }
            public int idDroit { get; set; }
            public bool actif { get; set; }
            public string login { get; set; }
            public string password { get; set; }
    
            public EmployeeDTO()
            { 
                this.idEmployee = 0;
                this.nom ="";
                this.prenom = "";
                this.idFonction = 0;
                this.idDroit = 0;
                this.actif = false;
                this.login ="";
                this.password = "";
            }
    Merci

    lundi 18 février 2013 21:42
  • Bonjour

    Pouvez-vous nous montrer le code de la methode : OnConnect


    Tawory SOLUTIONS www.tawory.com www.adidov.com said@tawory.com

    lundi 18 février 2013 23:14
  • Bonjour,

    OnConnect est un event qui se trouve dans ma class LoginUc

    public partial class LoginUC : UserControl
        {
            public delegate void connecte();
            public event connecte OnConnect;
    
            List<EmployeeDTO> listEmployee = new List<EmployeeDTO>();
    
            private EmployeeDTO employee;
    
            public EmployeeDTO Employee
            {
                get { return employee; }
                set { employee = value; }
            }
    
    
            public LoginUC()
            {
                InitializeComponent();
                initialize();
                loadViews();
            }
    
            private void initialize()
            {
            }
    
            private void loadViews()
            {
    
            }
    
    
            public virtual void ConnexionBTN_Click(object sender, EventArgs e)
            {
                listEmployee = EmployeeModel.identifyEmployee(UserNameTB.Text, PasswordTB.Text);
                if (listEmployee.Count() > 0)
                {
                    MessageBox.Show("Ok Connecté");
                    foreach (EmployeeDTO emp in listEmployee)
                    {
                        employee = emp;
                    }
                    OnConnect();
                }
                else
                {
                    MessageBox.Show("Pas Connecté");
                }
    
            }
        }

    Merci

    mardi 19 février 2013 08:10
  • Bonjour,

    1) êtes-vous sûrs qu'il s'agisse de votre event qui est null ? Avez-vous exécuté pas-à-pas le code de connexion pour vérifier quelle variable ou propriété serait null ?

    2) Pour exécuter un évènement par sécurité il est toujours conseillé de passer par une variable intermédiaire et de tester son état null :

    var myEvent = OnConnect;
    if(myEvent!=null){
     myEvent();
    }

    Souvent on place ce code dans une méthode que l'on appelle à chaque besoin.

    Cordialement,


    Yan Grenier

    • Marqué comme réponse paintbox00 mardi 19 février 2013 13:09
    mardi 19 février 2013 08:21
  • Bonjour Yan,

    merci pour votre aide. Oui il semble bien que ce soit mon Event, je vient encore de tester. 

    Lors du clic sur le bouton connection, ceci

    listEmployee = EmployeeModel.identifyEmployee(UserNameTB.Text, PasswordTB.Text);

    me retourne bien 1 employé. et quand je teste mon event il est bien null.

    Entre temps, j'ai modifié mon code qui donne à présent ceci :

    Mon Form principal:

    public partial class MainRibbonForm : Form
        {
            UserControl uc = null;
            LoginUC lu = new LoginUC();
    
            public MainRibbonForm()
            {
                // Connection TO DB
    
                InitializeComponent();
                initialize();
                lu.ConnectEvent += new connecteDelegate(identification);
                loadViews();
            }
    
            private void initialize()
            {
                CaisseTab.Visible = false;
                ComptaTab.Visible = false;
                AdminTab.Visible = false;
                StockTab.Visible = false;
            }
    
            private void loadViews()
            {
                uc = new LoginUC();
                displayUserControl(uc);
            }
    
            private void displayUserControl(UserControl uc)
            {
                UCPanel.Controls.Clear();
                UCPanel.Controls.Add(uc);
                uc.Anchor = AnchorStyles.None;
                uc.Dock = DockStyle.Fill;
            }
    
            public void identification(EmployeeDTO E)
            {
                statutLab.Text = E.nom+ " "+E.prenom;
            }
    
        }

    et mon UserControl  LoginUC:

        public delegate void connecteDelegate(EmployeeDTO emp);
    
        public partial class LoginUC : UserControl
        {
    
            public event connecteDelegate ConnectEvent;
    
            List<EmployeeDTO> listEmployee = new List<EmployeeDTO>();
    
            private EmployeeDTO employee;
    
            public EmployeeDTO Employee
            {
                get { return employee; }
            }
    
    
            public LoginUC()
            {
                InitializeComponent();
                initialize();
                loadViews();
            }
    
            private void initialize()
            {
            }
    
            private void loadViews()
            {
    
            }
    
    
            public virtual void ConnexionBTN_Click(object sender, EventArgs e)
            {
                listEmployee = EmployeeModel.identifyEmployee(UserNameTB.Text, PasswordTB.Text);
                employee = new EmployeeDTO();
                if (listEmployee.Count() > 0)
                {
                    employee = listEmployee[0];
                    if (employee != null)
                    {
                        if (ConnectEvent != null)
                            ConnectEvent(employee);
                    }
                }
                else
                {
                    MessageBox.Show("Pas Connecté");
                }
            }
        }

    Je ne comprends pas la raison pour laquelle cet Event est null. J'ai déjà procédé de la même manière avec des event sur d'autre projets et cela fonctionnait.

    Merci

    mardi 19 février 2013 08:31
  • Je viens de tilter le problème :)

    Vous avez votre champ "lu" qui est initialisé à la création de la classe. Dans votre constructeur vous branchez votre event, puis vous appelez LoadViews qui instancie un nouveau contrôle dans "uc" cette fois. Et c'est "uc" qui est ajouté à votre form principal. Hors "uc" n'a pas d'évent branché donc null.

    Soit vous affectez "lu" à "uc", soit vous branchez votre event sur "uc", mais dans votre cas je soupçonne qu'il s'agisse de la première solution.


    Yan Grenier


    mardi 19 février 2013 08:46
  • C'est exacte, je n'avais pas fait attention à cela. J'ai plusieurs UserControl dans mon Form.

    Merci pour votre aide ! Cela fonctionne !

    Voici le code exacte si cela peut aider quelqu'un :

     public partial class MainRibbonForm : Form
        {
            UserControl uc = null;
            LoginUC lu = new LoginUC();
    
            public MainRibbonForm()
            {
                // Connection TO DB
                AdvensysFactoryLibrary.Factory.CONNECTION_STRING = @"Data Source=dimitri-PC\SQLEXPRESS;Initial Catalog=Resto; Integrated Security=True";
    
                InitializeComponent();
                initialize();
                loadViews();
            }
    
            private void initialize()
            {
                CaisseTab.Visible = false;
                ComptaTab.Visible = false;
                AdminTab.Visible = false;
                StockTab.Visible = false;
            }
    
            private void loadViews()
            {
                lu.ConnectEvent += new connecteDelegate(identification);
                displayUserControl(lu);
            }
    
            private void displayUserControl(UserControl uc)
            {
                UCPanel.Controls.Clear();
                UCPanel.Controls.Add(uc);
                uc.Anchor = AnchorStyles.None;
                uc.Dock = DockStyle.Fill;
            }
    
            public void identification(EmployeeDTO E)
            {
                statutLab.Text = E.nom+ " "+E.prenom;
                CaisseTab.Visible = true;
                this.Refresh();
            }
        }
    Encore un grand merci !

    • Marqué comme réponse paintbox00 mardi 19 février 2013 13:09
    mardi 19 février 2013 13:09