Modification de la valeur d'un controle à l'interieur d'un thread

Soyez le premier à donner votre avis sur cette source.

Vue 10 144 fois - Téléchargée 247 fois

Description

Voila je debute en C# je developpe avec visual studio 2005 en .net 2.0 et je me suis bloqué très vite à un problème, je n'arrivé pas à modifier mes champs graphique à l'interieur d'un thread. Grace au site j'ai resolue mon problème avec la fonction "invoke", mais l'utilisation de "invoke" reste malgrès tout assez lourde c pourquoi j'ai voulue automatisé son fonctionnement. Je vous propose un code assez simple qui permet de passé outre l'utilisation d'invoke. N'esité pas à critiqué et me signaler des bugs ou des améliorations cela ne peut être que constructif. d'avance merci.

Source / Exemple :


using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

class Affichage
{

    private FormCollection nbforms;// = Application.OpenForms;

    private delegate void Modifier(Form parm_Form_Name, Control parm_Object_Name, object param, int type_modif);
    private Modifier Obj_Modifier;

    // constructeur
    public Affichage()
    {
        // initialisation du delegué
        nbforms = Application.OpenForms;
        Obj_Modifier = new Modifier(this.Modif);
    }

    #region Fonction lancement
    private void lancement(Object[] OBJ)
    {
        Form Form_Name = ((Form)OBJ[0]);
        Control Object_Name = ((Control)OBJ[1]);
        try
        {
            // test de l'accessibilité de l'objet
            if (Form_Name.Enabled)
                if (Object_Name.Enabled)
                    Form_Name.Invoke(Obj_Modifier, OBJ);
        }
        catch
        {
        }
    }
    #endregion
    #region Remplacement
    public void set(string parm_Form_Name, string parm_Object_Name, object param)
    {
        Form Form_Name = (Form)nbforms[parm_Form_Name];
        Control Object_Name = (Control)nbforms[parm_Form_Name].Controls[parm_Object_Name];

        Object[] OBJ = new Object[4];
        OBJ[0] = Form_Name;
        OBJ[1] = Object_Name;
        OBJ[2] = param;
        OBJ[3] = 1;

        lancement(OBJ);
    }

    public void set(Form parm_Form_Name, Control parm_Object_Name, object param)
    {
        Form Form_Name = parm_Form_Name;
        Control Object_Name = parm_Object_Name;

        Object[] OBJ = new Object[4];
        OBJ[0] = Form_Name;
        OBJ[1] = Object_Name;
        OBJ[2] = param;
        OBJ[3] = 1;

        lancement(OBJ);
    }
    #endregion

    #region ajout
    public void setAd(string parm_Form_Name, string parm_Object_Name, object param)
    {
        Form Form_Name = (Form)nbforms[parm_Form_Name];
        Control Object_Name = (Control)nbforms[parm_Form_Name].Controls[parm_Object_Name];

        Object[] OBJ = new Object[4];
        OBJ[0] = Form_Name;
        OBJ[1] = Object_Name;
        OBJ[2] = param;
        OBJ[3] = 2;

        lancement(OBJ);
    }
    public void setAd(Form parm_Form_Name, Control parm_Object_Name, object param)
    {
        Form Form_Name = (Form)parm_Form_Name;
        Control Object_Name = (Control)parm_Object_Name;

        Object[] OBJ = new Object[4];
        OBJ[0] = Form_Name;
        OBJ[1] = Object_Name;
        OBJ[2] = param;
        OBJ[3] = 2;

        lancement(OBJ);
    }

    #endregion

    #region Suppression
    public void Dele(string parm_Form_Name, string parm_Object_Name)
    {
        Form Form_Name = (Form)nbforms[parm_Form_Name];
        Control Object_Name = (Control)nbforms[parm_Form_Name].Controls[parm_Object_Name];

        Object[] OBJ = new Object[4];
        OBJ[0] = Form_Name;
        OBJ[1] = Object_Name;
        OBJ[2] = null;
        OBJ[3] = 3;

        lancement(OBJ);
    }

    public void Dele(Form parm_Form_Name, Control parm_Object_Name, object param)
    {
        Form Form_Name = (Form)parm_Form_Name;
        Control Object_Name = (Control)parm_Object_Name;

        Object[] OBJ = new Object[4];
        OBJ[0] = Form_Name;
        OBJ[1] = Object_Name;
        OBJ[2] = null;
        OBJ[3] = 3;

        lancement(OBJ);
    }
    #endregion

    #region Fonction de modifiation du champ
    // Fonction de mise à jour
    private void Modif(Form parm_Form_Name, Control parm_Object_Name, object param, int type_modif)
    {
        // declaration d'un objet pour chaque controle des roles
        ListBox pt_ListBox;
        DataGridView pt_DataGridView;
        ComboBox pt_ComboBox;
        TextBox pt_TextBox;

        switch (type_modif)
        {
            // Ajout simple
            case 1:
                //// execution de la commande
                switch (parm_Object_Name.GetType().Name)
                {
                    case "ListBox":
                        pt_ListBox = (ListBox)parm_Object_Name;
                        pt_ListBox.Items.Add(param.ToString());
                        break;
                    case "ComboBox":
                        pt_ComboBox = (ComboBox)parm_Object_Name;
                        pt_ComboBox.Items.Add(param.ToString());
                        break;
                    case "TextBox":
                        pt_TextBox = (TextBox)parm_Object_Name;
                        pt_TextBox.Text = param.ToString();
                        break;
                    case "DataGridView":
                        pt_DataGridView = (DataGridView)parm_Object_Name;
                        pt_DataGridView.Rows.Clear();
                        pt_DataGridView.Rows.Add(param.ToString());
                        break;
                    default:
                        parm_Object_Name.Text = param.ToString();
                        break;
                }
                break;
            // Suppression et ajout remplacement
            case 2:
                //// execution de la commande
                switch (parm_Object_Name.GetType().Name)
                {
                    case "ListBox":
                        pt_ListBox = (ListBox)parm_Object_Name;
                        pt_ListBox.Items.Add(param);
                        break;
                    case "ComboBox":
                        pt_ComboBox = (ComboBox)parm_Object_Name;
                        pt_ComboBox.Items.Add(param);
                        break;
                    case "TextBox":
                        pt_TextBox = (TextBox)parm_Object_Name;
                        pt_TextBox.Text += param.ToString();
                        break;
                    case "DataGridView":
                        pt_DataGridView = (DataGridView)parm_Object_Name;
                        //pt_DataGridView.Rows.Clear();
                        pt_DataGridView.Rows.Add((object[])param);
                        break;
                    default:
                        parm_Object_Name.Text += param.ToString();
                        break;
                }
                break;
            // Suppression
            case 3:
                //// execution de la commande
                switch (parm_Object_Name.GetType().Name)
                {
                    case "ListBox":
                        pt_ListBox = (ListBox)parm_Object_Name;
                        pt_ListBox.Items.Clear();
                        break;
                    case "ComboBox":
                        pt_ComboBox = (ComboBox)parm_Object_Name;
                        pt_ComboBox.Items.Clear();
                        break;
                    case "TextBox":
                        pt_TextBox = (TextBox)parm_Object_Name;
                        pt_TextBox.Text = "";
                        break;
                    case "DataGridView":
                        pt_DataGridView = (DataGridView)parm_Object_Name;
                        pt_DataGridView.Rows.Clear();
                        break;
                    default:
                        parm_Object_Name.Text = "";
                        break;
                }
                break;
        }
    }
    #endregion
}

Conclusion :


pour utliser cette classe l'utilisation reste je pense assez simple.

declaration d'un objet.
exemple :
Affichage pt_Affichage = new Affichage();

et utilisation de la fonction set avec les parametres suivant
("nom de la fenetre","nom du champ","texte a ajouter")
exemple :
pt_Affichage.set("Form1", "listBox_Historique", "coucou");

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
Mouis, cette solution n'est effectivement pas très viable. Pour le Cross-Threading, lire le très bon tutorial fait par Mx : http://www.csharpfr.com/tutoriaux/CSHARP-OPERATIONS-CROSS-THREADS-UTILISATION-DELEGATIONS-SYNCHRONES-ASYNCHRONES_174.aspx
Messages postés
38
Date d'inscription
vendredi 24 novembre 2000
Statut
Membre
Dernière intervention
9 octobre 2008

Bonjour comme le dit Nikoui cela n'est pas facil a faire, ce que je te propose est de rajouter un peu de réflection et au lieu de passer du string passe un objet et avec la réflexion il devient facil de savoir quel objet et de retrouver la propriété passer en parametre ce qu'il te permetra de changer n'importe quel propriété sur n'importe quel control .
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Dans ton exemple, tu founit le code pour modifier la propriété Text d'une ListBox et d'un Text. Au fur et à mesure, tu aura a gérer d'autre composants, et d'autre propriétés pour chacun de ces composants... je ne sais pas si tu images ce que ton code va donner...

L'idée d'automatiser un peu la solution au cross thread calls est une très bonne idée (c'est vrai que c'est #%*$@ c'est histoire). Par contre je ne pense pas que ta méthode soit viable...
Messages postés
514
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
1 mars 2009

Merci !
J'ai eu exactement le même problème et je suis passé par l'objet BackGroudWorker. J'attends aussi des commentaires de membres plus experimentés pour voir si ta méthode est bonne ... Ou pas !
++ !
L.S.

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.