begin process at 2010 02 10 00:06:52
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > MODIFICATION DE LA VALEUR D'UN CONTROLE À L'INTERIEUR D'UN THREAD

MODIFICATION DE LA VALEUR D'UN CONTROLE À L'INTERIEUR D'UN THREAD


 Information sur la source

Note :
Aucune note
Catégorie :Divers Source .NET ( DotNet ) Classé sous :thread, affichage, invoke, controle Niveau :Débutant Date de création :12/04/2006 Date de mise à jour :29/11/2006 15:56:27 Vu / téléchargé :7 886 / 179

Auteur : bestouinouin

Ecrire un message privé
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 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

  • 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
  • }
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");

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

17 avril 2006 10:45:30 :
oubli au niveau de l'utilisation. Ne pas oublier de changer le namespace par celui de l'application...
29 novembre 2006 15:55:03 :
J'ai moi même été vite bloqué, et comme je travaille sur pas mal de source je ne prends pas trop le temps faire avancer celle-ci et j'en suis désolé. J'ai modifier la source pour que l'on puisse l'utiliser plus facilement. Si quelqu'un a une meilleur solution, merci de faire avancé le code.
29 novembre 2006 15:56:27 :
erreur de manip ;-)

 Sources du même auteur

Source avec Zip Source .NET (Dotnet) ANCRAGE DE FENÊTRE
Source avec Zip Source .NET (Dotnet) SERVEUR MULTI CLIENT TRÈS SIMPLE

 Sources de la même categorie

Source avec une capture TOOLTIP TEXT POUR LA LISTE DÉROULANTE D'UN COMBOBOX par whismeril
Source avec Zip Source avec une capture Source .NET (Dotnet) LOGIN (XML) par DanMor498
Source .NET (Dotnet) WEBTESTPLUGIN - IGNORER DES URLS LORS D'UN TEST WEB VISUAL S... par jesusonline
Source avec Zip Source avec une capture Source .NET (Dotnet) EXERCICE DE CALCUL MENTAL par Sat7121
Source avec Zip Source avec une capture Source .NET (Dotnet) TRADUCTEUR ALGO VISUAL BASIC .NET/C# par rhonin33

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) THREADER SIMPLEMENT UNE CLASSE POUR INTERAGIR AVEC UNE FORM par Yxion
Source avec Zip Source avec une capture Source .NET (Dotnet) THREAD ET PROGRESSBAR - EXEMPLE SIMPLE par MorpionMx
Source avec Zip Source .NET (Dotnet) MODIFIER UN CONTROLE DEPUIS UN THREAD par bob94700
Source .NET (Dotnet) BARRE DE STATUT ET DE PROGRESSION COMPATIBLE MULTITHREAD par cendretp
Source .NET (Dotnet) EXEMPLE D'UTILISATION DE CONTROL.INVOKE par coq

Commentaires et avis

Commentaire de LocalStone le 12/04/2006 20:50:59

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.

Commentaire de Nikoui le 13/04/2006 13:55:14

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...

Commentaire de pc152 le 21/04/2006 09:49:59

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 .

Commentaire de Bidou le 03/12/2006 21:40:52 administrateur CS

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Pb d'affichage de fenetre et thread... [ par bigflo ] Salut,Je developpe un client de tchat en c#.Mais j'ai quelque pb d'affichage des fenetres de tchat. Explication:Bon, j'ai une treeview et lorsque je d Questions sur les threads + Au Secours point d'exclamation [ par emmanuel9 ] Bonjour à tous, En faite ma question serait sur le threads : J'ai cette fonction ci qui me sert à afficher un listview et une progressbar Diificulté d'affichage d'un control personnalisé [ par z_san ] bonjourvoilà j'ai un ptit soucis avec un controle que je crée en ce moment, le controle et un graph qui affiche de chronogrammes en tps réel, j'ai dés Thread probleme d'acces a des controles [ par warenbe ] Yop j'ai un probleme j'ai une fonction quia une boucle qui dure treeeeeeeeeeeeees longtemps (quelques milliers d'entree a verifier une par une et c'es Equivalent à Control.Invoke? [ par leprov ] Existe-t-il un équivalent à la méthode control.invoke qui aie la meme fonctionnalité, mais lorsque l'on ne dispose pas d'un controle? c'est plus une c Actualiser l'affichage d'un gif [ par aymeric08 ] Bonjour,Mon programme en C# réalise une copie de fichier du disque dur sur une clé USB. Pendant ce temps j'aimerai afficher un gif animé pour faire pa Ajout d'un contrôle depuis un thread en utilisant Invoke... [ par gazous ] Bonjour,Je vous contacte car j'ai vu que vous étiez assez calé en dll.Mon problème :J'ai un thread qui essaye d'ajouter un contrôle dans un panel char Affichage d'une FORM dans un autre THREAD [ par dhofer ] Salut,Je ne trouve pas comment faire pour afficher une autre FORM contenant un progressbar pour faire patenter les utilisateur pendant l'extraction de Controle Utilisateur Problème SplitContainer [ par scottmat ] Bonjours à tous et à toutes, J'ai créé un contrôle utilisateu Affichage système [ par pitch6969 ] bonjour,je souhaiterairécupérer le type d'affichage système en c# :exemple : Windows Standard soit Windows Classique.Est ce que quelqu'un aurait une i


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales