Controle Utilisateur Problème SplitContainer [Résolu]

Messages postés
440
Date d'inscription
samedi 24 mai 2003
Dernière intervention
23 janvier 2011
- - Dernière réponse : scottmat
Messages postés
440
Date d'inscription
samedi 24 mai 2003
Dernière intervention
23 janvier 2011
- 30 mars 2007 à 11:32
Bonjours à tous et à toutes,



J'ai créé un contrôle utilisateur (MyControl) et souhaiterai ré-analyser tous les contrôles provenant de ce moule.



Pour cela ces 2 lignes de code :



foreach (MyControl  oControle in  this.Controls)



            {



                MessageBox.Show(oControle.Name);



            }



Mais j'ai un SplitContainer dans mon projet, enfin ma feuille et il m'affiche cette erreur :



Impossible d'effectuer un cast d'un objet de type 'System.Windows.Forms.SplitContainer' en type 'Projet1.Control'.



Comment puis-je contourner ce problème ? j'ai essayer de me passer du SlipContainer et il me produit la même erreur sur TOUS mes objets qui ne sont pas MyControl  (mon controle quoi)

Je travail la dessus depuis quelques jour maintenant, je précisse que je suis débutant en C# et en création d'objet en .NET

Merci par avance ;)
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
36
3
Merci
Si tu mets ton contrôle dans le SplitContainer c'est donc la liste des contrôles du SplitContainer qu'il faut parcourir..

foreach ( Control c in sc.Panel1.Controls ) // ou Panel2
{
   //   ...
}

Sinon pour parcourir les contrôles récursivement comme le propose Bidou c-à-d parcourir tous les contrôles mêmes ceux imbriqués dans d'autres contrôles tu as ma méthode FindControl

http://www.csharpfr.com/infomsg_WINFORM-CONTROLES-DYNAMIQUES_537180.aspx

ou

this.Control.ControlCollection.Find( key, searchAllChildren );

 

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Lutinore
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
36
0
Merci
Salut,

foreach ( Control c in this.Control )
{
   // ou as
   if ( c is MyControl )
   {
         // ...
   }
}
Commenter la réponse de Lutinore
Messages postés
440
Date d'inscription
samedi 24 mai 2003
Dernière intervention
23 janvier 2011
2
0
Merci
salut,
merci pour ta réponse
mais sa plante directement dans la boucle, donc le code entre les accolades n'a pas le temps de s'executer
Commenter la réponse de scottmat
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
36
0
Merci
Tu as remarqué que j'ai oublié un 's' à this.ControlS' dans le code précédent. :p

Même avec un SplitContainer et ton propre contrôle ça marche :

public partial class Form1 : Form
{
    private class MyControl : Control
    {


    }


    public Form1( )
    {
        InitializeComponent( );


        Button b1 = new Button( );
        b1.Text = "b1";
        b1.Name = "b1";


        Button b2 = new Button( );
        b2.Text = "b2";
        b2.Text = "b2";


        SplitContainer sc = new SplitContainer( );
        sc.Name = "sc";
        sc.Dock = DockStyle.Fill;
        sc.Panel1.BackColor = Color.Aquamarine;
        sc.Panel1.Controls.Add( b1 );
        sc.Panel2.BackColor = Color.Purple;
        sc.Panel2.Controls.Add( b2 );


        MyControl ctrl = new MyControl( );
        ctrl.Name = "ctrl";
        ctrl.Height = 50;
        ctrl.Dock = DockStyle.Bottom;
        ctrl.BackColor = Color.SkyBlue;


        this.Controls.AddRange( new Control[ ] { sc, ctrl } );


        foreach ( Control c in this.Controls )
        {
            if ( c is MyControl )
                MessageBox.Show( c.Name +  " - C'est mon contrôle !!! :D" );
        }
    }
}
Commenter la réponse de Lutinore
Messages postés
440
Date d'inscription
samedi 24 mai 2003
Dernière intervention
23 janvier 2011
2
0
Merci
Merci pour tes réponse,
je regarde ton code depuis tout à l'heure (excuse moi si je pose des questions bète) mais le code ne marche que pour un objet ?
C'est à dire j'ai modifier ton code pour tester et ai créer 2 (ou même 3) controles MyControl
Quand on arriver à la boucle il ne détecte que la dernière créer !
Commenter la réponse de scottmat
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
58
0
Merci
Non, tous les objects de type MyControl qui se trouve dans le Container (dans l'exemple de Lutinore, la form).
Ce code ne cherche pas à l'intérieur des sous-Controls !

<hr />
-Blog-
Commenter la réponse de cs_Bidou
Messages postés
440
Date d'inscription
samedi 24 mai 2003
Dernière intervention
23 janvier 2011
2
0
Merci
alors j'ai bien regarder ! Mais éléments à 'détecter' sont sur un objet (un SplitContainer), c'est peut-être sa qui bloque !
J'ai modifier le code pour reproduire le système de mon application, ce qui donne le code suivant :



public



partial



class



Form1
:

Form



{







private



class



MyControl
:

Button

{


}







public
Form1(){

InitializeComponent();


MyControl
ctrl =

new



MyControl
();ctrl.Name =


"ctrl"
;ctrl.Height = 50;

ctrl.Dock =


DockStyle
.Bottom;ctrl.BackColor =


Color
.SkyBlue;


this
.splitContainer1.Panel2.Controls.AddRange(

new



Control
[] {ctrl});}


private



void
button1_Click(

object
sender,

EventArgs
e){


foreach
(

Control
c

in



this
.Controls){


if
(c

is



MyControl
)


MessageBox
.Show(c.Name +

" - C'est mon contrôle !!! :D"
);}

}

}



J'ai ajouter un button et un SlipContainer1
L'élément MyControl se créer bien dans le slipContainer mais n'est pas détecter
Commenter la réponse de scottmat
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
58
0
Merci
Oui c'est normal, tu dois prendre tous les Controls récursivement, car ils peuvent justement être contenu eux même dans un autre Control (c'est à dire pas directement sur le container principal (la form))

<hr />
-Blog-
Commenter la réponse de cs_Bidou
Messages postés
440
Date d'inscription
samedi 24 mai 2003
Dernière intervention
23 janvier 2011
2
0
Merci
tout simplement parfait ! Merci à vous deux pour votre aide :)
Commenter la réponse de scottmat

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.